[PROJEKT] STM32Cube graficzny konfigurator STM32
STM32 to olbrzymia rodzina mikrokontrolerów z rdzeniami z rodziny ARM Cortex-M. W jej skład wchodzą zarówno stosunkowo proste układy z rodzin STM32F0/L0 jak i zaawansowane STM32F4, czy najnowsze STM32F7 z rdzeniem Cortex-M7. Z oczywistych powodów nie jest możliwe, by konfigurowanie bloków peryferyjnych STM32F0 mogło się odbywać w taki sam sposób jak STM32F4. Również w obrębie tej samej rodziny mogą występować spore różnice wynikające z wyposażenia poszczególnych układów. To wszystko powoduje, że wstępny etap projektu polegający na konfigurowaniu bloków peryferyjnych, układu przerwań, układu taktowania i napisaniu prostych driverów urządzeń peryferyjnych może być bardziej pracochłonny niż napisanie właściwej aplikacji. Szczególnie uciążliwe jest zapoznawanie się z dokumentacjami zawierającymi opisy rejestrów konfiguracyjnych i wielu programistów nie miało by nic przeciw temu by ktoś za nich ten etap pracy wykonał.
Programiści Corteksów czasu mają do dyspozycji biblioteki CMSIS (Cortex Microcontroller Software Interface Standard). Jest to uniwersalny interfejs programowy, który umożliwia obsługę bloków peryferyjnych i rdzenia Cortex wykorzystując do tego celu zestandaryzowane funkcje, makra i definicje. Funkcje CMSIS wspierają też użycie systemów operacyjnych czasu rzeczywistego, middleware oraz aplikacji używających interfejsy komunikacyjne np. I2C, UART, SPI i Ethernet. Każdy z producentów mikrokontrolerów dostarcza swoje implementacje bibliotek z funkcjami obsługującymi własne peryferia.
Idea CMSIS opiera się na założeniu, że programy pisane na mikrokontrolery z rdzeniem Cortex, ale produkowane przez różnych producentów, mogą być w prosty sposób przenoszone na różne platformy sprzętowe. Drugim założeniem twórców standardu było uproszczenie etapu konfiguracji i inicjalizacji układów peryferyjnych i rdzenia. Żeby było to możliwe funkcje CMSIS muszą mieć pewien stopień abstrakcji. Oznacza to, że „ukrywają” one przed programistą działania na rejestrach konfiguracyjnych. Tworzy się w ten sposób umowna warstwa HAL – Hardware Abstraction Layer. Takie podejście zostało różnie odebrane w środowisku programistów. Część z nich zaczęła chętnie stosować gotowe biblioteki, ale dla innych CMSIS było tylko nie potrzebnym komplikowaniem programowania. Wątpliwości, czy niechęć wynikały po części z przyzwyczajeń i chęci panowania nad wszystkim co się dzieje w programie. Trochę to przypominało przejście od programowania w asemblerze do programowania w C.
Drugim, dużo poważniejszym argumentem przeciw CMSIS, była spora ilość błędów w tych bibliotekach i nadmierne wykorzystywanie zasobów mikrokontrolera. Dodatkowo procedury obsługi peryferiów potrafiły czekać w nieskończoność na zmianę stanu jakiegoś bitu zatrzymując skutecznie działanie całej aplikacji. Część z programistów wybrało rozwiązanie pośrednie: patrzymy jak to zrobiono w CMSIS i na podstawie tego robimy po swojemu.
Ponieważ CMSIS jest obecne na rynku już przez wiele lat, to większość błędów zostało poprawionych, a funkcje zoptymalizowane i dostosowane do wykorzystania w różnych konfiguracjach implementacji interfejsu API: polling, przerwania lub DMA. Jednak samo użycie bibliotek, chociaż sporo ułatwia (przy założeniu, że nie mają błędów) nie zwalnia całkowicie od ręcznej konfiguracji mikrokontrolera. I tutaj z pomocą przychodzi rozwiązanie oferowane przez STM nazwane STM32CUBE.
Ideą przyświecającą powstaniu STM32CUBE było ułatwienie konstruktorom życia przez znaczne zredukowanie wysiłku włożonego w projekt i tym samym ograniczenie czasu potrzebnego na wykonanie projektu. Pakiet STM32CUBE składa się z :
- graficznego środowiska STMCubeMX generującego kod w języku C na podstawie własnego projektu,
- platformy programowej dostarczanej osobno dla każdej z rodzin mikrokontrolerów i zawierającą warstwę STM32Cube HAL zapewniającą obsługę wszystkich mikrokontrolerów STM32 oraz zgodne z tą warstwą komponenty programowe middleware takie jak RTOS, stos USB, stos TCP/IP i biblioteka graficzna.
Pracę z STM32Cube rozpoczynamy od pobrania ze strony stm.com i zainstalowania pakietu STM32CubeMX. Jak w innych tego typu programach narzędziowych praca odbywa się w oparciu o plik projektu. Na ekranie powitalnym są wyróżnione dwie akcje: tworzenie nowego projektu – New Project i otwieranie wcześniej zapisanego projektu – Load Project.
Zaczynamy od tworzenia nowego projektu. Jednym z pierwszych zadań konstruktora urządzeń embeded jest wybór mikrokontrolera. Nie jest to zadanie proste nawet wtedy, kiedy już zdecydowaliśmy się na mikrokontroler rodziny STM32. Portfolio tego producenta jest obszerne i składa się z bardzo dużej liczby produkowanych układów różniących się nie tylko ilością układów peryferyjnych, rozmiarem pamięci, ale nawet architekturą rdzenia. Przejrzenie tylko pierwszych stron kart katalogowych może zabrać sporo czasu. STM32CubeMX stara się pomóc poruszać w gąszczu możliwości oferując rozbudowany układ selektora mikrokontrolerów – rysunek 2.
Okno wyboru ma dwie zakładki: MCU Selector i Board Selector. W przypadku MCU Selector można filtrować potrzebne zasoby wybierając:
- rodzinę STM32,
- linie STM32: na przykład STM32F0x0 Value Line,
- obudowę układu: na przykład LQFP64,
- inne filtry: na przykład ze względu na ilość linii I/O.
Alternatywnie dla filtrów można w oknie Peripherial Selection wybrać mikrokontroler ze względu na rodzaj i ilość układów peryferyjnych. Zakładka MCU Selector pozwala w szybki sposób znacznie zwęzić obszar poszukiwań i w konsekwencji wybrać odpowiednią jednostkę dla naszego projektu.
Duga zakładka Board Selector jest używana, kiedy chcemy wykonać projekt uruchamiany na płytkach ewaluacyjnych oferowanych przez STM. Modułów uruchomieniowych jest sporo i można je podzielić na trzy grupy:
- zestawy STM32Nucleo z mikrokontrolerami serii STM32F0, STM32F3, STM32F4, STM32L0,i STM32L1,
- zestawy Discovery z mikrokontrolerami serii STM32F0, STM32F3, STM32F4, STM32L0,i STM32L1,
- zestawy Evalboard z mikrokontrolerami serii STM32F0, STM32F1, STM32F2, STM32F3, STM32F4 i STM32L1.
Podobnie jak w zakładce MCU Selector tak i tu można filtrować wybierając kryteria: producenta (na razie tylko STM), rodzaju modułu (Nucleo, Discovery, Eval) i serii MCU (STM32F0, STM32F1 itp.). Wybór modułu dodatkowo ułatwia zdjęcie wyświetlające się po prawej stronie okna – rysunek 3.
Ja do dalszych testów działania STM32CUBE wybrałem zestaw STM32F4DISCOVERY z mikrokontrolerem STM32F407VG.
W zakładce Peripherial Selection można zobaczyć (oznaczone na zielono) układy peryferyjne możliwe do wykorzystania: akcelerometr, układ audio, przyciski, kompas, żyroskop, interfejs USB. Pod zdjęciem modułu są wyświetlone jego podstawowe właściwości, a po kliknięciu na przycisk Load User Manual jest automatycznie pobierana i otwierana instrukcja użytkownika. Dodatkowo po kliknięciu na Link to ST WebSite otwiera się firmowa strona z opisem modułu i wszystkim dostępnymi materiałami typu noty aplikacyjne, przykładowe programy, schematy itp.
Zatwierdzenie wybranego modułu powoduje przejście do kolejnego etapu tworzenia projektu. Otwiera się główne okno projektu z zakładkami:
- Pinout,
- Clock Configuration,
- Configuration,
- Power Consumption Calculator.