STM32G0, STM32L0 czy STM32F0 – który wybrać?
W pewnym okresie rozwoju mikrokontrolerów spróbowano zastąpić mikrokontrolery 8-bitowe przez jednostki 32-bitowe. W rezultacie projektanci mieli przy podobnych kosztach układu dostać o wiele bardziej wydajne jednostki oferujące możliwości nie do osiągnięcia dla 8-bitowców.
Żeby to się udało należało jednak pokonać pewne bariery. Pierwszą za nich była cena mikrokontrolera. Klasyczne rdzenie 32-bitowe są optymalizowane do jak największej wydajności i funkcjonalności, co powoduje, że ich struktura jest skomplikowana i do jej realizacji są potrzebne płytki krzemowe o relatywnie dużej powierzchni. Dlatego też są droższe w produkcji w porównaniu z prostymi rdzeniami 8-bitowymi. Wyjściem z tej sytuacji byłoby zaprojektowanie rdzenia, który wciąż miałby sporo większą wydajność od jednostek 8-bitowych, ale jednocześnie byłby uproszczeniem klasycznych rdzeni 32-bitowych.
Rdzeń Cortex-M0
W odpowiedzi na te oczekiwania firma ARM zaprojektowała uproszczony rdzeń nazwany Cortex-M0, który miałby spełniać wymaganie połączenia odpowiedniej wydajności i niskiego kosztu produkcji. Warunkiem koniecznym była kompatybilność programowa z rdzeniami już istniejącymi na rynku. Otwierało to możliwość korzystania z istniejących już środowisk projektowych, kompilatorów, czy programatorów/debuggerów przeznaczonych dla klasycznych 32 bitowych mikrokontrolerów. Żeby obniżyć koszty projektu Cortex-M0 wzięto udany rdzeń Cortex-M3 i po prostu usunięto z niego część możliwości.
Kolejną modyfikacją wynikającą z uproszczenia struktury rdzenia było zredukowanie listy instrukcji do 56. Aby zapewnić oczekiwaną kompatybilność programową, wszystkie instrukcje Cortex-M0 są podzbiorem instrukcji większych rdzeni i są obsługiwane przez każdy z rdzeni Cortex–M – rysunek 1.
Rysunek 1. Zestaw instrukcji rdzeni Cortex-M
W kolejnym kroku usunięto moduł ochrony pamięci MPU i za jednym zamachem uproszczono układ przerwań (mniejsza ilość przerwań obsługiwana przez kontroler NVIC i układ debugowania). Te zmiany zaowocowały drastycznym, bo aż trzykrotnym zmniejszeniem powierzchni krzemu potrzebnej na zaimplementowanie rdzenia – z 0,12mm2 dla Cortex M-3 do 0,04 mm2 dla Cortex-M0. Dwukrotnie spadło też dynamiczne zapotrzebowanie mocy z 32 µW/MHz do 16 µW/MHz. Na pierwszy rzut oka wydawałoby się, że odniesiono sukces. Implementacja rdzenia jest tańsza, a pobór mocy wyraźnie mniejszy. Wiele firm, w tym ST, zaczęło stosować nowe rozwiązanie w swoich mikrokontrolerach. Tak powstała rodzina STM32F0, która miała konkurować ceną, poborem mocy i wydajnością z mikrokontrolerami 8-bitowymi.
Rdzeń Cortex-M0+
Jednak rzeczywistość trochę zredukowała optymizm projektantów rdzeni i producentów mikrokontrolerów. Cortex-M0 zastosowany w układach STM32F0, ale też w rodzinach innych producentów, nie do końca spełnił wszystkie pokładane w nim nadzieje. Odchudzanie rdzenia spowodowało przede wszystkim znaczące zmniejszenie wydajności z 1,25 DMIPS/MHz (Cortex M-3) do 0,84 DMIPS/MHz (Cortex-M0). Poza tym znaczne uproszczenie listy rozkazów spowodowało, że część operacji zamiast wykonywać się w jednej instrukcji wymagała aż dwóch instrukcji. ARM wydawał się też nie zauważyć specyfiki układów sterowania, w których używano szybkich 8-bitowych mikrokontrolerów. Często korzystano tam z szybkich operacji na liniach portów. Tymczasem w rdzeniu Cortex-M0 zastosowano dwutaktowy dostęp do linii portów, co wyraźnie spowalnia dostęp. Reklamowana 32–bitowa wydajność w cenie 8-bitowych jednostek nie do końca jednak została w praktyce zrealizowana.
Rodzina układow STM32F0 odniosła jednak pewien sukces, bo mikrokontroler oprócz rdzenia to także pamięć oraz układy peryferyjne. Do tego dochodzą środowiska programowe, kompilatory, wsparcie producenta w postaci modułów ewaluacyjnych czy gotowych bibliotek. Jednak sam rdzeń wymagał poprawy i ARM dokonał kolejnej modyfikacji dodając nowe możliwości, w tym te które wcześniej zostały usunięte:
- Dodano blok MPU ze sprzętowym podziałem pamięci na 8 chronionych obszarów,
- Umożliwiono dynamiczną relokację tablicy wektorów przerwań i wyjątków,
- Rozbudowano układ debugowania o dodatkowe bloki sprzętowe: Micro Trace Buffer, Breakpoint i data Watchpoint,
- Wprowadzono tryb uprzywilejowany z określoną ilością uprawnień,
- Wprowadzono szybki dostęp do linii I/O (jednotaktowy),
- Zmniejszono przetwarzanie potokowe z trzypoziomowego na dwupoziomowe.
Te działania zwiększyły wydajność do 0,93 DMIPS/MHz przy jednoczesnym dalszym ograniczeniu poboru mocy do 11 µW/MHz.
Nowy rdzeń nazwano Cortex-M0+ i obecnie jest implementowany w nowych mikrokontrolerach, w których wymagane są niskie koszty produkcji. Firma ST stosuje je w rodzinach STM32L0 i STM32G0.
Co wybrać?
Użytkownicy mikrokontrolerów STM32 mają do dyspozycji trzy rodziny prostych 32-bitowych mikrokontrolerów STM32:
- STM32F0 – historycznie najstarsza z rdzeniem Cortex-M0
- STM32L0 – optymalizowana pod względem niskiego poboru mocy z rdzeniem Cortex-M0+
- STM32G0 – najnowsza uniwersalna rodzina z rdzeniem Cortex-M0+ i niskim poborem mocy
Każda z tych rodzin dzieli się jeszcze na linie, które różnią się miedzy sobą wyposażeniem w układy peryferyjne oraz pojemnością pamięci programu i danych. Tak duża ilość możliwości może powodować trudności z optymalnym wyborem elementu do własnej aplikacji. Biorąc pod uwagę to, co zostało napisane wyżej, rodzina STM32F0, najstarsza i wyposażona w mniej udany rdzeń, powinna odpadać we wstępnej selekcji. Jednak STM32F0 są nadal produkowane i sprzedawane. Oznacza to, że powinniśmy się wstrzymać z daleko idącymi wnioskami, bo być może właśnie STM32F0 jest najbardziej właściwym wyborem. Zacznijmy więc od pokazania co mają do zaoferowania mikrokontrolery STM32F0.
STM32F0
Jak już wiemy, STM32F0 mają wbudowany rdzeń Cortex-M0, który może być taktowany częstotliwością do 48 MHz. Rodzina jest podzielona na 4 linie:
- STM32F0x0 Value Line przewidziana do bezpośredniej konfrontacji z dotychczas stosowanymi mikrokontrolerami 8-bitowymi i mniej wydajnymi 16-bitowymi.
- STM32F0x1 Access Line mająca wbudowane szereg układów peryferyjnych, a także dużą pamięć programu i danych, pozwalające na realizację bardziej rozbudowanych aplikacji nie wymagających dużej wydajności rdzenia.
- STM32F0x2 USB Line skierowana dla układów transmisji danych, w tym transmisji przez moduł komunikacyjny USB.
- STM32F0x8 Low Voltage Line przewidziana do zasilania niskim napięciem +1,8V (+/- 8%).
Zestawienie możliwości STM32F0 zostało pokazane na rysunku 2.
Rysunek 2. Zestawienie możliwości mikrokontrolerów z rodziny STM32F0
Mimo niezbyt wydajnego rdzenia (jak na 32 bitową jednostkę), STM32F0 broni się dobrym wyposażeniem w układy peryferyjne oraz dużą pamięcią programu i danych. Na rysunku 3 pokazano schemat blokowy mikrokontrolera STM32F030 z najniższej serii Value Line. Rdzeń Cortex-M0 taktowany częstotliwością 48 MHz uzupełniono pamięcią programu o pojemności 16 kB i danych – 4kB. Ma on także wiele układów peryferyjnych:
- 5-kanałowym układem DMA,
- Modułami komunikacyjnymi: 2 x SPI, 2 x I2C, 6 x USART,
- 12-bitowym modułem przetwornika analogowo-cyfrowego z 16 kanałami pomiarowymi oraz sensorem temperatury,
- Układami liczników: 16-bitowym licznikiem PWM dla układów sterowania silnikiem, pięcioma 16-bitowymi uniwersalnymi licznikami PWM, oraz dwoma 16-bitowymi licznikami uniwersalne ogólnego przeznaczenia.
To wszystko jest uzupełnione rozbudowanymi układami taktowania, układami watchdog’a oraz zegarem RTC. Ta specyfikacja przypomina bardzo dobrze wyposażone mikrokontrolery 8–bitowe, a przecież STM32F030 jest jednym z najmniej wyposażonym mikrokontrolerem w całej rodzinie STM32F0.
Rysunek 3. Schemat blokowy STM32F030 (Value Line)
STM32F0 Value Line
Na rysunku 4 przedstawiono portfolio mikrokontrolerów STM32F0 Value Line.
Rysunek 4. Portfolio STM32F0 Value Line
STM32F0 nie jest specjalnie optymalizowana pod kątem poboru energii tak, jak opisywana niżej rodzina STM32L0, ale jak każde współczesne mikrokontrolery ma wbudowane tryby oszczędzania energii, które pozwalają ograniczać pobór prądu. Na rysunku 5 pokazano typowe pobory dla różnych trybów pracy. Daje to możliwość porównań z innymi mikrokontrolerami.
Rysunek 5. Typowe pobory prądu dla różnych trybów oszczędzania energii STM32F0
Mikrokontrolery STM32F0 Value Line są jednymi z najprostszych w całej ofercie 32-bitowych mikrokontrolerów STM32 i powinny rywalizować z 8-bitowcami w mniej wymagających zastosowaniach, a także tam, gdzie się liczy cena. Na rysunku 6 pokazane jest zestawienie tych mikrokontrolerów z uwzględnieniem jednostkowej ceny przy zamówieniu 10 000 sztuk. To zestawienie jest generowane przez selektor mikrokontrolerów STM32CubeMX i powinno dawać pojęcie o zakresie cen.
Rysunek 6. Zestawienie STM32F0 Value Line z uwzględnieniem cen
Najtańszy element STM32F030F4Px w obudowie TSSOP20 kosztuje 0,385$. W związku z tym przy dużych partiach produkcyjnych STM32F0 Value Line, jeżeli tylko spełnia techniczne wymagania projektu, może być cenowo bardzo atrakcyjną opcją.
STM32F0 USB Line
W wyższych liniach, na przykład w STM32F0x2 USB Line, jest jeszcze lepiej jeśli chodzi o wyposażenie w układy peryferyjne i pamięć. Schemat blokowy STM32F072 i portfolio tej linii zostały pokazane na rysunkach 7 i 8.
Rysunek 7. Schemat blokowy mikrokontrolera STM32F072
Rysunek 8. Portfolio linii STM32F0x2 USB Line
Jedną z ważniejszych cech STM32F0x2 jest dodanie modułu komunikacyjnego USB 2.0 FS, nie wymagającego taktowania stabilizowanym kwarcem. Układy komunikacyjne ponadto uzupełniono o interfejs CAN, SPI z możliwością konfigurowania jako I2S, a także HDMI. Oczywiście to musi odbić się na cenie mikrokontrolerów – rysunek 9.
Rysunek 9. Zestawienie modeli z serii STM32F0x2 z uwzględnieniem cen