Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki WIET
Transkrypt
Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki WIET
Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki WIET Laboratorium mikrokontrolerów Ćwiczenie 3 Fast GPIO, magistrale i zegar Autor: Paweł Russek http://www.fpga.agh.edu.pl/pm ver. 9.11.16 1/12 1. Cel ćwiczenia Celem tego ćwiczenia jest zapoznanie studenta z budową i celem stosowania architektury wielomagistralowej mikrokontrolerów z rodziny Kinetis L. Zalety tej architektury zostaną zaprezentowane poprzez porównanie modułów peryferyjnych GPIO i Fast GPIO. Następnie student zapozna się ze sposobem użytkowania wielofunkcyjnego urządzenia laboratoryjnego Analog Discovery. Urządzenie Analog Discovery pozwala na pomiary wartości analogowych i cyfrowych, wizualizację i zapis mierzonych wartości, oraz generowanie zaprogramowanych przebiegów. Na zakończenie student dokona pomiarów mocy elektrycznej i wydajności mikrokontrolerów w różnych trybach konfiguracji zegara systemowego i dla różnych modułów peryferyjnych GPIO. 2. Moduł Fast GPIO Architektura układów ARM składa się z dwóch magistral: APB (Advanced Peripheral Bus) i AHB (Advanced High-Performance Bus). Magistrala AHB jest znacznie szybsza od magistrali APB, ponieważ pozwala CPU na wykonanie cyklu dostępu (zapisu/odczytu) do modułów peryferyjnych w jednym cyklu zegara. Magistrala APB jest wolniejsza i potrzebuje na dostęp dwóch cykli zegara. Magistrala AHB jest bezpośrednio podłączona do CPU, a APB jest połączone z CPU poprzez AHB (patrz rys. poniżej). Schemat blokowy architektury Cortex-M0 wraz z modułami Fast GPIO (Low Latency GPIO), oraz magistralami AHB i APB W Kinetis L każdy z portów we/wy (Porty A-E) posiada dwa modułu poprzez które można się do niego odwoływać. Jeden moduł jest adresowany, jak pozostałe urządzenia peryferyjne, poprzez APB, a drugi przez AHB. 2/12 Zauważ, że w dokumentacji moduły, które są odpowiedzialne za dostęp do GPIO poprzez magistralę AHB są nazwane FGPIO (Fast GPIO). Port A jest nazywany FGPIOA, port B to FGPIOB itd. W nagłówku MKL25Z4.h nazwy odpowiednich struktur to FPTA, FPTB, FPTC, FPTD i FPTE. Ważnym praktycznym wnioskiem, który można wysnuć z tego paragrafu instrukcji jest to, że w prosty sposób można przyśpieszyć działanie aplikacji na Kineti L poprzez prostą zmianę nazw PTAx na FPTAx w kodzie programu. Ćwiczenie 2.1 Wyszukaj adresy bazowe modułów FAST GPIOx w nagłówku “MKL25Z4.h” FPTA FPTB FPTC FPTD FPTE 3. Zegar systemowy, a wydajność mikrokontrolera Typowo zegar systemowy mikrokontrolera może być generowany na kilku rożnych sposobów. Źródłem zegara mogą być: • wewnętrzny oscylator RC, który dostarcza sygnału o nieprecyzyjnej i niestabilnej częstotliwości, ale nie wymaga żadnych elementów zewnętrznych, • zewnętrzny oscylator kwarcowy, który oferuje bardzo stabilną i precyzyjną częstotliwość, ale jest rozwiązaniem drogim (w szczególności przy częstotliwościach w okolicy 100 MHz), • wewnętrzna pętla fazowa PLL, która jest kompromisowym rozwiązaniem wobec bardzo taniego oscylatora RC i kwarcu o bardzo dobrych parametrach. W tym rozwiązaniu stosuje się niedrogi kwarc jako źródło sygnału o niskiej częstotliwości, który jest następnie powielany za pomocą pętli fazowej. To rozwiązanie jest szeroko stosowane w systemach mikroprocesorowych pracujących z częstotliwościami ponad 20 MHz. Dodatkową zaletą jest to, że PLL pozwala na programowanie wartości częstotliwości zegara. Dzięki temu, można na przykład stosować szybki zegar podczas wykonywania złożonych obliczeniowo zadań, a zegar powolny kiedy można oszczędzać energię. Mikrokontroler na płytce FRDM-KL25Z jest wyposażony w kwarc o częstotliwości 8 MHz, co umożliwia programowanie zegara systemowego na kilka sposobów. Kiedy programista tworzy nowy projekt w Keil uVision5 system automatycznie dodaje kod startowy, który jest wykonywany po uruchomieniu mikrokontrolera, zanim jeszcze zostanie uruchomiona funkcja „main()”. Częścią kodu startowego jest opisana w pliku „system_MKL25Z4.c”. Plik nagłówkowy „system_MKL25Z4.h” udostępnia rożne tryby konfiguracji zegara poprzez definicję symbolu „CLOCK_MODE”. 3/12 CLOCK_SETUP MODE Reference clock CPU clock Bus clock 0 FLL Engaged Internal mode (FEI) 32 kHz Slow Internal Reference Clock 20.97152 MHz 20.97152 MHz 1 (Max. clock freq.) PLL Engaged External (PEE) External crystal 8 MHz 48 MHz 24 MHz 2 Bypassed Low Power Internal (BLPI) 4 MHz Fast Internal Reference Clock 4 MHz 0.8 MHz 3 Bypassed Low Power External (BLPE) External External crystal 8 MHz 4 MHz 1 MHz Jako domyślny jest ustawiony tryb 0, ale można także wybrać inny tryb zmieniając wartość definicji #define CLOCK_SETUP w pliku „system_MKL25Z4.h”. Wydajność mikrokontrolera zależy od częstotliwości zegara systemowego oraz od pracy kompilatora. Kiedy mikrokontroler współpracuje z urządzeniami peryferyjnymi szybkość pracy zależy również od szybkości magistrali systemowej. W tym ćwiczeniu kompilatorem nie będzie my się zajmować, zbadamy natomiast wpływ zegara. 4. Analog Discovery Urządzenie wielofunkcyjne Analog Discovery firmy Digilent pozwala na przeprowadzanie pomiarów, wizualizację wyników, generowanie przebiegów, zapisywanie zebranych danych i kontrolowanie urządzeń analogowych i cyfrowych różnego rodzaju. Urządzenie jest małe, ale oferuje ogromne możliwości studentom, którzy chcą samodzielnie eksperymentować z układami elektronicznymi. Wejścia analogowe i cyfrowe mogą być podłączane za pomocą krótkich uniwersalnych przewodów, które można łatwo podłączyć do złącz typu „goldpin”. Komputer PC współpracuje z Analog Discovery za pomocą złącza USB i jest kontrolowany poprzez oprogramowanie WaveForm 2015. WaveForm pozwala na konfigurację urządzenia i prowadzenie eksperymentów. 4/12 Najprostszą metodą korzystania z Analog Discovery jest użycie aplikacji WaveForm. Aplikację należy uruchomić, kiedy urządzenie jest już podpięte do złącza USB komputera. WaveForm automatycznie wykryje urządzenie i się skonfiguruje. Jeżeli uruchomienie przebiegnie poprawnie, to w głównym oknie aplikacji, w pasku statusu po prawej stronie, pojawi się numer seryjny Analog Discovery. 5. Pomiar zużycia energii na płytce FRDM-25Z Złącze J4 na płytce FRDM-KL25Z umożliwia wygodne przeprowadzenie pomiaru prądu pobieranego przez mikrokontroler, a pośrednio także wartości rozpraszanej mocy. 5/12 Pomiar spadek napięcia na zworze J4 jest proporcjonalny do prądu pobieranego przez mikrokontoler. Opornik połączony równolegle do zwory J4 to 10 ohm. Ćwiczenie 5.1 Zapisz wzór na moc rozpraszaną przez mikrokontroler w funkcji napięcia na zworze J4. P(UJ4)=??? 6. Wydajność mikrokontrolera, czas odpowiedzi i moc. W następnym ćwiczeniu zbadamy jak zmienia się wydajność mikrokontrolera. Będziemy mierzyć czas odpowiedzi mikrokontrolera w różnych konfiguracjach częstotliwości zegara. Mikrokontroler będzie wykonywał aplikację, która będzie sprawdzała stan logiczny na jednym z wejść GPIO. W momencie zmiany stanu wejścia z poziomu niskiego na wysoki, aplikacja wykona zmianę stanu na innym wyjściu GPIO. Jako wejście użyjemy pin 0 portu D, a jako wyjście pin 0 portu B. Mierzony czas odpowiedzi to czas pomiędzy zmianą sygnału na wejściu i wyjściu układu. Ćwiczenie 6.1 1. Podłącz FRDM-25Z do Analog Discovery 2 zgodnie z diagramem 2. Uruchom “WaveForms” i skonfiguruj Analog Discovery. 2A. Ustaw przebieg prostokątny na wyjściu cyfrowym IO1 (podłączone do PTD0). • Kliknij “Patterns” w głównym oknie. 6/12 • Wybierz “Add channels->Signal->DIO1” i kliknij “Add” (Uwaga: Na rysunku pokazano DIO0.) • Aby skonfigurować dodane wyjście kliknij ikonę w polu IO sygnału DIO1. Następnie w oknie „Edit” wybierz „Clock” w polu „Type” i “10 kHz” w polu „Frequency”. Kliknij „Close” 7/12 • Na końcu kliknij przycisk „Run”, aby uruchomić przebieg prostokątny na wyjściu DIO1. 2B. Skonfiguruj podgląd stanów logicznych na wejściach cyfrowych IO0 i IO1 (podłączone do PTB0 i PTD0). • Wybierz “Logic” w oknie “Welcome”. • Wybierz “Add channels->Signal->DIO0” i kliknij “Add” 8/12 • Powtórz procedurę dodanie sygnału dla sygnału DIO1. 3B. Aby dokonać pomiaru różnicowego na zworze J4, skonfiguruj oscyloskop • Wybierz okno “Welcome” i kliknij przycisk “Scope”. • Wybierz „Channel 1” i ustaw wzmocnienie sygnału wejściowego w polu „Range” na “20mV/div”. Uwaga. Podczas wykonywania ćwiczenia dobieraj wartość wzmocnienia w taki sposób 9/12 aby maksymalnie wzmocnić sygnał i aby pomiar był możliwie najdokładniejszy. 3. Według kodu podanego poniżej, uruchom aplikację na płytce FRDM-25Z. /*----------------------------------------------------------------------------* Name: main.c * Purpose: Toggling_LEDs application * Author: Student *----------------------------------------------------------------------------*/ #include "MKL25Z4.h" /*Device header*/ #define LED_1 #define SW_1 0 0 int main() { //Enable clock for Port B and Port D SIM->SCGC5|=SIM_SCGC5_PORTB(1)|SIM_SCGC5_PORTD(1); //Configure Port B pin 0 as GPIO, Output PORTB->PCR[LED_1]|=PORT_PCR_MUX(1); PTB->PDDR|=(1<<LED_1); //Configure Port D pin 0 as GPIO, Input, Pull-up resistor PORTD->PCR[SW_1]|=PORT_PCR_MUX(1) | PORT_PCR_PE(1) | PORT_PCR_PS(0); PTD->PDDR&=~(1<<SW_1); while(1){ if( (PTD->PDIR & (1<<SW_1))==0){ if(PTB->PDOR & (1<<LED_1)) PTB->PDOR&=~(1<<LED_1); else 10/12 FPTB->PDOR|=(1<<LED_1); while((PTD->PDIR & (1<<SW_1))==0); //Wait for SW_1 release } } } 4. Uruchom pomiar poprzez naciśnięcie przycisku “Single” w zakładce “Logic”. Pamiętaj, aby dostosować ustawienie szybkości próbkowania w polu 'Base” w taki sposób, aby najlepiej odpowiadała ona spodziewanemu opóźnieniu. Wartość przedstawiona na rysunku poniżej jest jedynie orientacyjna. Na podstawie uzyskanego przebiegu odczytaj opóźnienie. 5. Oblicz moc mikrokontrolera na podstawie odczytu napięcia na zworze J4 w oknie „Scope”. 6. Zmień konfigurację “system_MKL25Z.h”. zegara poprzez edycję definicji CLOCK_MODE w pliku #define CLOCK_SETUP 1 /* Define clock source values */ #define CPU_XTAL_CLK_HZ oscillator clock frequency in Hz */ #define CPU_INT_SLOW_CLK_HZ clock frequency in Hz */ #define CPU_INT_FAST_CLK_HZ clock frequency in Hz */ 8000000u /* Value of the external crystal or 32768u /* Value of the slow internal oscillator 4000000u /* Value of the fast internal oscillator /* RTC oscillator setting */ /* Low power mode enable */ /* SMC_PMPROT: AVLP=1,ALLS=1,AVLLS=1 */ 11/12 #define SYSTEM_SMC_PMPROT_VALUE 0x2AU /* Internal reference clock trim */ /* #undef SLOW_TRIM_ADDRESS */ Commented out for MISRA compliance. */ /* #undef SLOW_FINE_TRIM_ADDRESS */ Commented out for MISRA compliance. */ /* #undef FAST_TRIM_ADDRESS */ out for MISRA compliance. */ /* #undef FAST_FINE_TRIM_ADDRESS */ Commented out for MISRA compliance. */ /* SMC_PMPROT */ /* Slow oscillator not trimmed. /* Slow oscillator not trimmed. /* Fast oscillator not trimmed. Commented /* Fast oscillator not trimmed. #ifdef CLOCK_SETUP #if (CLOCK_SETUP == 0) #define DEFAULT_SYSTEM_CLOCK 20971520u /* Default System clock value */ #define MCG_MODE MCG_MODE_FEI /* Clock generator mode */ /* MCG_C1: CLKS=0,FRDIV=0,IREFS=1,IRCLKEN=1,IREFSTEN=0 */ 6. Zamiast GPIO użyj Fast GPIO. W tym celu zmień PTB na FPTB i PTD na FPTD w kodzie programu. 7. Powtarzaj czynności 4-6 tak aby wypełnić tablę poniżej. MODE 0 CPU Frequency Bus Frequency Port type GPIO Fast GPIO 1 2 GPIO Fast GPIO GPIO Fast GPIO 12/12 Response time Power