Implementacja systemu Linux na platformie STM32MP (3). Obsługa rdzenia Cortex-M4 w STM32MP1

Implementacja systemu Linux na platformie STM32MP (3). Obsługa rdzenia Cortex-M4 w STM32MP1

Gdy tworzymy aplikacje z użyciem procesora aplikacyjnego z serii STM32MP, zazwyczaj zależy nam na zachowaniu maksymalnej wydajności układu. W tym celu do sterowania portami GPIO, jak również do wykonywania części zadań obliczeniowych, lepiej byłoby zastosować dodatkowy, mniejszy rdzeń. Układy z serii STM32MP1 oferują w tym celu zintegrowany rdzeń Cortex-M4, a procesory z rodziny STM32MP2 mają wbudowaną jednostkę Cortex-M33.

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).

Rysunek 1. Kolejność wybierania opcji projektu w środowisku STM32CubeIDE

Na początek utworzymy nowy projekt, podążając zgodnie ze wskazówkami pokazanymi na rysunkach 1 i 2.

Rysunek 2. Podstawowe dane w oknie tworzenia projektu

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.

Rysunek 3. Konfiguracja menedżera projektu

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ć.

Rysunek 4. Wybór funkcji wyprowadzenia GPIO
Rysunek 5. Przypisanie opcjonalnej nazwy pinu GPIO
Rysunek 6. Przypisanie rdzenia do wyprowadzenia GPIO

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.

Rysunek 7. Widok drzewa projektu w środowisku IDE

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.

Rysunek 8. Kod odpowiedzialny za miganie diodą LED

Po prawidłowym zbudowaniu kodu (CTRL + B w przypadku środowiska STM32CubeIDE) otrzymamy komunikat zbliżony do tego, który uwidoczniono na rysunku 9.

Rysunek 9. Komunikat potwierdzający skompilowanie projektu

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ę:

ssh root@<ip_płytki>

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.

Rysunek 10. Ścieżka pliku z kodem programu na rdzeń Cortex-M4

Wgrywamy nasz kod maszynowy za pomocą komendy:

scp ‘nazwa_pliku’ root@<ip_płytki>:/lib/firmware

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:

cd /lib/firmware

a następnie:

ls

(rysunek 11).

Rysunek 11. Wywołanie komendy ls w celu weryfikacji poprawnego wgrania pliku

Następnie wprowadzamy polecenia:

cd /sys/class/remoteproc/remoteproc0
echo ‘nazwa_pliku.elf’ > firmware

Uruchomienie kodu wymaga wywołanie dodatkowej komendy:

echo start > state
Fotografia 1. Widok płytki ewaluacyjnej z włączoną diodą LED LD9

Działanie kodu sygnalizowane jest przez cykliczne świecenie diody LED LD9, znajdującej się po drugiej stronie płytki – fotografia 1.

inż. Wiktor Hubaj

Artykuł ukazał się w
Elektronika Praktyczna
luty 2025
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik czerwiec 2025

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio maj - czerwiec 2025

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje maj 2025

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna czerwiec 2025

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich czerwiec 2025

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów