wtorek, 13 kwietnia 2021

STM32G0 - Hello World w Segger Embedded Studio

Jestem już w posiadaniu mojej płytki dla STM32G0. Jest fajna, jest czarna i oczy cieszy. Uśmiech na gębie od ucha do ucha. Na płytce dałem niebieskiego LED-a do wykorzystania przez użytkownika, czerń z niebieskim w półmroku powala :). Lubię cieszyć się z rzeczy prostych. Czas sprawdzić czy wszystkie komponenty czyli IDE i programator będą współpracować z moją płytką. Ostatnio kolega śmiał się ze mnie, że programuję MCU nie posiadając go fizycznie na płytce :). No tak jest najzabawniej :). A śmiech służy zdrowiu :). W artykule, napiszemy pierwszy program w ultra szybkim i lekkim środowisku SEGGER-a i za pomocą miluśkiego programatorka J-Link Edu Mini, spróbujemy wgrać wsad do STM32G071KBT6 , który znajduje się na mojej płytce. Życzę sobie powodzenia :).

Dlaczego nie korzystam z narzędzi dostarczanych przez producenta czyli STM32Cube IDE , ST-Link , płytki Nucleo ,tylko szukam przygód z jakimiś "wynalazkami" takimi jak IDE SEGGER i JLink i o zgrozo sam wykonuję płytkę mając na wyciagnięcie ręki szeroką gamę płytek Nucleo ? Ekosystem MCU z rdzeniami ARM wprowadza możliwość bycia "wolnym" od monopolu producenta. Co to oznacza ? W skrócie tyle , że niezależnymi od producenta danego MCU narzędziami i IDE jesteśmy w stanie skutecznie rozmawiać z dowolnym MCU opartym o rdzeń ARM. Przykładami takich niezależnych narzędzi programistycznych IDEuVison Keila, IAR , Embedded Studio Seggera są one dedykowane dla wąskiej grupy profesjonalistów i dla zastosowań komercyjnych trzeba za nie słono płacić. Z punktu widzenia hobbysty aspekt komercjalizmu jest tutaj nieistotny. Jeśli mamy niekomercyjnie możliwość korzystania bezpłatnie ze wszystkich funkcjonalności profesjonalnego narzędzia to ja z tego chętnie skorzystam. Taką furtkę ma IDE SEGGER-a, jako jedyne z wyżej wymienionych środowisk ,oferuje dla zastosowań niekomercyjnych pełną funkcjonalność, bez ograniczeń co do wielkości kodu etc. Firma SEGGER znana jest ponadto ze swoich programatorów , które są zaliczane do najlepszych narzędzi dla ARM-a. Pomijając jednak powyższe wywody bo nie do każdego mogą one przemawiać, moje przypadkowe spotkanie z IDE SEGGERA i J-Linkiem miało jeden praktyczny wymiar, który określę tak -  "szybki jak struś pędziwiatr". Powalająca prędkość działania IDE i programatora, to jest to co mnie tutaj urzekło. Nieosiągalne w takich kobyłach jak MPLABX IDE czy STM32 CUBE. Po co robić płytkę ? Projektuję je pod swój gust i pod swoje potrzeby a ponadto jest to jakaś nauka i sprawia mi to dużą frajdę. Płytkę Nucleo mam w szufladzie i tam na długo pozostanie jej docelowe miejsce :).

Poniżej jako ciekawostkę załączam dwa obrazki pierwszy z STM32Cube z użyciem HAL konfiguracja jednego pinu w MCU i obrazek pokazujący zajętość Flash i RAM gdzie Stos to 1.55 kB


Oraz to samo ale w projekcie wygenerowanym w środowisku Seggera bez użycia HAL , Stos ustawiony na 2 kB w RAM.


Patrzymy w porównaniu tylko na pamięć FLASH bo w RAM mamy ustawione różne wielkości stosu.
W STM32Cube wygenerowany projekt kosztuje 5,09 kB pamięci Flash podczas gdy ta sama operacja w IDE SEGERRA kosztuje 878 bajta. Oczywiście ten przykład jest trochę przerysowany bo nic nie wiemy o optymalizacji kodu przy budowaniu projektu , zostawiłem tutaj wartości domyślne.  Ale tak czy siak  biblioteka HAL nie jest zoptymalizowana do pisania wydajnego kodu czego efektem jest rozpychanie się w pamięci Flash. I jeśli ktoś stawia projekty komercyjne na HAL-u to na dzień dobry musi mieć z tyłu głowy aby przewymiarować mikrokontroler w stosunku do tego co by wynikało z  rzeczywistych potrzeb.

No cóż po takim nudnym wstępie przechodzę do konkretów. Zakładam, że mamy zainstalowane IDE SEGGERA i J-Linka , jeśli nie, to odsyłam do wcześniejszych artykułów na ten temat. Jeszcze tylko zdjęcie mojej płytki dla STM32G0 z programatorem :



Po uruchomieniu IDE SEGGERA, możemy być w oknie Dashboard albo w oknie projektu. W obu przypadkach wybierzemy sobie w menu File -> New Project, na pytanie czy utworzyć projekt w nowym Solution czy w bieżącym, wybieramy w nowym . wyskoczy nam okienko jak poniżej :


W okienku podajemy nazwę projektu u mnie stm32g0_helloworld i wybieramy napis jak w podświetleniu .Przechodzimy do kolejnego okienka jak poniżej :


