[1] STM32CUBE w przykładach

Generowanie projektu i import do System Workbench

Generowanie projektu dla System Workbench w STM32CubeMX

 

Po przygotowaniu konfiguracji startowej w STM32CubeMX możemy już wygenerować projekt dla środowiska IDE w którym napiszemy kod. Robimy to klikając w zębatkę na pasku narzędziowym okna CubeMX. Następnie w nowootwartym oknie wpisujemy nazwę projektu i wybieramy lokalizację w której chcemy go wygenerować. Domyślnie jest to podfolder na pulpicie lub w katalogu domowym użytkownika. Jest to dobry wybór gdy w nazwie naszego użytkownika nie występują polskie znaki. Jeśli zdecydujemy się wybrać inny folder, w jego ścieżce dostępu również nie mogą występować polskie znaki. W polu “Toolchain/IDE”, z listy rozwijanej wybieramy pozycję SW4STM32 oznaczającą System Workbench for STM32, z którego zaraz skorzystamy. W kolejnej zakładce możemy zaznaczyć jeszcze opcję “Generate peripherial initialization as pair of ‘.c/.h’ files per peripherials”, która spowoduje rozdzielenie całej konfiguracji startowej na większą ilość plików. Podczas pierwszego generowania projektu, CubeMX zapyta nas czy chcemy pobrać firmware oraz bibliotekę HAL – odpowiadamy twierdząco i czekamy na zakończenie pobierania. W folderze projektu oprócz plików projektu System Workbench, zapisany zostanie dodatkowo plik .ioc przechowujący informację o obecnych ustawieniach w CubeMX. Przy jego pomocy możemy zmieniać konfigurację w trakcie rozwoju projektu, nie tracąc przy tym już napisanego kodu, jeśli zastosujemy się do znaczników znajdujących się w plikach.

Uruchamiamy środowisko System Workbench for STM32. Program zapyta nas gdzie chcemy umieścić naszą przestrzeń roboczą. W praktyce, przechowywana będzie tam tylko konfiguracja środowiska. Polecam tutaj pozostać przy domyślnej wartości, jeśli nie korzystamy z żadnej innej instalacji Eclipse. Po otwarciu programu, zamykamy kartę “Welcome”, krzyżykiem znajdującym się obok jej nazwy. Teraz w pustym polu w panelu “Project Explorer” klikamy prawym przyciskiem myszy i z menu kontekstowego wybieramy polecenie “Import”. Na pierwszej planszy kreatora wybieramy “General” -> “Existing Projects into Workspace”. Następnie klikamy przycisk “Browse…”, znajdujący się obok napisu “Select root directory”, nawigujemy do folderu projektu wygenerowanego przez STM32CubeMX, wybieramy go i klikamy przycisk “Finish”. Spowoduje to zaimportowanie projektu.

Edycja pliku main.c w programie System Workbench

 

Teraz możemy przyjrzeć się zawartości wygenerowanego przez CubeMX projektu. W folderze Drivers\STM32F4xx_HAL_Driver znajdują się biblioteki z których korzystać będziemy w trakcie pisania programów. W praktyce to właśnie tam szukać będziemy pomocy na temat działania poszczególnych funkcji. Przed kodem każdej z nich znajduje się komentarz na temat jej działania, przyjmowanych parametrów oraz zwracanej wartości. W folderze Src znajduje się obecnie wygenerowana konfiguracja startowa. Tam też umieszczać będziemy wszystkie pliki zawierające kod źródłowy naszych programów.

Kod programu

Plik w którym umieścimy nasz program, to “main.c”. Składa się on z wielu sekcji rozdzielonych komentarzami, zawierającymi słowa kluczowe BEGIN oraz END. Tylko pomiędzy tymi komentarzami umieszczać możemy nasz kod. W przeciwnym wypadku, po zmienia konfiguracji w programie STM32CubeMX i wygenerowaniu na nowo projektu, stracimy te fragmenty kodu które znalazły się pomiędzy blokami. Wykonywanie naszego programu rozpoczyna się od funkcji main(). Na jej początku następuje wywołanie funkcji inicjalizującej poszczególne peryferiale mikrokontrolera. Następnie wykonywany jest kod użytkownika, przed oraz w pętli głównej. Sekcja “USER CODE 2” jest odpowiednikiem Arduinowej funkcji setup(), w niej umieścić możemy kod mający zostać wykonany przed pętlą, po uruchomieniu urządzenia. “USER CODE 3” to natomiast odpowiednik funkcji loop() – sekcja ta będzie wykonywana w pętli, w nieskończoność, aż do wyłączenia urządzenia. Ponieważ całą konfigurację pinów przeprowadziliśmy wcześniej, w programie CubeMX, do sekcji “USER CODE 3” dopiszemy jedynie poniższe cztery linijki kodu.

