Processor Expert z Kinetis Design Studio – wygoda tworzenia [PRZYKŁAD]

Debugowanie programu

Mając przygotowany plik wykonywalny programu przechodzimy do etapu programowania mikrokontrolera oraz testowania jego pracy przy pomocy debugera. Za każdym razem po utworzeniu nowego projektu i przed pierwszym wejściem do trybu debugowania należy dokonać konfiguracji tego trybu. W tym celu wywołujemy odpowiednie okienko z głównego menu programu Run ? Debug Configurations (rysunek 12).

 

Rys. 12. Okienko konfiguracji trybu debugowania

 

Rys. 13. Utworzenie konfiguracji debugowania dla nowego projektu

 

Na liście w lewej części okienka zaznaczamy GDB PEMicro Interface Debugging i z menu kontekstowego wywoływanego przy pomocy PPM wybieramy New. W ten sposób utworzona zostanie nowa konfiguracja debugowania o domyślnej nazwie zawartej w polu Name (rysunek 13). Ważne jest, aby w polu C/C++ Application na zakładce Main znajdowała się poprawna ścieżka do pliku wykonywalnego z rozszerzeniem elf – jeśli takowa nie występuje (jedną z przyczyn może być utworzenie nowej konfiguracji bez wcześniejszego skompilowania projektu i wygenerowania pliku wykonywalnego) to należy ją dodać poprzez wciśnięcie przycisku Search Project lub Browse i wskazanie wymaganego pliku. W zakładce Debugger (rysunek 14) z listy rozwijanej Interface wybieramy OpenSDA Embedded Debug – USB Port i opcja Port powinna automatycznie zmienić się na ciąg typu USB1 – OpenSDA… (jeżeli tak się nie stało to albo programator/debugger nie jest podłączony, albo wystąpił problem połączenia się z nim – przykładową procedurę instalacji zestawu FRDM-KL25Z w systemie oraz wgrywania niezbędnego firmware’u CMSIS-DAP OpenSDA przedstawiono na stronie http://kinetis.pl/node/236). Natomiast w polu Device Name wpisujemy nazwę mikrokontrolera, np. KL25Z128M4. Pozostałe opcje nie wymagają zmian, dlatego zapisujemy konfigurację przyciskiem Apply, a następnie przyciskiem Debug uruchamiamy debuger (w późniejszym czasie można go uruchamiać z menu Run ? Debug lub klikając stosowną ikonkę na pasku narzędziowym).

 

Rys. 14. Wybór programatora/debugera oraz docelowego mikrokontrolera

 

Istnieje również możliwość aby tylko zaprogramować układ, bez wchodzenia w tryb debugowania – w tym celu z menu Run ? Flash from file wywołujemy znane nam już okienko i postępujemy dokładnie tak samo, jak w przypadku konfiguracji debugowania, po czym możemy zapisywać program w pamięci mikrokontrolera klikając przycisk Flash (aby nowy program zaczął się wykonywać należy po wszystkim wcisnąć przycisk Reset na płytce zestawu).

Wraz z wejściem do trybu debugowania zostanie załadowana perspektywa Debug, w której to mamy do dyspozycji różne widoki pozwalające na podejrzenie aktualnego stanu wykonywania programu i zawartości pamięci mikrokontrolera. Aby rozpocząć wykonywanie wgranego oprogramowania należy wybrać z menu Run ? Resume (klawisz F8 lub ikonka zielonej strzałki na pasku narzędziowym), natomiast w celu jego chwilowego zatrzymania – Run ? Suspend. Wykorzystując operacje Step Into, Step Over oraz Step Return dostępne z menu Run lub na pasku narzędziowym danej perspektywy z łatwością można prześledzić zachowanie się programu w różnych sytuacjach (podczas debugowania i chwilowego zatrzymania wykonywania programu można modyfikować zawartość zmiennych w widoku Variables).

 

Rys. 15. Perspektywa Debug

 

W celu zakończenia testowania układu i rozłączenia się z debugerem wybieramy z menu Run ? Terminate (kombinacja klawiszy Ctrl+F2 lub ikonka z czerwonym kwadratem na pasku narzędziowym). Potwierdzeniem zakończenia pracy z debugerem będzie komunikat „<terminated, exit value: 0>” znajdujący się w widoku Debug w gałęzi z naszym projektem. Dalej można powrócić do perspektywy C/C++ albo Hardware aby zmodyfikować i/lub poprawić projektowaną aplikację.

 

Rozbudowa projektu o dodatkowe diody LED i licznik SysTick

Zaprezentowany powyżej program jest bardzo prosty, jednak nie pozwala on na jawne określenie czasu oczekiwania pomiędzy przełączaniem stanów czerwonej diody LED. Aby to poprawić wykorzystamy licznik SysTick, którego zadaniem będzie precyzyjne zliczanie czasu oraz generowanie przerwań co 1 ms zliczanych z kolei przez zdefiniowaną przez nas funkcję wait_ms().

 

Rys. 16. Dodanie komponentu typu TimerInt_LDD

 

Dodanie interesującego nas komponentu TimerInt_LDD przeprowadzamy podobnie jak w przypadku pojedynczej linii GPIO, ale tym razem na bloczku SysTick (rysunek 16). W widoku Component Inspector powinna pojawić się odpowiednia zakładka Properties (rysunek 17) – można ją również wywołać klikając na dodanym komponencie TI1:TimerInt_LDD w widoku Components lub na grafice w widoku Processor. W podświetlonym na czerwono polu Interrupt period wprowadzamy „1 kHz”, natomiast w wewnętrznej zakładce Initialization zaznaczamy opcję Auto Initialization (rysunek 18). Po zapisaniu projektu generujemy nowy kod z menu Project ? Generate Processor Expert Code. Warto tutaj zauważyć, że przy dodawaniu bardziej złożonych komponentów są automatycznie dodawane komponenty je tworzące.

 

Rys. 17. Komponent TimerInt_LDD wymaga skonfigurowania podstawowych parametrów

 

Rys. 18. Konfiguracja licznika SysTick

Do pobrania

O autorze