MicroPython a STM32 na doskách Nucleo32 a Nucleo64

3. 12. 2019
Doba čtení: 4 minuty

Sdílet

Jednou z možností využitia výkonných MCU je implementácia aplikácií doteraz vyhradených len „dospelým“ počítačom, v našom príspevku sa budeme venovať inštalácii interpreteru Pythonu na platforme ARM.

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.

bitcoin_skoleni

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.

Autor článku

Vyštudoval experimentálnu fyziku na FMFI UK Bratislava a v súčasnej dobe pracuje na Výskumnom centre Žilinskej univerzity. Používa prevažne programovacie jazyky Python a C/C++ pre programovanie mikrokontrolérov (STM) a tvorbu modulov pre Python.

Vyštudoval elektrotechniku na Žilinskej univerzite a v súčasnej dobe pracuje na Katedre multimédií a informačno-komunikačných technológií. Používa programovací jazyk Python a C/C++.