Akademia Górniczo Hutnicza im. Stanisława Staszica w Krakowie Wydział IEiT Katedra Elektroniki TECHNIKA MIKROPROCESOROWA II LAB 1 Wprowadzenie do środowiska Keil i rodziny Kinetis Sebastian Koryciak http://www.fpga.agh.edu.pl/tm2 01.10.2015
1 WSTĘP 1.1 CEL Niniejsze ćwiczenie ma na celu przeprowadzenie Uczestników laboratorium przez utworzenie pierwszego projektu w środowisku uvision. Na początku przedstawiono krótko charakterystykę zestawu FRDM-KL46Z, a następnie etapy tworzenia, programowania, debugowania (w zakresie podstawowym) i symulowania programu napisanego w języku C. 1.2 WYMAGANIA Sprzętowe: komputer klasy PC spełniający wymagania sprzętowe aplikacji KEIL v5, zestaw FRDM-KL46Z Programowe: system operacyjny Windows XP lub wyższy środowisko Keil / uvision 5 Doświadczenie: podstawowa umiejętność obsługi komputera klasy PC, podstawowa znajomość systemów operacyjnych rodziny Windows, podstawowa znajomość zagadnień z Techniki Mikroprocesorowej 1 podstawowa znajomość zagadnień z Techniki Cyfrowej
2 PLATFORMA SPRZĘTOWA ZESTAW FRMD-KL46Z Firma Freescale zaprojektowała i wyprodukowała serię zestawów wyposażonych w nowoczesne mikrokontrolery z rdzeniem ARM Cortex-M0+ o zróżnicowanych możliwościach. Odpowiednio do możliwości zastosowanego mikrokontrolera dobrano moduły peryferyjne zamontowane na płytce drukowanej zestawu. Zestaw FRDM-KL46Z jest wyposażony w mikrokontroler KL. Należy on do rodziny Kinetis KL4 z 32-bitowym rdzeniem Cortex-M0+. Na płytce znajdziemy: 32 bitowy mikrokontroler MKL46Z356VLLZ4 z rodziny Kinetis L zawierający: o 256 kb pamięci Flash, o 32 kb pamięci SRAM, o Maksymalna częstotliwość taktowania rdzenia: 48 MHz, o Zegar RTC, o Układ Watchdog, o DMA, o 12-bitowy DAC, o 16-bitowy SAR ADC, o Kontroler USB Full Speed, o Niskonapięciowy moduł UART, o 2 standardowe moduły UART, o 2 moduły I2C, o moduł I2S, o 2 moduły SPI, OpenSDA, Dotykowy slider pojemnościowy, 4 cyfrowy wyświetlacz LCD segmentowy Akcelerometr MMA8451Q, Magnetometr MAG3110, 2 diody LED, 2 przyciski, Czujnik światła, Przycisk Reset
3 ŚRODOWISKO KEIL PIERWSZE URUCHOMIENIE Program uvision 5 jest środowiskiem stworzonym przez firmę Keil (ARM) przeznaczonym do programowania i debugowania mikrokontrolerów opartych o architekturę ARM. 3.1 ZADANIE Proszę upewnić się, czy oprogramowanie jest zainstalowane. Jeżeli ikona Keil uvision5 nie znajduje się ani na pulpicie, ani w Menu Start proszę otworzyć instrukcję PRE LAB i postępować zgodnie z punktem drugim. 3.2 ZADANIE Proszę uruchomić aplikację uvision 5 i stworzyć projekt w języku C. 1. Proszę dwukrotnie kliknąć na ikonę znajdującą się zarówno na pulpicie jak i w Menu Start systemu. 2. Z menu aplikacji proszę wybrać Project > New uvision Project 3. Następnie proszę wskazać ścieżkę dostępu do nowo tworzonego projektu, który nazwiemy hello_world\project (np. C:\MDK-ARM\sr_1115_4\hello_world\project.uvproj) UWAGA! Wszystkie projekty stworzone w laboratorium muszą znajdować się w folderze C:\MDK- ARM\x_y_z\ gdzie x to dzień zajęć (po / wt / sr / cz / pt), y to godzina zajęć (1100 / 1230 / ), a z to numer zespołu dwuosobowego 4. Kolejnym krokiem jest wybór mikrokontrolera na którym będziemy pracować. Zgodnie z opisem umieszczonym w punkcie 2 niniejszej instrukcji wyszukujemy MKL46Z256xxx4
5. Nowo otwarte okno służy do wyboru bibliotek. Do tworzonego projektu będziemy potrzebowali: CMSIS > CORE, oraz Device > Startup 6. W ten sposób stworzony projekt powinien wyglądać zgodnie z poniższym oknem.
A B 7. Pierwsze kosmetyczne poprawki będą dotyczyły nazw katalogów. Nazwę Target1 (A) zmieniamy na CMSIS-DAP, natomiast Source Group 1 (B) na src. Następnie klikając prawym przyciskiem myszy na folder src wybieramy opcję Add New Item to Group src. 8. W nowo otwartym oknie wybieramy język C, oraz przypisujemy nazwę pliku main
3.3 ZADANIE Proszę stworzyć swój pierwszy program dodając następującą treść do pliku main.c: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. #include "MKL46Z4.h" #define GreenLED 0 const uint32_t MaskLED[] = {1UL << 5}; void InitLED(void){ SIM->SCGC5 = SIM_SCGC5_PORTD_MASK; PORTD->PCR[5] = PORT_PCR_MUX(1UL); PTD->PDDR = MaskLED[GreenLED]; } void BlinkLED(void){ uint32_t i = 0; } PTD->PTOR = MaskLED[GreenLED]; for(i = 0; i < 3000000; i++){}; int main(void){ InitLED(); } while(1){ BlinkLED(); } Program zawsze rozpoczynamy od załączonych plików nagłówkowych. W tym przypadku dodajemy jedynie nagłówek zawierający nazwy rejestrów oraz masek pozwalających w intuicyjny sposób korzystanie z tych rejestrów. Jeżeli chcemy obejrzeć zawartość dokumentu wystarczy prawym przyciskiem myszy nacisnąć na nazwę nagłówka w treści pliku main, a następnie wybrać opcję Open Document <MKL46Z.H>. Maski są stworzone zgodnie z nomenklaturą zastosowaną w głównym Reference Manual dla KL46: CHAPTER NAME _ REGISTER NAME _ BIT NAME _MASK.
W drugiej kolejności zdefiniowana jest dioda LED zielona, jako odnośnik do maski, stworzonej w kolejnej linii kodu. Program napisany jest w sposób modułowy, dlatego możemy wyróżnić następujące: InitLED, BlinkLED, main. InitLED to funkcja mająca na celu inicjalizację portów GPIO (General Purpose Input Output). Aby poprawnie skonfigurować taki port należy zmodyfikować następujące rejestry: System Integration Module (SIM) rejestr dający kontrolę nad podawaniem zegara peryferiom. W momencie kiedy zegar nie jest podłączony oszczędzamy energię, ale i nie możemy używać danego peryferia. o System Clock Gating Control Register 5 (SIM_SCGC5) rejestr odpowiedzialny za taktowanie portów. Aby korzystać z jakiegokolwiek pinu musimy aktywować dany port (w naszym przypadku port D) Port Control and Interrupts (PORT) ten rejestr decyduje o tym które piny są wykorzystywane dla danych peryferiów (strona 172 KL46_RM) o Pin Control Register (PORTD_PCR5) ustawienie na multiplekserze funkcji, którą będzie pełnił dany pin; będziemy wykorzystywać pin numer 5 portu D do sterowania zieloną diodą LED General Purpose Input Output (GPIO) jeżeli dany pin został skonfigurowany jako GPIO należy określić czy jest wejściem czy wyjściem z system o Port Data Direction Register (GPIO_PDDR) 1 = output, 0 = input o Port Data Output Register (GPIO_PDOR) zmiana wartości pinu o Port Data Set Register (GPIO_PSOR) ustawienie pinu na wartość 1 o Port Data Clear Register (GPIO_PCOR) ustawienie pinu na wartość 0 o Port Data Toggle Register (GPIO_PTOR) zmiana wartości na przeciwną niż aktualna o Port Data Input Register (GPIO_PDIR) odczyt wartości z pinu w przypadku wejścia BlinkLED to funkcja implementująca na jeden z wielu sposobów miganie diodą. Wykorzystany został rejestr GPIO_PTOR. Main to funkcja główna, która uruchamia inicjalizację portów GPIO, a następnie miga diodą w pętli. 3.4 ZADANIE Na podstawie powyższego opisu funkcjonalności programu proszę dopisać odpowiednie komentarze do pliku main.c. W jakim celu w liniach 7 i 9 zastosowano znak =? 3.5 ZADANIE Uruchomienie aplikacji na zestawie FRDM-KL46Z: UWAGA! Na tym etapie należy się upewnić, czy zostały na danym zestawie zainstalowane sterowniki CMSIS. Proszę wrócić do instrukcji PRE LAB i wykonać czynności z ostatniego punktu. 1. Po uzupełnieniu zawartości pliku main.c proszę zbudować projekt. Robimy to wybierając z menu Project > Build Target, bądź też przyciskając klawisz F7.
2. Następnie jednorazowo należy skonfigurować opcje debugera. W tym celu klikamy na ikonę Options for Target 3. W nowo otwartym oknie wybieramy zakładkę Debug, a w niej w opcji Use odnajdujemy CMSIS-DAP Debugger. 4. Następnie klikamy na Settings, a tam w opcji Port wybieramy SW. 5. Dodatkowo w zakładce Flash Download zaznaczamy opcję Reset and Run
6. Po aktualizacji wszystkich ustawień w głównym programie, w pasku narzędzi klikamy na Flash > Download (lub ikona ). 3.6 ZADANIE Przy programowaniu niezbędną funkcją jest możliwość debugowania kodu. Dlatego też teraz sprawdzimy jak działa nasz pierwszy program. UWAGA! W trakcie gdy debugujemy lub symulujemy nasz program nie można zamykać okien z plikami, które są otwarte w tej perspektywie. Ich zamknięcie grozi zawieszeniem programu. 1. W pliku main.c proszę najechać kursorem na linię kodu w której następuje zmiana wartości pinu 5 portu D (PTD->PTOR), a następnie nacisnąć F9 (można też nacisnąć ikonę w postaci czerwonej kulki). W ten sposób do kodu wstawiliśmy tzw. Breakpoint 2. Następnie w celu rozpoczęcia sesji debugowania proszę nacisnąć kombinację klawiszy Ctrl+F5 lub ikonę oznaczoną symbolem (W przypadku korzystania z wersji ewaluacyjnej / darmowej pojawi się informacja o ograniczonej ilości kodu) 3. Proszę otworzyć zawartość portów GPIO: Peripherals > System Viewer > GPIO > PTD 4. Proszę parokrotnie nacisnąć klawisz F5 i sprawdzić jakie zmiany następują w poszczególnych rejestrach. 5. Wychodzimy z perspektywy debugowania drugi raz klikając na ikonę d, lub za pomocą kombinacji Ctrl+F5 3.7 ZADANIE Często nie mamy dostępu do sprzętu w momencie pisania oprogramowania. W takich momentach przydaje się symulator. 1. Aby uruchomić symulator należy wejść do konfiguracji debugera, czyli 2. Następnie w zakładce Debug wybieramy Use Simulator (A).
A C B 3. Obok okienka zatytułowanego Initialization File klikamy na ikonę trzech kropek (B), wpisujemy nazwę init i ją zatwierdzamy przyciskiem Open. Program zapyta czy utworzyć plik o tej nazwie, co akceptujemy. 4. Nowo stworzony plik inicjalizacyjny należy zmodyfikować. Dlatego też otwieramy go przyciskiem Edit (C). Okno Options of Target możemy już zamknąć przyciskiem OK. 5. Do pliku init.ini wpisujemy: 1. MAP 0x40000000, 0x400FFFFF read write 6. Zawartość pliku należy zapisać, a następnie zlokalizować i otworzyć plik system_mkl46z.c (znajdziemy go w oknie Project, w pakiecie Device) 7. W otwartym pliku systemowym lokalizujemy i komentujemy (dopisujemy na początku każdej linii znaki //) następujące linie kodu: 124. 125. 126. 127. while((mcg->s & MCG_S_IREFST_MASK) == 0x00U) { /* Check that the source of the. } while((mcg->s & 0x0CU)!= 0x00U) { /* Wait until output of the FLL is selected */ } 8. Całość zapisujemy i budujemy projekt (skrót klawiszowy F7) 9. Następnie proszę o wykonanie tych samych kroków co w zadaniu 3.6
4 ZADANIE DOMOWE W celu przećwiczenia ustawiania partów, proszę zmodyfikować program main zgodnie z następującymi punktami: 1. Proszę dodać obsługę diody czerwonej (User Manual zestawu FRDM-KL46Z) z zastosowaniem masek (proszę odpowiednio zmodyfikować istniejącą maskę) 2. Proszę dodać funkcję migania diody czerwonej z inną częstotliwością niż dioda zielona, oraz stosując inny rejestr/rejestry niż GPIO_PTOR 3. Wszystkie polecenia proszę zasymulować