Moduł STM32F103C8T6 Cortex-M3 ARDUINO

Od wielu lat z powodzeniem wykorzystuję platformę Arduino, bowiem są to urządzenia idealnie nadające się do niewielkich projektów. Niestety, do większych projektów średnia się one nadają. Doskwiera niska częstotliwość taktowania, mała ilość pamięci, brak wbudowanego RTC czy ograniczona ilość portów z przerwaniami. Warto jednak wiedzieć, że na rynku istnieją także inne rodzinny mikrokontrolerów, zaś szczególną popularność zdobywają układy firmy ST. Niestety jest to zupełnie inna grupa mikrokontrolerów, z dedykowanymi środowiskami programistycznymi. Na szczęście popularność Arduino sprawia, że często o sukcesie komercyjnym wśród amatorów decyduje kompatybilność danego urządzenia właśnie z Arduino. Jednym z takich modułów jest Stm32F103C8T6, reklamowany jako zgodny z Arduino. Postanowiłem sprawdzić, czy faktycznie można programować moduł za pomocą środowiska Arduino IDE oraz dedykowanych bibliotek.

Programy dla mikrokontrolerów STM32 można pisać wykorzystując zarówno środowiska komercyjne oraz bezpłatne IDE bazujące na kompilatorze ARM-GCC. Producent  udostępnił bezpłatnie także zestaw bibliotek Standard Peripherals Library wraz z przykładowymi programami dla większości oferowanych zestawów ewaluacyjnych. Dla entuzjastów Arduino istotne jest, że płytkę STM32F103C8T6 ARM STM32 Cortex-M3 ARDUINO można programować za pomocą środowiska Arduino. Dlaczego warto wybrać właśnie tę płytkę a nie np. płytkę Arduino opartą np o mikrokotroler Atmega 328? Poniższa tabela teoretycznie powinna rozwiać te wątpliwości.

Porównanie STM32F103C8T6 z Atmegą 328

Parametr STM32F103C8T6 Atmega 328
Zegar 72 Mhz 16 Mhz
CAN Tak Nie
I2C 2 1
SPI 2 1
Wejścia analogowe 10 8
Kanały PWM 15 6
UART 3 1
GPIO 32 24
Wbudowany RTC Tak Nie
Rozdzielczość ADC 12 bitów 10 bitów
Pamięć RAM 20 Kb 2 Kb
Pamięć FLASH 64 Kb 32 Kb
Zakres temperatur pracy -40 do 85 -40 do 85
Napięcie pracy 2 – 3.6V 1.8 – 5.5V
EEPROM brak (możliwość emulacji) 1024 bajty
Obudowa LQFP-48 TQFB-32, DIP-28
Rodzina STM32F1 Cortex-M3 Atmega 328

Jak widać stm32 jest lepszy pod każdym względem. Z najistotniejszych różnic dla mnie to rozbudowany system przerwań, DMA oraz wbudowany zegar RTC . Do tego płytka jest tania (około 11 zł) oraz posiada niewielkie wymiary.

STM32F103C8T6 to 32-bitowy mikrokontroler z rodziny STM32F1 z rdzeniem ARM Cortex-M3, który oferuje  wydajny 32-bitowy rdzeń RISC ARM Cortex-M3 działający na częstotliwości 72 MHz, wbudowaną pamięć flash 64 KB oraz pamięć RAM 20 KB. Na płytce wyprowadzono piny wejścia/wyjścia dla urządzeń peryferyjnych na dwóch szynach. Płytka oferuje dwa 12-bitowe przetworniki ADC, trzy 16-bitowe timery ogólnego zastosowania i dodatkowo jeden licznik PWM, a także standardowe i zaawansowane interfejsy komunikacyjne: I2C i SPI (maksymalnie po dwa) oraz trzy USART, USB i CAN.
Płytka może być zasilana napięciem od 2,0 do 3,6 V, zaś zakres temperatury pracy mieści się w zakresie od -40 do +85 °C (rozszerzony zakres sięga nawet do 105°C). Warto podkreślić, że układ oferuje zestaw trybów oszczędzania energii, co pozwala na budowanie układów o niskim poborze mocy.

