czwartek, 29 kwietnia 2021

STM32G0 - randka z MDK ARM


MDK Microcontroller Development Kit
firmy Keil to najwyżej oceniane w branży zintegrowane środowisko do programowania i debugowania MCU z architekturą ARM. Jak pisze producent, MDK jest najbardziej wszechstronnym rozwiązaniem programistycznym dla mikrokontrolerów opartych na architekturze ARM i zawiera wszystkie komponenty potrzebne do tworzenia, budowania i debugowania aplikacji wbudowanych. Jeśli na rynku pojawi się jakiś nowy MCU zbudowany w oparciu o architekturę ARM wydany przez dowolnego producenta to pierwszym środowiskiem w którym on się pojawi będzie MDK Keila. W zasadzie MDK jest wzorem środowiska do którego reszta może tylko się próbować równać. W artykule zerknę na środowisko MDK przez pryzmat STM32G0.

Seria STM32G0 została obłaskawiona przez firmę Keil i zrobiono dla niej wyjątek w ograniczeniach korzystania ze środowiska. Wyjątek polega na tym, że dla darmowego korzystania z MDK mamy ograniczony kod programu do 256 kB. To znacznie więcej niż standardowe ograniczenie dla MCU z Cortex M0+ do 32kB kodu programu. Pierwszym krokiem aby cokolwiek podziałać w środowisku MDK jest ściągnięcie go ze strony producenta  TUTAJ. Oprócz środowiska potrzebujemy płytki z MCU STM32G0 i programatora. Użyje tutaj swojej płytki z STM32G071KBT6 oraz programatora J-LINK EDU Mini.

Wspomnę, że MDK jest dostępne tylko dla systemu WIN ,no trochę to boli. Ale pewnie prezes Keila to kolega Gates-a. Przed pobraniem pliku instalacyjnego trzeba wypełnić krótki formularz z danymi. Te dane zostaną przyporządkowane potem do licencji. Instalacja jest bardzo prosta i przebiega bez problemów. Ja sobie poczyniłem instalację poza dyskiem systemowym. Po zainstalowaniu środowiska trzeba przeprowadzić procedurę nadania licencji dla STM32. Instrukcja pozyskania licencji TUTAJ.

Na wstępie powiem, że  MDK jest bardzo intuicyjnie,  szybko się w nim odnalazłem. Wszystko jest na swoim miejscu . Komfort pracy jest tutaj na bardzo wysokim poziomie. Nic w tym środowisku nie razi, wszystko jest przyjazne i poukładane jak należy. Na każdym kroku widać , że producent wyszedł mocno na przeciw programistom ceniącym sobie niezależność i wszechstronność. Po prostu profesjonalne i komfortowe środowisko z najlepszymi dostępnymi na rynku kompilatorami od ARM-a, którymi potraktujemy dowolny MCU ARM dowolnego producenta.

Przy pierwszym uruchomieniu środowiska pojawi nam się okno Pack Installer. Tutaj wybieramy paczki/drivery niezbędne do pracy z naszym MCU. Na obrazku widzimy jak wielu producentów mamy do wyboru z lewej strony od A do Z. Wielu z nich nie miałem pojęcia, że istnieją :).


Najpierw wyszukujemy z lewej strony producenta i model naszego MCU, w moim przypadku to STM32G071KBT6


Następnie wzrok kierujemy na prawe okno i tam musimy mieć zainstalowane 4 elementy jak na obrazku poniżej , jeśli nie są to trzeba je doinstalować :


Są to STM32G0xx_DFP , ARM CMSIS , ARM CMSIS-Driver i ARM_Compiler. To są podstawowe paczki jakie musimy mieć zainstalowane aby działać z naszym MCU. Okno Pack Installer można zamknąć, w dowolnym momencie z poziomu programu można je uruchomić .

Podstawowe okno MDK wygląda jak poniżej :



Niech nas nie zwiedzie ascetyczność tego okna , tu są ukryte narzędzia ARM-a jakich nie znajdziemy w wielu IDE innych producentów. Utwórzmy sobie nowy projekt. ale najpierw maleńka konfiguracja narzędzi i dostosowanie ich do mojego programatora J-LINK Edu Mini. Wchodzimy w Flash -> Configure Flash Tools  zakładka Target zmieniamy tam wartość Xtal na 16MHz (docelowa częstotliwość taktowania MCU w naszym projekcie) no taką sobie wybrałem bo taka jest po starcie MCU. Następnie wchodzimy w zakładkę Debug i po prawej stronie na górze wybieramy JLINK :


Obok pola wyboru JLINK wchodzimy w Settings, otwiera nam się kolejne okienko z ustawieniami dla programatora jak poniżej :


