STM32 to rodzina 32-bitowych mikrokontrolerów produkcji STMicroelectronics. Układy te bazują na rdzeniu z serii ARM Cortex-M. W zależności od wersji, charakteryzują się małym poborem mocy lub bardzo dużą prędkością i bogatym wyposażeniem. Układy te mogą być taktowane przebiegiem o maksymalnej częstotliwości do 32 MHz (STM32L0) lub do 216 MHz (STM32F7). Wersje STM32F7, STM32F4 oraz STM32F3 bazujące na rdzeniach Cortex-M4F mają wsparcie dla obliczeń zmiennoprzecinkowych (FPU) oraz cyfrowego przetwarzania sygnałów (DSP). Mikrokontrolery te mają również wiele interfejsów: SPI, UART, I²C, I²S, a w niektórych wersjach również wbudowane interfejsy USB 1.1, USB 2.0 oraz Ethernet.
Ich producent, firma STMicroelectronics, opracował zestaw bibliotek Hardware Abstraction Layer (HAL), umożliwiający programowanie tych mikrokontrolerów w nieskomplikowany sposób, z użyciem języka wysokiego poziomu. Dzięki temu nie ma konieczności zagłębiania się ani w obszerną specyfikację układu, ani rdzenia ARM. Wraz z bibliotekami HAL, producent dostarcza również program STM32CubeMX. Jest to graficzny generator konfiguracji mikrokontrolera, pozwalający na skonfigurowanie wszystkich wyprowadzeń, interfejsów, liczników oraz taktowania całego układu, a następnie na wygenerowanie gotowego projektu dla różnych środowisk IDE. Wszystko to sprawia, że programowanie tak zaawansowanego mikrokontrolera jest niemal równie łatwe i intuicyjne, jak np. programowanie platformy Arduino.
Podczas tworzenia tego kursu korzystałem z płytki rozwojowej Kamami KA-NUCLEO-F411CE mającej zamontowany układ mikrokontrolera STM32F411CEU6. Ma on interfejs USB 2.0 (do dyspozycji użytkownika), pięć interfejsów SPI, pięć I²S, trzy I²C, trzy USART, sześć liczników 16-bitowych oraz dwa 32-bitowe i może być taktowany przebiegiem o częstotliwości maksymalnej 100 MHz. Na płytce, oprócz właściwego mikrokontrolera, zamontowano również prostszy układ STM32F103C8U6, pełniący funkcję programatora ST-LINK z wyjściem USB. Płytka ma wyprowadzenia zgodne z Arduino, wbudowany przycisk do dyspozycji użytkownika oraz trójkolorową diodę LED RGB. Większość omawianych przykładów będzie możliwa do wykonania na dowolnej innej płytce rozwojowej z układem STM32F4, jednak zachęcam do zakupu tej konkretnej, mającej zamontowane wymienione elementy.
W trakcie wykonywania przykładów korzystać będziemy z omówionego wcześniej programu STM32CubeMX. Jest on dostępny dla Windowsa, Linuksa oraz macOS. Możemy go pobrać ze strony producenta – jest dostępny pod adresem www.st.com. Drugim potrzebnym programem jest bazujące na Eclipse środowisko programistyczne System Workbench for STM32. Również i ono jest dostępne w wersjach dla różnych systemów operacyjnych. Możemy je pobrać ze strony projektu po uprzedniej rejestracji lub dodać jako plug-in do już zainstalowanego programu Eclipse. Oprogramowanie jest dostępne pod adresem www.openstm32.org. Przy instalowaniu jako plug-in do Eclipse będziemy jeszcze potrzebowali sterowników dla programatora ST-LINK, które w pierwszym przypadku instalują się wraz z System Workbench for STM32. Oba omawiane programy wymagają do swojego działania wirtualnej maszyny Java, którą możemy pobrać spod adresu www.oracle.com.
Witaj migająca diodo!
Pierwszym projektem będzie mikrokontrolerowy odpowiednik programu „Hello World!”, znanego z nauki różnych języków programowania, czyli program, którego zadaniem będzie naprzemienne zapalanie i gaszenie diody znajdującej się na płytce rozwojowej. Podczas tworzenia tego projektu przyjrzymy się podstawom korzystania z programu STM32CubeMX – konfiguracji funkcji wyprowadzeń, sygnału taktującego rozchodzącego się po mikrokontrolerze oraz środowisku System Workbench for STM32, w którym napiszemy kod naszej aplikacji, skompilujemy i załadujemy do mikrokontrolera.
Generowanie projektu w STM32CubeMX
Po uruchomieniu programu STM32CubeMX i utworzeniu w nim nowego projektu, klikamy w przycisk New project. Pierwszym oknem, które ujrzymy, będzie pokazane na rysunku okno kreatora wyboru mikrokontrolera. Możemy tutaj od razu wybrać z list rozwijanych model posiadanego przez nas układu oraz przejść dalej, klikając OK. Na wykorzystywanej przeze mnie płytce Kamami KA-NUCLEO-F411CE zamontowano układ z serii STM32F411CEUx w obudowie UFQFPN48, więc mój wybór był oczywisty.
Kreatora możemy jednak również używać „odwrotnie”, to znaczy może on sugerować wybór układu do projektowanego przez nas zastosowania. Z listy po lewej stronie wybieramy wszystkie funkcje i interfejsy mikrokontrolera, których potrzebuje do działania nasze urządzenie, a po prawej stronie okna otrzymujemy listę wszystkich mikrokontrolerów z rodziny STM32, które spełniają nasze wymagania. Możemy w ten sposób wybrać układ spełniający nasze oczekiwania, kierując się różnymi kryteriami. W podobny sposób, w drugiej zakładce, jesteśmy też w stanie wybrać płytkę rozwojową. Na liście są jednak tylko płytki wyprodukowane przez producenta układów STM32 – firmę STMicroelectronics.
Po wyborze mikrokontrolera przechodzimy do właściwego okna programu STM32CubeMX. W pierwszym jest widoczna obudowa mikrokontrolera wraz ze wszystkimi jego wyprowadzeniami oraz (na liście po lewej stronie) lista komponentów, które możemy skonfigurować. Należą do nich wszystkie liczniki i interfejsy, ale nie tylko. Zazwyczaj są to też funkcje alternatywne poszczególnych wyprowadzeń. Z tego względu, większość peryferii, które możemy skonfigurować w tej zakładce, możemy ustawić na dwa sposoby – albo klikając prawym przyciskiem myszy na wyprowadzenie i wybierając jedną z jego funkcji, tj. wejście/wyjście GPIO, wejście konwertera A/C, czy wyjście interfejsu UART, albo ustawiając tę funkcję na liście po lewej stronie i przenosząc metodą przeciągnij – upuść odpowiednio skonfigurowane wyprowadzenie w inne miejsce.
To, co powinniśmy ustawić w tej zakładce, to wejście przebiegu zegarowego dostarczającego sygnał taktujący do mikrokontrolera, o ile taki znajduje się na naszej płytce. Mikrokontrolery STM32 mają wbudowany generator RC, jednak do niektórych zastosowań jego stabilność jest niewystarczająca. Na płytce KA-NUCLEO-F411CE zamontowano dwa oscylatory kwarcowe wspomagające pracę generatorów HSE (o wysokiej częstotliwości) i LSE (o niskiej częstotliwości). W tej chwili potrzebujemy ustawić jedynie pierwszy z nich. Będzie on źródłem sygnału taktującego dla całego układu. Drugi – LSE, jest wykorzystywany jako źródło częstotliwości dla bloku odmierzającego czas rzeczywisty (RTC). Nie będziemy go jednak w tej chwili konfigurować.
Z listy po lewej stronie rozwijamy kolejno Peripherials → RCC i z listy rozwijanej w polu High Speed Clock (HSE) wybieramy pozycję Crystal/Ceramic Resonator. Spowoduje to załączenie funkcji alternatywnych dwóch wyprowadzeń mikrokontrolera – do nich jest fizycznie przyłączony oscylator na używanej przez nas płytce rozwojowej.
Kolejną rzeczą, którą zrobimy, będzie skonfigurowanie wyprowadzenia, do którego jest dołączona dioda LED, jako GPIO_Output, tak abyśmy mogli ją włączać i wyłączać. Wykorzystamy tutaj diodę RGB znajdującą na płytce KA-NUCLEO-F411CE, a konkretnie jej jedną część odpowiadającą za świecenie w kolorze niebieskim. Dioda ta jest przyłączona do wyprowadzenia PB13 (kolor czerwony to PB14, a zielony to PB15). Należy zwrócić uwagę, że dioda będzie świeciła, gdy odpowiednie wyjście zostanie wyzerowane, oraz gasnąć, gdy zostanie ustawione. Tryb pracy wyprowadzeń GPIO_Output ustawiamy, klikając lewym przyciskiem myszy na pin i wybierając z listy funkcję, którą ma pełnić. Dodatkowo, możemy też kliknąć na symbolu wyprowadzenia prawym przyciskiem myszy, wybrać z menu Enter User Label i nadać mu nazwę symboliczną – tutaj RGB_BLUE. Będziemy z niej później korzystali w programie, odwołując się zarówno do portu, do którego jest przyłączona dioda niebieska, jak i do konkretnego wyprowadzenia tego portu.