Metody pracy i praktyczne zastosowanie mikrokontrolera MCF5234 Jan Poniatowski, 171751 (ARR) Michalina Kuczyńska, 171564 (ARR 11 czerwca 2011 Politechnika Wrocławska Wydział Elektroniki Sterowniki Robotów 1
Spis treści 1 Wstęp 3 2 Instalacja środowiska CodeWarrior 3 2.1 Podstawowe składniki środowiska CodeWarrior 10.1.............. 3 3 Moduł PIT (Programmable Interrupts Timer) 9 3.1 Rejestry PIT.................................... 9 3.1.1 PIT Control and Status Register - PCSR................ 10 3.1.2 PIT Modulus Register - PMR...................... 10 3.1.3 PIT Count Register - PCNTR...................... 10 3.2 Przykładowy program............................... 10 4 TPU 11 4.1 Konfiguracja etpu................................ 11 4.2 Generowanie mikrokodu.............................. 12 4.3 Przykładowy program............................... 14 2
1 Wstęp Celem realizowanego projektu było zapoznanie się ze strukturą oraz działaniem płytki ewaluacyjnej z mikroprocesorem ColdFire MCF5234. W ramach realizowanego projektu wykonane zostały podstawowe czynności, na podstawie których będzie możliwe wykorzystanie danego modułu do realizacji bardziej skomplikowanych zadań. W ramach podstawowej realizacji projektu zrealizowana została obsługa podstawowych peryferiów, wymienionych poniżej: uruchomienie przerwań (PIT ), wykorzystanie funkcji procesora czasowego TPU (funkcje PWM, GPIO; inicjalizacja TPU. 2 Instalacja środowiska CodeWarrior Dołączone do dokumentu programy zostały napisane w środowisku CodeWarrior 10.1, które można zainstalować z dołączonej do zestawu płyty (w wersji 32-bitowej) bądź pobrać ze strony freescale.com, jeżeli interesuje nas wersja 64-bitowa. Na stronie głównej grupy Freescale Semiconductors można odnaleźć wiele interesujących informacji na temat pracy oraz porad związanych z rozwiązywaniem problemów. W poniższym sprawozdaniu często będziemy odwoływać się do informacji tam zawartych. 2.1 Podstawowe składniki środowiska CodeWarrior 10.1 CodeWarrior 10.1 jest oprogramowaniem służącym do przygotowywania oraz uruchamiania aplikacji użytkowych na mikrokontrolery marki Freescale. Zarzadzanie wszystkimi projektami odbywa się w tym środowisku, którego użytkowanie nie różni się zbytnio od tych stworzonych do pracy z mikrokontrolerami innych producentów. Na Rysunku 1 zamieszczony został sposób utworzenia nowego projektu. Oba widoczne zaznaczenia dają nam możliwość utworzenia nowego projektu. 3
Rysunek 1: Widok okna tworzenia nowego projektu Wybranie opcji Project... spowoduje pojawenie się okna widocznego na Rysunku 2, wraz z zaznaczonym wyborem typu projektu: Rysunek 2: Widok okna tworzenia nowego projektu W następnych krokach należy wskazać katalog naszego przyszłego projektu. Warto unikać polskich znaków czy spacji (dotyczy całej ścieżki katalogu) - nie można zapewnić, czy nasze 4
przyszłe programy będą się poprawnie kompilować. Na Rysunku 3 zamieszczone zostało okno wyboru urządzenia, na którym będziemy pracować: Rysunek 3: Widok okna wyboru urządzenia Rysunek 4 przedstawia okno wyboru typu połączenia z wybranym urządzeniem - należy zostawić okno bez zmian; jak łatwo można zauważyć, metod tych jest kilka, przystosowanych do różnego rodzaju pracy. 5
Rysunek 4: Widok okna wyboru połączenia z MCF5234 Dodawanie gotowych plików, nagłówków, bibliotek możliwe jest już na samym początku tworzenia nowego projektu. Opcja ta jest również możliwa w innych etapach pracy - informacja o tym zawarta jest w rozdziale 4.2 - Generowanie mikrokodu. 6
Rysunek 5: Widok okna dodawania nowych plików (w trakcie tworzenia projektu) Rozpoczęcie nowego projektu we wskazanym przez nas folderze generuje plik funkcji main.c, wraz z dołączoną do niego standardową biblioteką wejścia-wyjścia stdio.h oraz nagłówkiem support common.h, w którym zadeklarowane są wszystkie peryferia (podglądnięcie zawartości jest możliwe po wybraniu opcji Open Declaration lub po wciśnięciu F3). Na Rysunku 6 zamieszczony został widok okna z przykładowym programem. Wyróżnione zostały elementy, z których działaniem należy się zapoznać. 7
Rysunek 6: Widok okna programu Utworzony został dopiero pierwszy projekt. Co w sytuacji, kiedy jest ich więcej? Praca w środowicku CodeWarrior przysporzy użytkownikom mniej kłopotów, jeżeli będziemy pamiętać o zamykaniu projektów, których akurat nie używamy - może się zdarzyć, że wybierając kompilację jednego projektu, skompilowany zostanie inny. Nie spowoduje to jakichkolwiek niekontrolowanych zmian w naszym projekcie, aczkolwiek możemy poświęcić więcej czasu na zastanawianie się nad przyczyną jakiegoś pojawiajacego się błędu przy kompilacji. Szczegóły widoczne na Rysunku 7: 8
Rysunek 7: Zamykanie nieaktywnych projektów Otwieranie zamkniętych projektów odbywa się w analogiczny sposób: klikamy prawym przyciskiem na ikonę żądanego projektu, następnie wybieramy Open Project. Przydatną opcją środowiska jest również możliwość zmiany perspektywy głównego okna programu - ustawiona może w trybie programowania oraz debugowania. Oba przycisku umiejscowione są w prawym górnym rogu głównego okna programu (Rysunek 8: Rysunek 8: Zmiana perspektywy pracy 3 Moduł PIT (Programmable Interrupts Timer) Model MCF5234 posiada cztery programowalne układy przerwań cyklicznych (PIT), oznaczone jako PIT0 PIT3. Każdy PIT jest 16-bitowym timerem, zapewniającym precyzyjne i regularne interwały przy minimalnym użyciu procesora. Timer może służyć również jako licznik (zliczający w dół, począwszy od wartości zapisanych w rejestrze). W kolejnych akapitach zawarty zostanie opis inicjalizacji timerów oraz przykładowy program służący do użycia ich w celach generowania przerwania przy stałym interwale. Przykład jest przydatny w celuzapoznania się z działaniem przerwania oraz funkcją PIT. Wszystkie przydatne informacje zawarte są w dokumentacji MCF5234 w rozdziale 23. 3.1 Rejestry PIT Moduł PIT (Programmable Interrupts Timer) składa się z trzech 16-bitowych rejestrów: PIT Control and Status Register (PCSR) 9
PIT Modulus Register (PMR) PIT Count Register (PCNTR) Każdy z modułów PIT (PIT0 PIT3) ma własny zestaw podanych rejestrów. Do rejestrów PCSR oraz PMR mamy możliwość zapisy i odczytu z nich, podczas gdy z PCNTR możemy jedynie odczytywać dane. Poniżej zawarte zostały opisy tych trzech rejestrów. 3.1.1 PIT Control and Status Register - PCSR Rejestr PCSR jest odpowiedzialny za działanie timera. To tutaj ustawiane jest włączanie- /wyłączanie przerwań oraz PITa, tutaj ustawiane jest wartość początkowa, od której rozpoczynamy odliczanie w dół, determinująca moment załadowania nowej wartości początkowej. Ważnym elementem, niezbędnym do prawidłowego skonfigurowania rejestru jest ustawianie prescalera (bity 11 8 rejestru PCSR). Konfiguracja i generowanie przerwań wymaga wiedzy o zegarze systemowym, wartościach modułu PIT oraz wartościach prescalera (ustawionej w celu otrzymania pożądanego okresu). Poniżej zamieszczone zostały równania, które zostały użyte do oszacowania okresu dla zegara PIT. T = PIT Timeout Period [Seconds (s)] P = PIT Prescalar M = PIT Modulus Value F = PIT Frequency [Hertz (Hz)] S = System Clock [Hertz (Hz)] /* To determine desired timeout period: */ T = ( P x ( M + 1 ) x 2 ) / S /* To determine PIT modulus value using desired PIT frequency */ 3.1.2 PIT Modulus Register - PMR M = [S / ( 2 x P x F )] { 1 16-bitowy rejestr PMR zawiera wartość, która jest ładowana do licznika PIT, gdy ten osiągnie 0x0000 (warunkiem jest ustawianie PCSR[RLD] (reload) na 1). Gdy bit OVW (overwrite) rejestru PCSR jest ustawiony, wartość PMR jest niezwłocznie przepisana do licznika PIT. Jednocześnie resetowana jest wartość licznika prescalera (0xFFFF). Użytkownik posiada możliwość odczytu/zapisu rejestru PMR. Czytanie z niego zwraca wartość zapisaną w module. Reset ponownie ustawia PMR na 0xFFFF. 3.1.3 PIT Count Register - PCNTR Jest to 16-bitowy rejestr, z którego możliwy jest jedynie odczyt danych. Zapisywanie do niego czegokolwiek nie przyniesie żadnych efektów - zapisane w nim cykle będą odbywały się normalnie. Nie można zagwarantować, że czytanie kolejnych 8 bitów jest jednoznaczne z przeczytaniem wszystkich 16 bitów składających się na rejestr PCNTR. 3.2 Przykładowy program Generalana metoda konfiguracji PITa składa się z trzech kroków: definicja obsługi przerwania, konfiguracja PITa, 10
uruchomienie przerwania PIT. Wszystkie niezbędne informacje na temat konfiguracji rejestrów PIT znajdują się w 23 rozdziale dokumentacji modułu, dostępnej w formie elektronicznej na stronie producenta (pod nazwą MCF5235 Reference Manual, wspierającej również model przez nas wykorzystywany - M CF5234). Zamieszczony poniżej program działa na zasadzie stopera - odlicza minuty, sekundy i milisekundy. Wcześniejsza praca (z wykorzystaniem UARTa) implementowała program, który po skompilowaniu i uruchomieniu wyświetlał wszystkie te wartości. Ze względu na prędkość transmisji danych (nie zapominajmy, że w początkowym założeniu program miał pozwalać na wyświetlanie co najmniej setnych części sekundy) dochodziło do zbyt szybkiego przepełnienia bufora tymczasowego gromadzenia danych, co powodowało błąd już przy około 15 sekundzie działania programu. Z tego względu zrezygnowano z takiej formy wyświetlania danych. Sama konfiguracja UARTa nie jest niczym trudnym: należy dołączyć nagłówek uart support.h, następnie zainicjalizować oraz skonfigurować UARTa w zależności od samych parametrów układu, widocznych w kodzie poniżej: uart init(terminal PORT, SYSTEM CLOCK KHZ, TERMINAL BAUD); 4 TPU etpu jest programowalnym kontrolerem wejścia/wyjścia, wyposażonym we własny procesor i pamięć (w przypadku MCF5234 jest to 6KB), pozwalające na pełne zarządzanie operacjami I/O. Operuje niezależnie od procesora: generuje zdarzenia i instrukcje czasu rzeczywistego, daje dostęp do danych bez potrzeby użycia CPU. W konsekwencji zużycie procesora do obsługi timera jest minimalne lub w ogóle wyeliminowane. etpu obsługuje wiele przerwań, co umożliwia CPU obsługę innych operacji. 4.1 Konfiguracja etpu Do poprawnego działania jednostki etpu wymagane jest dołączenie mikrokodu realizujacego wybrane funkcje. Przykład inicjalizacji etpu dla MCF5234 (funkcja ta musi zostać zawarta w funkcji głównej programu; jej deklaracja znajduje się pliku etpu util.c): /* initialize etpu hardware */ fs_ etpu_ init ( my_etpu_config, ( uint32_ t *) etpu_code, // wskaznik do mikrokodu sizeof ( etpu_ code ),// rozmiar ); kodu ( uint32_ t *) etpu_globals, sizeof ( etpu_globals ) Konfiguracja kanału, polegająca na wybraniu realizowanej przezeń funkcji, umożliwia korzystanie z etpu. Wybrane i odpowiednio ustawione rejestry pozwalają na komunikację z kanałem, co pozwala na zarządzanie opieracjami I/O. To, co i jak należy skonfigurować, zależy oczywiście od zestawu wybranych przez nas funkcji. W dalszej części dokumentu zawarta jest informacja, w jaki sposób można pozyskać żądany mikrokod. 11
4.2 Generowanie mikrokodu Mikrokod jest programem implementującym listę rozkazów procesora zawartego w TPU. Są to instrukcje w postaci kodu maszynowego, którego forma może trochę przerażać - język ten jest bardziej prymitywny od asemblera, co zdecydowanie utrudnia użytkownikowi zrozumienie danych instrukcji. Nie należy się tym jednak martwić; naszym zadaniem jest jedynie odpowiednie wygenerowanie mikrokodu, a nie interpretacja. Dzięki zamieszczonej na stronie aplikacji http://www.freescale.com/webapp/etpu/ jest to proste i bardzo intuicyjne. Na Rysunku 9 zamieszczony został widok selektora funkcji etpu: Rysunek 9: Aplikacja selektora funkcji etpu Jak już zostało wspomniane, etpu posiada własną pamięć - ze względu na jej rozmiar najlepiej wygerować tylko te funkcje, których akurat potrzebujemy. Aplikacja sprawdza, ile pamięci zostanie wykorzystanej przy zgrywaniu wybranych funkcji; nie musimy się więc obawiać o ewentualne przekroczenie limitu. Postępując zgodnie z instrukcjami na stronie nasz zestaw funkcji zostanie skompilowany i gotowy do pobrania. Nam pozostaje dołączenie odpowiednich nagłówków do pliku funkcji głównej. Na Rysunku 10 widoczny jest fragment dołączonego mikrokodu: 12
Rysunek 10: Fragment mikrokodu Poniżej zamieszczony został fragment kodu, wskazujący jakie nagłówki należy dołączyć w celu korzystania oraz konfiguracji etpu : # include " etpu_util.h" # include " etpu_set.h" # include " mcf523x_vars.h" # include " etpu_pwm.h" # include " etpu_gpio.h" Jak już zostało wspomniane wcześniej, plik etpu util.c zawiera makra i prototypy potrzebne do użycia etpu. W pliku etpu set.c zawarty został wygenerowany mikrokod. Pozostałe nagłówki wskazują na to, jakie funkcje były wykorzystywane do obsługi wskazanych przez nas kanałów; w realizowanym projekcie na funkcje PWM przeznaczony został kanał 8, a dla GPIO - 9. # define PWM0 8 # define GPIO0 9 Zarówno użyte funkcje, jak i przeznaczone na nie kanały można z łatwością zmienić, co nie wpływa oczywiście w żaden sposób na działanie naszego programu. Na stronie producenta dostępne są przydatne wskazówki oraz pliki w formacie.pdf, na podstawie których można bardzo dokładnie zapoznać się z możliwościami potrzebnych funkcji etpu: więcej o programowaniu etpu: http://www.freescale.com/files/32bit/doc/app note/an2848.pdf więcej o funkcji PWM: http://cache.freescale.com/files/32bit/doc/app note/an2849.pdf 13
więcej o funkcji GPIO: http://www.freescale.com/files/32bit/doc/app note/an2850.pdf Więcej informacji można znaleźć również w rozdziale 20 dokumentacji mikrokontrolera. Na Rysunku 4 widoczny jest sposób dodawania niezbędnych do pracy plików źródłowych (w takim sam sposób dodaje się odpowiednie pliki nagłówkowe; wystarczy kliknąć na Project Headers i postępować analogicznie): Rysunek 4: Dodawania plików źródłowych i nagłówków Opcja Add Files może automatycznie wygenerować foldery plików źródłowych i nagłówków w katalogu naszego projektu. 4.3 Przykładowy program Zamieszczony w dalszej części dokumentu program steruje natężeniem świecenia diody; w tym celu wykorzystana została funkcja PWM, modulujaca szerokością impulsów. etpu ma swoje dedykowane porty, do których w normalnym trybie pracy (czyli bez żadnych wprowadznoych przez użytkowników zmian) nie mamy dostępu. Dołączenie interfejsu GPIO pozwala na wysterowanie ich jako porty wejścia/wyjścia. Druga dołączona do płytki dioda zapala się przy każdym kolejnym odebranym na wyjściu impulsie. 14