Jaki programator?

Do zaprogramowania płytki STM32F1 ze środowiska Arduino IDE niezbędny jest programator, a raczej konwerter FTDI. Przynajmniej na początku, bowiem można wgrać bootloader, który umożliwi programowanie płytki bezpośrednio z zainstalowanego na niej portu USB. Wystarczy zwykły i tan programator. Ważne jednak, aby miał możliwość pracy w trybie 3,3V, aby nie uszkodzić układu. Można kupić uniwersalne programatory, które są wyposażone w zworkę przełączającą ich tryb pracy, odpowienio 5V lub 3,3V. Przykładowy programator, jaki użyłem to HW-417-V1.2.

Przykładowy programator HW-417-V1.2

Podłączenie konwertera (programatora) do płytki STM32:

Podłączenie programatora FTDI

STM32 Konwerter (patrząc na piny od góry i od lewej)
TX (A9) RX (2)
RX (A10) TX (3)
5V (3V3) 5V (4)
GND GND (6)

UWAGA! Po podłączeniu programatora, przed zaprogramowaniem płytki należy upewnić się, że zworka BOOT0 na płytce ustawiona jest na 1. Spowoduje to zatrzymanie programu. Po wybraniu w IDE portu COM płytki (a raczej programatora), można rozpocząć programowanie układu. Po zakończeniu wgrywania programu, należy ponownie zmienić położenie zworki BOOT0 na 0.

Przygotowanie środowiska Arduino IDE do pracy z płytką

Standardowo środowisko programistyczne Arduino IDE nie wspiera płytek STM32F103C8T6 ARM STM32 Cortex-M3, stąd należy dołączyć zestaw narzędzi dla tego mikrokontrolera. W tym celu należy otworzyć Preferencje i w pole Dodatkowe adresy URL do menadżera płytek wkleić adres: http://dan.drown.org/stm32duino/package_STM32duino_index.json a następnie kliknąć OK.

Następnie należy otworzyć Menadżer płytek korzystając ze ścieżki: Narzędzia -> Płytka: -> Menadżer płytek. W menadżerze wystarczy wpisać w pole wyszukiwania frazę: stm32f1xx. Wyświetli się cały szereg obsługiwanych modułów. Na koniec należy kliknąć instaluj.

Aby zaprogramować mikrokontroler przykładowym programem blink

Wpisz przykładowy kod, który co sekundę wyświetla „Hello world”:

