MicroPython su Nucleo F401RE

Intro

Lo scopo di questa chiacchierata è descrivere una procedura per caricare il firmware MicroPython sulla scheda NUCLEO, utilizzando il sistema Ubuntu 18.04 LTS (Bionic).

MicroPython è un’implementazione leggera ed efficiente del potente linguaggio di programmazione Python 3, include un piccolo sottoinsieme della Python standard library e risulta ottimizzato per girare su microcontrollori e in ambienti a  risorse limitate. Potenzialmente la disponibilità di MicroPython su scheda Nucleo è in grado di portare vari benefici all’utente ad iniziare del fatto che si tratta di un linguaggio interpretato e relativamente facile da imparare, il che risulta interessante specialmente in campo didattico, in quanto la sua curva di apprendimento non viene considerata ripida. Con tali motivazioni apprestiamoci alla sua installazione.
Occorre notare che sul sito ufficiale viene reso disponibile il codice binario per STM32F401 (nella sezione: Firmware for other boards della pagina: https://micropython.org/download) per cui risulta possibile evitare di partire dalla fase di cross-compilation dei sorgenti di MicroPython. Scarichiamo quindi il file dell’ultima versione, al momento la 1.9.4: NUCLEO_F401RE-20180511-v1.9.4.dfu.

DFU

Il codice binario di MicroPython è quindi in formato .dfu. DFU significa Direct Firmware Update ed è una modalità per caricare un firmware (compreso un bootloader) su vari microcontrollori, tra cui la serie STM32F4 tramite una porta USB e le diffuse DFU utilities.

Il microcontrollore della NUCLEO è quindi compatibile dfu ma purtroppo non è così per la scheda a causa della presenza del debugger/programmer ST-LINK/V2-1 che andrà appositamente scavalcato. Infatti ad es. il comando Ubuntu:

$ lsusb

fornisce:

Bus 002 Device 029: ID 0483:374b STMicroelectronics ST-LINK/V2.1 (Nucleo-F103RB)

confermandoci che il computer non è collegato al microcontrollore principale STM32 della NUCLEO. Quindi, nella sola fase di installazione di micropython e non in quella di suo utilizzo, si rende necessario collegarsi direttamente ai pin ST morpho che sono connessi direttamente allo STM32. La procedura prevede pertanto la disponibilità di una schedina USB break-out per connettere la porta USB del computer con alcuni dei pin ST morpho. Chi ha dimestichezza può anche semplicemente sezionare un cavo USB, utilizzando ovviamente un cavo completo della parte dati, evitando quindi uno di quelli che vengono utilizzati per la ricarica dei dispositivi e che in genere portano i soli cavi di alimentazione a 5V.

Upgrade o ripristino del firmware

Cominciamo con  un’operazione preliminare di upgrade del firmware di partenza che è consigliabile effettuare a scopo cautelativo e ai fini di un eventuale successivo ripristino della scheda al firmware di fabbrica.
Dal sito ST procurarsi il file en.stsw-link007.zip e decomprimerlo in una directory, consultate quindi il file readme.txt ivi contenuto e che fornisce istruzioni sul modo di procedere per vari sistemi operativi. Per Ubuntu occorre eseguire una piccola applicazione GUI java (se java non fosse già installato eseguire: sudo apt install default-jre ):

$ sudo java -jar AllPlatforms/STLinkUpgrade.jar

Si premano, nell’ordine, i tre bottoni presenti ritrovandosi alla fine nella situazione in figura:

Connessioni

Utilizzando la schedina USB breakout effettuare i seguenti collegamenti verso i connettori ST morpho:

USB breakout boardST morpho
5VU5V
GNDGND
D+PA12
D-PA11

 

Mettere la board in DFU mode

Occorre cambiare lo stato di default da 0 a 1 del pin ST morpho denominato BOOT0. Ciò può essere fatto prelevando uno dei ponticelli inutilizzati presenti sul retro della scheda (su CN11 e CN12) e collegare i due pin adiacenti BOOT0 e VDD.

Connessioni

Collegare  la board al computer e verificare che si accenda, quindi premere il pulsante nero di reset della scheda.

Caricare MicroPython

Su un terminale Ubuntu:

$ sudo apt-get install dfu-util
$ sudo dfu-util --list

Ottenendo come risposta:

dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

Found DFU: [0483:df11] ver=2200, devnum=24, cfg=1, intf=0, path="2-1", alt=3, name="@Device Feature/0xFFFF0000/01*004 e", serial="319735803237"
Found DFU: [0483:df11] ver=2200, devnum=24, cfg=1, intf=0, path="2-1", alt=2, name="@OTP Memory /0x1FFF7800/01*512 e,01*016 e", serial="319735803237"
Found DFU: [0483:df11] ver=2200, devnum=24, cfg=1, intf=0, path="2-1", alt=1, name="@Option Bytes  /0x1FFFC000/01*016 e", serial="319735803237"
Found DFU: [0483:df11] ver=2200, devnum=24, cfg=1, intf=0, path="2-1", alt=0, name="@Internal Flash  /0x08000000/04*016Kg,01*064Kg,03*128Kg", serial="319735803237"

Quindi finalmente caricare il firmware scaricato in precedenza con:

$ sudo dfu-util -a 0 -d 0483:df11 -D NUCLEO_F401RE-20180511-v1.9.4.dfu

Ottenendo:

Opening DFU capable USB device...
ID 0483:df11
Run-time device DFU version 011a
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuERROR, status = 10
dfuERROR, clearing status
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 2048
DfuSe interface name: "Internal Flash  "
file contains 1 DFU images
parsing DFU image 1
image for alternate setting 0, (2 elements, total size = 287404)
parsing element 1, address = 0x08000000, size = 14788
Download	[=========================] 100%        14788 bytes
Download done.
parsing element 2, address = 0x08020000, size = 272600
Download	[=========================] 100%       272600 bytes
Download done.
done parsing DfuSe file

E’ fatta. Scollegare i fili, togliere il ponticello, ricollegare in modo usuale la scheda e aprire un terminale verso la scheda (su windows si può utilizzare putty) su Ubuntu  si può installare nel solito modo minicom e quindi:

$ sudo minicom -D /dev/ttyACM0

e quanto segue apparirà sulla console:

>>> MicroPython v1.9.4 on 2018-05-11; NUCLEO-F401RE with STM32F401xE            
Type "help()" for more information.

Confermando il successo della procedura. Ora ci troviamo a disposizione le magie dell’interprete Python. Eventualmente in un articolo successivo tratteremo un’introduzione alla programmazione in micropython. Per ora limitiamoci solo ad accendere e spegnere il pin verde della scheda:

 

>>> import pyb
>>> pyb.LED(1).on()

e si accenderà il LED verde della scheda. Quando vorremo spegnerlo:

>>> pyb.LED(1).off()

Ed ecco un primo contatto con i numeri interi a precisione (quasi) illimitata calcolando 2 elevato a 256 che è un numero di ben 78 cifre decimali:

>>> 2**256
115792089237316195423570985008687907853269984665640564039457584007913129639936
>>> len(str(2**256))
78

Non male per un’elaborazione eseguita su un microcontrollore! Per terminare e uscire da minicom digitare:

Ctrl-A X invio

Se in futuro vogliamo evitare di dover premettere il sudo al minicom occorre aggiungere l’utente linux corrente al gruppo dialout, ad esempio:

 

sudo adduser rino dialout

e quindi riavviare Ubuntu per rendere effettiva l’operazione.
Buon divertimento con MicroPython.