HAL_GPIO_WritePin(RGB_BLUE_GPIO_Port, RGB_BLUE_Pin, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(RGB_BLUE_GPIO_Port, RGB_BLUE_Pin, GPIO_PIN_RESET);
HAL_Delay(500);

Funkcja HAL_GPIO_WritePin() ustawia na wybranym pinie stan wysoki 3.3V (GPIO_PIN_SET) lub niski 0V (GPIO_PIN_RESET). “RGB_BLUE” to nazwa pinu nadana w czasie jego konfiguracji w STM32CubeMX. “RGB_BLUE_GPIO_Port” wskazuje na rejestr portu obsługującego dany pin, a “RGB_BLUE_Pin” oznacza pozycję pinu w tym porcie. Funkcja HAL_Delay(500) zatrzymuje pracę mikrokontrolera na 500 milisekund. Jest to czekanie aktywne – w tym czasie procesor jedynie odlicza do zakończenia czekania i nie wykonuje żadnej akcji.

 

 W środowisku IDE Eclipse, po wpisaniu fragmentu nazwy funkcji lub zmiennej oraz wciśnięciu kombinacji klawiszy Ctrl+Spacja, program dopełni wpisywaną nazwę lub zaproponuje kilka możliwości dopełnienia. Kombinacja przycisków Ctrl+Shift+F, z kolei, uporządkuje nam wcięcia w kodzie.

 

Kompilacja, uruchamianie i debugowanie

Perspektywa debugowania w System Workbench

 

Na tym etapie możemy już skompilować nasz kod. Klikamy w tym celu ikonę młotka (Build), na pasku narzędziowym. Po zakończeniu kompilacji, w celu uruchomienia programu na mikrokontrolerze, klikamy ikonę robaka (Debug), również znajdującą się na pasku narzędziowym. W tym momencie, mikrokontroler powinien być podłączony do komputera kablem USB poprzez programator. Na płytce KA-NUCLEO-F411CE, port MicroUSB programatora, znajduje się obok przycisku RESET. Oprogramowanie System Workbench zapyta nas, w jaki sposób chcemy uruchomić aplikację. Dwukrotnie klikamy na pozycję “Ac6 STM32 C/C++ Application”, w nowootwartym oknie w polu “Debug Device” wybieramy “ST-LinkV2-1” i klikamy OK. Następnie zgadzamy się jeszcze na utworzenie perspektywy debugowania.

Perspektywy w Eclipse to różne konfiguracje głównego okna programu – każda z nich zawierać może inne paski narzędziowe i panele. Perspektywa debugowania przydatna jest do testowania działania naszej aplikacji, nie jest ona jednak wygodna do pisania kodu – okienko edytora jest w niej dużo mniejsze i nie mamy możliwości kompilowania kodu.

Po przejściu do perspektywy debugowania, uruchamiamy nasz program, klikając ikonę zielonej strzałki z żółtym prostokątem (Resume), na pasku narzędziowym. Nasz program jest teraz uruchomiony. Powinniśmy zobaczyć migającą diodę. Jeśli poza pinem PA13, w programie CubeMX, ustawiliśmy w tryb “GPIO_Output” również piny PA14 i PA15, odpowiadające za pozostałe kolory diody (czerwony i zielony), nasza dioda będzie świecić raz na biało, a raz na żółto. Nie będzie natomiast całkiem gasnąć. Aby temu zaradzić, musimy ustawić na pinach PA14 i PA15 stan wysoki w sekcji “USER CODE 2”. Pamiętajmy, że diody podłączone są od napięcia dodatniego 3.3V do pinu mikrokontrolera, na którym, po ustawieniu go w stan wyjścia GPIO mamy napięcie 0V.

Aby przerwać debugowanie, należy zaznaczyć sesję debugowania w panelu Debug i usunąć ją przyciskiem Del. Następnie możemy powrócić do perspektywy pisania kodu (przycisk “C/C++” w prawym górnym rogu okna). Jest to o tyle ważne, że jeśli nie usuniemy sesji, nie będziemy mogli ponownie uruchomić programu.

W trybie debugowania, możliwe jest także zatrzymywanie działania programu, po dojściu do określonej linii kodu. Możemy wtedy podglądać zawartość zmiennych i rejestrów, a także ją modyfikować. Aby zatrzymać wykonywanie kodu, odnajdujemy wybraną linię kodu i dwukrotnie klikamy w niebieski pasek po lewej stronie. Powoduje to dodanie breakpointa. Usuwamy go w analogiczny sposób, podwójnym kliknięciem. Aby wznowić działanie programu klikamy przycisk strzałki (Resume).

Aleksander Kurczyk