W okienku tym musimy wybrać opcję SW w polu Port. standardowo będzie tam JTAG. Ja łączę się po SWD co reprezentowane jest przez SW. W oknie ustawień programatora wybieram zakładkę Flash Download zaznaczmy tam jeśli nie będzie Reset and Run.


Teraz możemy utworzyć nowy projekt, w tym celu wybieramy Project -> New uVision Project

W okienku które się pojawi tworzę katalog STM32G0_EXTI i wewnątrz niego podaję nazwę stm32g0_exti , cała akcja poniżej :


Przechodzimy dalej wybierając Zapisz. Pojawi się okienko jak poniżej w którym wybieramy model naszego MCU, w moim przypadku to STM32G071KBTx :


Klikamy OK. i pojawi nam się okno o nazwie Manage-Run Time Environment jak poniżej :


W okienku powyższym wybieramy "fiuczersy", które zostaną dołączone do naszego projektu, jest tego od metra , warto sobie to przejrzeć. Zauważmy , że są również biblioteki HAL i LL , które możemy sobie dołączyć do projektu ale ciekawe tutaj jest to, że możemy wybiórczo wybrać potrzebne moduły a nie całą opasłą bibliotekę np. tylko GPIO, EXTI , ADC etc.. Fajne , fajne. Ja wybieram minimalistyczny zestaw do pracy na rejestrach w tym celu "ptaszki" stawiam jak na obrazku powyżej i OK.  O ooo ! już projekt się utworzył :). o kurna coś ubogo tych plików, ascetyzm do kwadratu :). My spodziewamy się , że zobaczymy wypasiony projekt z bogatą listą plików a tu taka "kicha" :)



Mamusiu jak chcę więcej plików w projekcie buuuuu !!!!. OK, Mamusia wciska klawisz F7 wybierając opcję Build. Och Mamusia jest the best , pliki się rozmnożyły co widać na obrazku poniżej :


O kurna jeszcze nic nie napisaliśmy a już mamy 1 error :) no ale przynajmniej 0 warningów, jest dobrze :). No cóż środowisko za nas nie napisze programu trzeba zakasać rękawy. Na początek zmieniam sobie nazwy w projekcie : Target 1 na STM32G0_EXTI i Source Group na APP. Nazwy zmieniamy robiąc ruch myszką od prawej do lewej na nazwie !.

Mój projekt się rozrasta , zmieniłem dwie nazwy :), jest fajnie, mnie się podoba, nauczmy cieszyć się z rzeczy prostych :) :


W katalogu APP tworzymy sobie plik main.c w tym celu prawym klawiszem myszki na nazwie APP rozwijamy menu z którego wybieramy opcje Add new item


Utworzy nam się plik main.c w katalogu APP, pusty i czysty jak dziewica Orleańska. Taka czysta przestrzeń pliku main.c skłania do refleksji nad sensem tego co chciałem w nim zawrzeć :).
No i teraz pora wymyśleć co nasz program będzie robił. Zerkniemy sobie jak skonfigurować w STM32G0 wybrany pin aby reagował na zjawisko zewnętrzne np. zbocze opadające. Czyli poobcujemy z modułem przerwań zewnętrznych EXTI w STM32 .

Do zabawy z przerwaniami EXTI potrzebować będę dwa piny , jeden z podłączoną diodą LED i jeden pin skonfigurowany i podłączony do modułu EXTI. Działanie programu będzie proste (prostackie) , na pin podłączony do EXTI i podciągnięty do VCC podam masę , powstanie zbocze opadające, zostanie wygenerowane przerwanie od EXTI co spowoduje zapalenie diody LED.

Poniżej jak wygląda mój program :


Jedynym wysiłkiem umysłowym było zrozumienie co poeta czyli firma STM miał na myśli tworząc rejestry dla modułu EXTI. Trochę to pogmatwane i mało przyjazne dla użytkownika ,na początku pewnie nie jednemu było to kością w gardle :).  Zapodam filmik , który był mi wielce pomocny do zajarzenia  jak to ustawić w moim MCU. TUTAJ.

Podłączam płytkę z MCU i programator , zobaczę czy to działa. Aby wgrać program , ikonkę Load lub klawisz F8. Otrzymałem komunikat, że mój programator nie jest skorelowany z MCU jaki wybrałem do projektu. Jakieś tam pierdu, pierdu. W kolejnym okienku jakie wyskoczy wybieram z listy STM32G071KB i potwierdzam OK


