Vývojové dosky STM Discovery a novšie Nucleo asi nie je treba čitateľom zvlášť predstavovať, vďaka firemnej politike STM pozitívne naklonenej bastleniu sú bežne dostupné v rozumnej cenovej hladine. Výkon súčasných MCU, veľkosť pamäte a možnosti on-board periférií umožňujú použitie real-time operačných systémov (RTOS, Zephyr …) ako prostredia pre beh aplikácií.
S nárastom komplexnosti pribúdajú ale aj problémy s ladením aplikácií a obsluhou niekedy celkom komplikovaných externých periférií pripojených k zberniciam MCU. Obsluha komunikačných modulov, GPS, špeciálnych senzorov vyžaduje nielen jednoduchú komunikáciu na zbernici I2C, SPI typu command-response, ale často aj programovanie módov periférie, kalibráciu, identifikáciu stavov, spracovanie blokov dát a pod. Odladenie takejto komunikácie počas vývoja aplikácie je niekedy veľmi komplikované a zdĺhavé, preto je niekedy použiť vhodné dočasné prostriedky na palube MCU pre priamu manipuláciu s externými perifériami bez komunikačných medzistupňov.
Jednou zo zaujímavých alternatív je možnosť použitia implementácie MicroPythonu, ktorý vznikol v roku 2015 ako implementácia Pythonu pre ARM-Cortex-M procesory. Tvorcovia sa snažia v rámci možností dodržať kompatibilitu s Python3. Oficiálne sú podľa dokumentácie podporované platformy pyboard (vlastný vývoj), ESP32, ESP8266 a WiPy/CC3200. Platforma STM32 oficiálne podporovaná nie je, čo je trocha zvláštne, pretože MCU použité v pyboard je STM32F4. Prelistovaním zdrojových kódov na GitHube zistíme, že MicroPython je portovaný okrem množstva iných platforiem aj na vybrané dosky Discovery a Nucleo od STM s podporou integrovaného hardware.
Predmetom tohoto príspevku je popis inštalácie MicroPythonu na doskách Nucleo32 a Nucleo64 s procesorom STM32L4 z prostredia Linuxu. Inštaláciu sme testovali v preddefinovaných konfiguráciách pre dosky Nucleo64 s výkonnejším procesorom STM32L476RG a Nucleo32 s menším procesorom STM32L432KC. Ak máte vlastné skúsenosti s inštaláciou na iných platformách, podeľte sa sa s nimi v diskusii pod článkom.
Príprava
Súčasťou dosiek Discovery a Nucleo je programátor ST-LINK 2.0, takže na programovanie nie je možné bez bastlenia použiť v dokumentácii popisovaný dfu mód ((Device Firmware Update), ktorý spočíva v prepnutí procesoru do režimu BOOT1, pripojenie USB programovacieho kábla na piny procesora a pomocou utility nahratie *.dfu súboru z repozitáru MicroPythonu.
Podstatne jednoduchšie je použiť integrovaný ST-LINK, k naprogramovaniu procesora ale potrebujeme získať firmware MicroPythonu vo formáte *.bin skompilovaním zdrojového kódu.
Pokiaľ ešte nemáte nainštalované vývojové prostredie, je potrebné nainštalovať kompilátory s príslušenstvom
apt-get install build-essential apt-get install git cmake unzip sudo apt-get install gcc-arm-none-eabi sudo apt-get install libstdc++-arm-none-eabi-newlib
K vlastnému zápisu firmware procesora budeme potrebovať vhodný programátor, existuje viacero možností, môžeme použiť STM32CubeProgrammer od STM alebo konzolovú aplikáciu st-link, ktorú stiahneme z GitHubu a štandardným postupom skompilujeme a nainštalujeme
git clone https://github.com/texane/stlink.git cd stlink make release cd build/Release sudo make install sudo ldconfig
Programátor ešte môže vyžadovať knižnicu libusb
sudo apt-get install libusb-1.0-0-dev
Funkčnosť programátora vyskúšame pripojením dosky Nucleo pomocou USB kábla k počítaču a spustíme
st-info --probe
Pre komunikáciu s mikrokontrolérom je vhodné mať nainštalovaný nejaký terminálový emulátor (minicom, CuteCom), postačí aj jednoduchý picocom.
sudo apt-get install picocom
Kompilácia
Z GitHubu stiahneme zdrojové kódy MicroPythonu
git clone https://github.com/micropython/micropython
Skompilujeme vlastný kompilátor Pythonu do bytecode
cd mpy-cross make
Prejdeme do adresára
cd ../ports/stm32
a opravíme zabudnutú chybu v Makefile. Pred vlastnou kompiláciou sa sťahujú z internetu zrojové kódy niektorých knižníc, repozitár pre knižnicu lwip býva často nedostupný, preto autori už túto knižnicu zaradili priamo do zdrojového kódu. Opravte riadok v Makefile
GIT_SUBMODULES = lib/lwip lib/mbedtls lib/mynewt-nimble lib/stm32lib
na
GIT_SUBMODULES = lib/mbedtls lib/mynewt-nimble lib/stm32lib
a spustite
make submodules
Na konci skompilujte firmware pre vašu cieľovú dosku, pre každú cieľovú dosku je vytvorený konfiguračný adresár v ./ports/stm32/boards a meno adresára je zároveň príznakom pre kompilátor. Pre dosku napr. NUCLEO_L476RG je príkaz na kompiláciu potom
make BOARD=NUCLEO_L476RG
Po kompilácii vznikol adresár build-NUCLEO_L476RG, v ktorom sa o.i. nachádzajú súbory firmware.bin, firmware.elf …
cd ./build-NUCLEO_L476RG
Zápis firmware do dosky je potom pomocou st-link jednoduchý
st-flash write firmware.bin 0x8000000
V prípade, že to s budúcim experimentovaním v MicroPython-e nejako preženiete, môžete kedykoľvek zápisom firmware systém vrátiť do pôvodného stavu.
Použitie
Po nahratí firmware doska komunikuje na virtuálnom sériovom rozhraní s rýchlosťou 115200 Bd. Emulátor spustíme pomocou
picocom -b 115200 /dev/ttyACM0
a po resete by sa MicroPython mal ozvať v interaktívnom móde známym promptom
>>>
Pre jednoduchšiu obsluhu hardware dosku sú pripravené hotové moduly Pythonu, príkazom
>>> help()
dostaneme výpis vlastností modulu pyb . Povinná jazda – bliknutie s LED na doske potom vyzerá takto
>>> import pyb >>> d = pyb.LED(1) >>> d.on() >>> d.off()
Podrobná dokumentácia k modulom, súborovému systému, hardware a pod. je v adresári ./docs, pomocou parametru v make si ju môžete vygenerovať do vhodného formátu.
Záver
Aj keď vyššie uvedený postup vyzerá komplikovano, v skutočnosti netrvá dlhšie ako pár minút. Na konci máte k dispozícii dosku s mikrokontrolérom, s ktorou môžete komunikovať v Pythone rovnako ako na štandardnom počítači a s podporou pripravených modulov riadiť hardware dosky.
Nechcem tu vyvolávať diskusiu o tom, či je STM32 s Pythonom lepšie alebo horšie ako čokoľvek iné, z praktického hľadiska ale pri vývoji ocenite možnosť priamo komunikovať s komplikovanými perifériami (vyskúšané pri vývoji zariadenia s impedančným konvertorom AD5933) pripojenými k prerifériám dosky (SPI, I2C, CAN …) bez potreby straty času pri vývoji pomocného komunikačného software.