W powyższym okienku wybieramy model naszego MCU. w moim przypadku to STM32G071KBT6
W okienku tym możemy też sobie zmienić inne parametry takiej jak rodzaj kompilatora, wielkość stosu czy sterty. Ja zostawiam domyślne ustawienia.
W kolejnym okienku tylko Next


W kolejnym również tylko Next :


i Finish. Utworzony zostanie pusty projekt, który modyfikuję pod swoje potrzeby. Mój minimalistyczny projekt wygląda jak poniżej : 


Można się przerazić , że tak poskąpiłem zapisów i wpisów do rejestrów a jednocześnie chcę uzyskać zamierzony efekt w postaci migającej diody LED podłączonej do pinu PA8 na mojej płytce. Chciałem tym samym pokazać w ten przerysowany sposób, że programując na rejestrach mamy zawsze możliwość zminimalizowania zapisów jeśli tylko tego chcemy. Minimalistyczny kod , którym się posłużę w moim pierwszym Hello kompiluję (Ctrl+F7) potem Build (F7). Podłączam programator do płytki a płytkę do zasilania. Wgrywam wsad za pomocą ikonki wykrzyknika (Start Without Debugging). No i cóż dioda miga jak ta lala.
 
 

 
Weźmy sobie teraz zobaczmy jak posłużyć się Debuggerem do np. upewnienia się czy nasz zapis do rejestru GPIOA_MODER jest skuteczny. W tym celu klikamy z górnej belki narzędziowej ikonkę prostą w dół opisaną jako Start Debugging. Pojawi się okno debuggera przygotowanego do pracy jak poniżej :


W prawym dolnym okienku opisanym jako Registers1 rozwijamy menu Groups  i uaktywniamy moduł rejestrów GPIOA.


Zamykamy okienko z wyborem modułów klikając gdziekolwiek.


W prawym dolnym okienku pojawił nam się moduł GPIOA ze wszystkimi rejestrami jakie mamy do dyspozycji w module. Rozwińmy sobie rejestr MODER :


widzimy aktualne ustawienia we wszystkich polach bitowych rejestru i są to wartości 0x3 dla każdego pola co odpowiada bitowo 0b11 czyli wejście analogowe. My zerujemy zapisem w programie bit starszy i otrzymujemy 0b01 czyli ustawiamy tym samym nasz PA8 na wyjście. Sprawdźmy zatem czy tak się stanie fizycznie. W tym celu wybieramy z okienka debuggera opcję Step Over (F10) i ponawiając kliknięcie tej opcji przeskakujemy aż znacznik pojawi się za wierszem gdzie dokonujemy zapisu do rejestru MODER.


Widzimy , że w prawym dolnym okienku w polu bitowym MODER8 dokonała się zmiana i nowa wartość oznaczona na czerwono wynosi 0x1 czyli nasze ustawienie wynikowe 0b01 jest uprzejmie uwzględnione :).

Teraz zróbmy sobie inną zabawę. Zamykamy Debugger klikając Stop (ikonka kwadracika). Na poziomie wiersza z naszym wpisem do rejestru MODER klikamy jeden raz po lewej stronie, pojawi nam się czerwona kropa , która symbolizuje tzw punkt zatrzymania (Breakpoint).


Odpalamy Debaggera i z menu wybieramy View->Disassembly (Ctrl+F12). Po lewej stronie pojawi się okienko z asemblerową postacią naszego programu. No proszę możemy również liznąć asemblera i w oparciu o niego napisać sobie np. własnego prostego i wydajnego  RTOS-a :).


Przeskoczmy sobie do naszego wiersza gdzie zapisujemy do rejestru MODER. Aby to zrobić posłużymy się opcją Step Out , znacznik zatrzyma się automatycznie w wierszu gdzie stworzyliśmy nasz punkt zatrzymania czyli czerwona kropa. Tak działa "skakanie" automatyczne po punktach zatrzymania w programie. Takich punktów możemy stworzyć z J-Linkiem Edu Mini nieograniczoną ilości.


Ta krótką migawką , którą nawet nie liznąłem zagadnienia, chciałem pokazać , jak potężnym narzędziem jest debugger i jak bardzo potrafi ułatwić życie podczas programowania MCU.

No cóż płytka poprawnie działa i współpracuje z IDE SEGGERA-a i programatorem J-Link Edu Mini co mnie cieszy. Kolejny udany projekt i kolejny kamień milowy w samorozwoju.


Pozdrawiam

PICmajster
picmajster.blog@gmail.com
 

4 komentarze:

  1. czy pod tym IDE działa ST-LINK 2.1?

    OdpowiedzUsuń
  2. Tak ST-Link-a możemy przysposobić do pracy z IDE SEGGERA , nawet sam to kiedyś zrobiłem na jakimś Nucloidzie i działało bez problemu. Tutaj masz namiar jak to zrobić : https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board/
    Tak na marginesie to J-Linkiem zaprogramujemy Cortexy Microchipa w MPLABX-IDE i prawdopodobnie choć nie sprawdzałem w STM32 Cube.

    OdpowiedzUsuń
  3. kompilator segger czy GCC?

    OdpowiedzUsuń
  4. o to jest pytanie :) a w sumie to oba działają.

    OdpowiedzUsuń