Ponownie wgrywam program. O kurna cos się wgrało :) , jest informacja na dole o powodzeniu operacji. Zobaczymy czy pacjent przeżył i daje oznaki życia. W tym celu biorę kabelek, wpinam go do masy na mojej płytce i celuję drugim końcem w dziurkę pinu PB1 , powinna zapalić się dioda LED :). Nie działa ha ha ha ha ...... !!!!. Obśmiałem się jak Borsuk po kuflu piwa. Zadałem sobie pytanie wprost i bez ogródek bo mogę tak ze sobą rozmawiać jak nikt nie słyszy :) "Czy ty matole włączyłeś zegar dla modułu GPIO ??? " no tak matoł nie włączył :). Samokrytyka jest bardzo budująca :).Tutaj mamy przewagę ATSAM-ów czy PIC32CM firmy Microchip, w których zegary na starcie podłączone są do takich modułów jak GPIO, jedna rzecz do pamiętania mniej. Uzupełniam , więc kod programu :


Zegarki dla GPIOA i GPIOB podłączone, ponownie wgrywam program i kabelek w dziurkę :). Dobra nawet nie sprawdzam czy działa bo znowu bym musiał sobie naubliżać. Nie włączyłem NVIC-a dla modułu EXTI. Wypatrzyłem jeszcze przy okazji dwa błędy, jeden związany z tym, że funkcję PinInit() należy umieścić po włączeniu zegarów dla GPIO oraz w funkcji obsługującej przerwanie, zapalenie LED musi nastąpić po rozpoznaniu, że przerwanie wywołane z linii nr 1.  Program się nam zatem rozbudowuje :) . Poniżej wersja po testach jednostkowych działająca :)


Po podaniu masy na pin PB1 zapali nam się ślicznie dioda LED na pinie PA8. Czyli przerwanie EXTI zostało wywołane, no coś się wreszcie zadziało , magia normalnie :). Ile radości z takiej pierdoły.

Żeby nie było tak nudno odpalmy i zerknijmy na debugger. Zrobimy to za pomocą ikonki w środkowym panelu z ikonami, ikonka lupki opisana jako Start/Stop Debug Sesion
Przed wejściem do debugera oznaczmy punkt zatrzymania w funkcji przerwania , tak jak na obrazku poniżej, punkt tworzymy klikając poza obrysem pola tekstowego z lewej strony :


Odpalamy debuger. Załóżmy , że chcemy podejrzeć rejestr ODR w module GPIOA. W tym celu wybieramy z menu jak poniżej :


Pojawi nam się z prawej strony okno z zawartością rejestrów modułu GPIOA. Nas interesuje rejestr ODR i konkretnie pole ODR8 ponieważ na PA8 mam LED-a, który w przerwaniu będzie odpalany.


Jeśli podczas stanu debugowania odpalimy przerwanie to w przerwaniu ustawimy ODR8 i w efekcie zapali nam się dioda LED. Zobaczmy czy tak się stanie . Klikamy ikonkę Step Out lub Ctrl+F11 i w tym stanie podajemy masę na PB1, powinno wyzwolić się przerwanie i nasza kropka zostanie przesłonięta przez kolorowe strzałeczki co oznacza, że program zatrzymał się na naszym punkcie zatrzymania :


Teraz małymi kroczkami przesuniemy wykonywanie programu na następną linię oraz kolejną ,robimy to za pomocą ikonki Step lub F11 aż zobaczymy , że pole ODR8 zostanie "zaptaszkowane", jeśli tak się stanie zapali się dioda LED na PA8.


Wszystko zadziałało jak trzeba.

Moja pierwsza randka z MDK była udana, środowisko jest mocno przemyślane od stronu łatwości posługiwania się nim. Porównując to do środowisk opartych o Eclipsa to jak niebo a ziemia. Ogromną zaletą tego środowiska jest wszechstronność , mamy tutaj "drivery" do każdego praktycznie ARM-a obecnego na rynku. Mnogość dodatków takich jak RTOS-y, stosy USB, WiFi , grafika etc po prostu powala. W mojej ocenie, środowisko jest przeznaczone dla programistów, którzy chcą mocno zoptymalizować system embedded pod kątem wydajności, szybkości działania i optymalizacji zasobów. Kompilatory od ARM-a nie mają sobie równych na rynku, po prostu żaden producent nie ma lepszych. 

Zachęcam do zabaw z tym środowiskiem i poczucia klimatu tego profesjonalnego narzędzia, szczególnie posiadaczy STM32G0 dla których mamy możliwość pisania programów do 256 kB a to całkiem dużo. Ja się cieszę , że odważyłem się spróbować i że moja płytka z STM32G0 i programator J-LINK EDU mini świetnie współpracują z takimi środowiskami.

Pozdrawiam

PICmajster
picmajster.blog@gmail.com

Brak komentarzy:

Prześlij komentarz