W trzecim odcinku naszego kursu skupimy się na przygotowaniu i uruchomieniu prostej aplikacji, której celem będzie miganie diodą LED na płytce ewaluacyjnej. Jest to program mający za zadanie tylko i wyłącznie pokazanie procedury uruchomienia kodu na dodatkowym rdzeniu, która odbywa się w zupełnie inny sposób niż w przypadku popularnych układów z serii STM32, gdzie wystarczy wgrać kod z poziomu IDE do wbudowanej pamięci Flash mikrokontrolera.
Przygotowanie
W przypadku pisania kodu na mikroprocesory z serii STM32MP nie mamy zbyt dużego pola manewru w zakresie wyboru IDE, w jakim możemy ów kod napisać (o ile rozważamy tylko i wyłącznie darmowe środowiska programistyczne). Najlepiej sprawdza się w tym przypadku pakiet STM32CubeIDE, uruchomiony pod kontrolą systemu operacyjnego Ubuntu (choć osobiście używam Arch Linuksa, który także doskonale radzi sobie z tym zadaniem).
Na początek utworzymy nowy projekt, podążając zgodnie ze wskazówkami pokazanymi na rysunkach 1 i 2.
Ważne jest, aby wybrać odpowiednią płytkę, z której korzystamy – w przeciwnym razie nasz kod nie będzie miał szansy poprawnie zadziałać. Równie istotne jest wskazanie ścieżki do folderu, w którym znajdzie się nasz kod – później zapisywany będzie tam skompilowany kod naszego programu. Na kolejnym etapie konfiguracji (rysunek 3) zaznaczamy opcję generowania osobnych plików dla poszczególnych peryferiów. Jest to wygodne rozwiązanie ze względu na przejrzystość głównej części kodu, znajdującej się w pliku main.c.
W trakcie wybierania odpowiednich pinów mikrokontrolera (rysunek 4) ważne jest nie tylko samo wskazanie wyprowadzenia i opcjonalne ustawienie jego nazwy (dla ułatwionego użycia w kodzie – rysunek 5) – kluczowe okazuje się bowiem zaznaczenie, który rdzeń będzie mógł korzystać z portu (rysunek 6). Pozostawiając to ustawienie bez zmian, nie przypiszemy bowiem linii GPIO do żadnego z rdzeni, a co za tym idzie – nie będziemy mogli z tego wyprowadzenia korzystać.
Pisanie kodu
Napisanie kodu źródłowego odpowiedzialnego za miganie naszą diodą LED jest czynnością, którą możemy porównać do pisania aplikacji „Hello World” podczas nauki nowego języka programowania. Niemniej jednak teraz chodzi nam przede wszystkim o umiejętność uruchomienia naszego kodu. W pierwszej kolejności musimy bowiem znać podstawy, pozwalające nam na skompilowanie i wykonanie programu, a w późniejszym czasie możemy nasz kod rozbudowywać. Znając podstawowe procedury pracy z płytką, zyskamy niemal nieograniczone pole manewru podczas realizacji bardziej rozbudowanych zadań.
Rysunek 7 pokazuje dokładnie miejsce, w którym znajduje się kod źródłowy naszego projektu.
Zmiany w kodzie wprowadzamy w pliku main.c, w pętli while(1). Ważne jest, aby wybrać folder z kodem dla rdzenia M4 i to w nim wprowadzać stosowne zmiany. Kod odpowiedzialny za miganie diodą LED składa się z 2 linijek – rysunek 8.
Po prawidłowym zbudowaniu kodu (CTRL + B w przypadku środowiska STM32CubeIDE) otrzymamy komunikat zbliżony do tego, który uwidoczniono na rysunku 9.
Wgranie i uruchomienie kodu
Skoro mamy już poprawnie zbudowany kod, a kompilator nie zwrócił nam żadnych błędów krytycznych, uniemożliwiających wygenerowanie kodu, to możemy przystąpić do jego wgrania i uruchomienia na płytce STM32MP. Jeśli natomiast kompilator zwróci błąd, należy przeanalizować kod pod kątem ewentualnych błędów składniowych oraz upewnić się, czy poprawnie przypisaliśmy port do naszego rdzenia, a także czy nazwa zgadza się z tą używaną w kodzie.
Wgranie pliku na płytkę odbywa się w taki sam sposób, jak miało to miejsce we wcześniejszym odcinku tego kursu. Różnice polegają na zmianie miejsca docelowego kodu i sposobu późniejszego jego uruchomienia.
Do nawiązania komunikacji z płytką używamy terminalu, w którym wywołujemy komendę:
W drugim oknie terminalu otwieramy ścieżkę do naszego folderu docelowego, w którym znajduje się kod źródłowy naszej aplikacji. Odszukujemy folder „Debug” – ważne jest, aby poszukiwań dokonać w folderze CM4, w którym znajduje się tylko kod przygotowany dla rdzenia Cortex-M4.
Rysunek 10 pokazuje zarówno ścieżkę, jak i lokalizację pliku.
Wgrywamy nasz kod maszynowy za pomocą komendy:
Należy pamiętać, że mówimy w tym przypadku o pliku z rozszerzeniem .elf.
Po wgraniu pliku na płytkę należy zweryfikować, czy został on poprawnie przesłany. W tym celu należy wywołać komendy:
a następnie:
(rysunek 11).
Następnie wprowadzamy polecenia:
echo ‘nazwa_pliku.elf’ > firmware
Uruchomienie kodu wymaga wywołanie dodatkowej komendy:
Działanie kodu sygnalizowane jest przez cykliczne świecenie diody LED LD9, znajdującej się po drugiej stronie płytki – fotografia 1.
inż. Wiktor Hubaj