void setup() {
	Serial.begin(115200); /
 
void loop() {
    Serial.println("Hello World!");
    delay(1000);
}

Następnie należy skonfigurować parametry płytki oraz połączenie z programatorem. Wystarczy wybrać właściwą płytkę z menażera płytek, w menu Narzędzia.

  • Płytka: Generic STM32F103T series.
  • Board part number: BluePill F103C8
  • Upload method: STM32 Cube programmer (DFU)
  • Port: /dev/port (port programatora FTDI lub właściwy numer portu COMx w Windows).

Po wpisaniu kodu, ale jeszcze przed przesłaniem go do płytki trzeba przełączyć zworkę BOOT0 na 1 i wcisnąć przycisk RESET. Następnie można przesłać program do mikrokontrolera przy użyciu programatora (Menu Szkic->Wgraj używając programatora). Proces programowania będzie wyświetlany w dolnym oknie IDE i wygląda podobnie jak poniżej.

Using Parser : Raw BINARY
Interface serial_posix: 115200 8E1
Version : 0x22
Option 1 : 0x00
Option 2 : 0x00
Device ID : 0x0410 (Medium-density)
- RAM : 20KiB (512b reserved by bootloader)
- Flash : 64KiB (sector size: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB
Write to memory
Erasing memory
 
Wrote address 0x08000100 (1.96%)
...
Wrote address 0x08003200 (98.16%)
Wrote address 0x080032f0 (100.00%) Done.
 
Starting execution at address 0x08000000... done.

Po wgraniu programu do mikrokontrolera, zmieniamy zworkę BOOT0 na 0 i resetujemy urządzenie. Efekt jego działania będzie widoczny po otwarciu monitora portu. Ważne, aby przestawić prędkość portu na 115200. Efekt wygląda tak:

Wgrywanie bootloadera

Zarówno konieczność użycia programatora, jak i wciskanie przycisku reset przed rozpoczęciem programowania jest męczące szczególnie dla użytkowników Arduino, bowiem nie było to wymagane w przypadku jego tradycyjnych wersji. Na szczęście da się w dość łatwy sposób przerobić płytkę tak, by  wyeliminować te niedogodności.

Konieczne będzie wgranie do płytki specjalnego bootloadera, który umożliwi programowanie mikrokontrolera bezpośrednio ze środowiska Arduino IDE. Aby wgrać bootloader do mikrokontrolera, należy wykonać kilka kroków (różnią się nieco w zależności od systemu operacyjnego):

Punkt wspólny dla wszystkich: Najpierw należy pobrać plik bootloadera, który będzie umieszczony w pamięci flash płytki – pobierz plik. Uwaga! Prawidłowy plik bootloadera to generic_boot20_pc13.bin

Wersja dla użytkowników Windows:

  1. Należy ze strony ST pobrać graficzny program STM32 flasher. Może być konieczne założenie bezpłatnego konta, aby możliwe było pobranie pliku. Po pobraniu należy program ten zainstalować. W programie należy zaznaczyć wybrać port COM i wcisnąć Next. Na kolejnym ekranie zaznaczyć Download to device i wybrać plik bootloadera generic_boot20_pc13.bin i zaznaczyć Jump the user program. Następnie ponownie Next i rozpocznie się programowanie.
  2. Podłączyć płytkę do computer za pomocą programatora jak to było opisane powyżej i wcisnąć przycisk RESET.
  3. W programie Open STMFlashLoader należy wybrać prędkość portu na 115200 oraz wybrać odpowiedni port COM. Pozostałe opcje mogą pozostać domyślne.
  4. Wciśnięcie przycisku NEXT spowoduje zaprogramowanie płytki.

Wersja dla użytkowników Linux oraz Mac OS

  1. Niezbędne będzie pobranie skrypty pythona stm32loader poleceniem pip install stm32loader (zakładam, że w systemie jest obecny interpreter pythona).
  2. Przełącznik BOOT0 musi być w pozycji 1.
  3. Następnie należy zresetować urządzenie przyciskiem RESET i wydać w terminalu polecenie: stm32loader -p /dev/cu.usbserial-A5XK3RJT -e -w -v generic_boot20_pc13.bin (/dev/cu.xxx należy zastąpić właściwym portem COM w systemie – można go np. odczytać w IDE arduino).

Proces programowania bootloadera wygląda mniej więcej jak poniżej:

Bootloader version 22
Chip id: 0x410 (STM32F10x Medium-density)
Supply -f [family] to see flash size and device UID, e.g: -f F1
Write 83 chunks at address 0x8000000…
Writing ████████████████████████████████ 83/83
Read 83 chunks at address 0x8000000…
Reading ████████████████████████████████ 83/83
Verification OK

Po zakończeniu wgrywania bootloadera należy przełączyć zworkę BOOT0 na 0. Od teraz, zamiast programatora, płytkę można programować poprzez obecne w urządzeniu złącze micro USB. Należy jedynie pamiętać, by w Arduino IDE dostosować opcje: port (port COM)  oraz upload method na Stm32duino bootloader.

Jeśli podczas programowania w Mac OS wyświetli się błąd: dyld: Library not loaded: /opt/local/lib/libusb-1.0.0.dylib, należy doinstalować dfu-util poleceniem brew install libusb (Mac OS). Jeśli programowanie bootloadera z jakiegoś powodu się nie powiedzie, trzeba zresetować urządzenie i spróbować ponownie (w przypadku Windows warto zrestartować komputer).

Po zainstalowaniu można wybrać właściwą płytkę z menażera płytek, wybierając odpowiedni moduł z menu Narzędzia.

  • Płytka: Generic STM32F103T series.
  • Board part number: BluePill F103C8
  • Upload method: STM32Duiono bootloader
  • Port: /dev/port (lub właściwy numer portu COMx w Windows).

Wnioski

  1. Przetestowałem kilka prostych kodów źródłowych z Arduinio i jak się okazuje – działają, lecz nie zbadałem jaka jest kompatybilność w praktyce z dostępnymi modułami/czujnikami/etc. Podejrzewam jednak, że biblioteki do niektórych urządzeń podłączanych do Arduino biblioteki mogą wymagać modyfikacji. Warto także podkreślić, że stm32 posiada logikę 3v, podczas gdy większość Arduino – 5v, lecz to nie stanowi dla mnie istotnego problemu.
  2. Użytkownicy przyzwyczajeni do prostoty rozpoczęcia pracy z Arduino mogą być zawiedzeni koniecznością wykorzystania programatora do programowania płytki lub koniecznością wgrania bootloadera, a to na pewno nie przysporzy modułowi zwolenników.
  3. Po kilkunastu zaprogramowaniach płytka przestała być widoczna w systemie jako USB. Nie wiem czy się zepsuła, czy przypadkowo usunąłem bootloader. Ponowna próba wgrania bootloadera zakończyła się błędami. Kolejna próba i tym razem problem rozwiązany.
  4. Być może niefortunnie porównałem opisywany moduł STM32F103C8T6 do Atmegi 328 zamiast do płytki Arduino Mega 2560, która jest o wiele bardziej rozbudowana. Jeśli już trzymać się platformy Arduino, wolałbym użyć w bardziej rozbudowanym projekcie właśnie Arduino Mega zamiast ryzykować brak kompatybilności bibliotek z stm32, które powinno się programować przy pomocy dedykowanych bibliotek przeznaczonych dla tego typu kontrolerów.
  5. Do zastosowań bardziej profesjonalnych lepiej jednak wybrać stm32. Arduino to przestarzałe kontrolery o zbyt niskich parametrach. Jest to jednak niezwykle popularna platforma ze względu na mnogość dokumentacji, bibliotek oraz „gotowców”. Zawiera toporne, ale za to od razu działające IDE, którego szczerze nie cierpię, ale wciąż używam do małych projektów. Rosnąca popularność stm32 sprawia, że nawet nowsza wersja płytki – DUE raczej nie odwróci trendu spadkowego Arduino – właśnie ze względu na brak pełnej kompatybilności. Mimo wszystko jest to świetne rozwiązanie do amatorskich projektów doskonale się do tego nadaje. Nie do przecenienia jest również wartość edukacyjna. Nie zawaham się także stwierdzić, że do mniejszych projektów Arduino jest lepsze od stm32, bowiem nie wymaga żadnej konfiguracji, a do tego ma o wiele mniejszy próg wejścia w porównaniu do stm32. A jeśli projektant ma pojęcie o programowaniu (nie tylko umiejętność wklejania wątpliwej jakości gotowego kodu), Arduino pozwala na budowanie naprawdę ciekawych projektów. Nie warto jednak zbytnio wierzyć w jakość dostępnych bibliotek komponentów i stosować je bezmyślnie bez przejrzenia kodu czy dogłębnych testów. Niektóre biblioteki są niedopracowane, niedokończone lub przerośnięte. Biblioteki służyć mogą jako przykład użycia np. czujnika czy innego komponentu oraz przykład jego obsługi. Często dopiero na podstawie takiego przykładu tworzę własne biblioteki. Na szczęście wady te nie ma większego znaczenia w projektach amatorskich – co najwyżej urządzenie nie będzie działać, zapętli się lub zwracać błędne parametry.
Total Page Visits: 2272 - Today Page Visits: 51
Tagi , .Dodaj do zakładek Link.

Dodaj komentarz

Twój adres email nie zostanie opublikowany.

9 + 1 =

This site uses Akismet to reduce spam. Learn how your comment data is processed.