MicroPython sur NUCLEO-F411RE
Aujourd'hui, j'ai décidé de tester MicroPython sur une carte STM32 que j'avais sous la main : la Nucleo-64 version STM32F411. Pour les spécifications :
- ARM Cortex M4 à 100 MHz
- 512k de mémoire flash, 128k de SRAM
- 2 extensions de connecteurs aux formats Arduino Uno et ST morpho.
Quand je penses que c'est la fréquence d'horloge d'un de mes premiers ordinateurs... 😥 Nostalgie, quand tu nous tiens. Bref, voyons voir comment fait-on tourner un MicroPython sur la bête !
Flasher la carte
En mode DFU
⚠️ Attention ⚠️ cette manipulation nécessite soit une carte type USB breakout, soit de sacrifier un câble USB en dénudant la partie opposée à celle connectée sur l'ordinateur, soit de faire un peu de soudure avec une prise USB vierge et en y soudant des câbles Dupont.
Il faut tout d'abord récupérer le dernier firmware disponible sur la page de téléchargement. À l'heure actuelle, il s'agit de la version 1.10 (pour F411RE).
Comme le firmware fourni est au format DFU, pour le déposer sur la carte, nous allons utiliser l'outil dfu-util. Il est disponible pour Windows, Mac (notamment avec Homebrew) et Linux (dans les dépôts de pas mal de distributions).
On met la carte Nucleo en mode DFU : on connecte ensemble les pins VDD
et BOOT0
(sur le connecteur CN7, pins 5 et 7) puis on relie les fils D+ et D- de notre câble USB de la manière suivante (sur le connecteur CN10, à droite) :
D+ | PA12 |
---|---|
D- | PA11 |
On vérifie que notre carte est reconnue avec : dfu-util --list
:
dfu-util 0.9
[...]
Deducing device DFU version from functional descriptor length
Found Runtime: [05ac:828f] ver=0150, devnum=4, cfg=1, intf=3, path="20-3.3", alt=0, name="UNKNOWN", serial="UNKNOWN"
(Chez moi je n'ai pas le matériel donc ça ne fonctionne pas. Vous devriez avoir un numéro qui doit être utilisé après dans le paramètre -d
)
On peut alors flasher la carte : dfu-util -a 0 -d xxxx:xxxx -D NUCLEO_F411RE-20190407-v1.10-265-gfd523c53c.dfu
En mode hexadécimale
Ici, on va pouvoir utiliser le câble USB d'origine qui sera simplement connecté sur la carte (via le ST-LINK donc). Mais, ça va être à nous de compiler notre firmware. Allez, c'est parti 😎
On a besoin du compilateur arm-none-eabi-gcc
(facile selon votre OS, moi sous Mac, c'est avec Homebrew). On a également besoin de stlink. Il y a des versions Windows, Linux, Mac (via Homebrew), tout est expliqué sur le dépôt.
On peut alors récuperer l'ensemble du code via git :
git clone https://github.com/micropython/micropython.git
Suivi d'un cd micropython
puis : git submodule update --init
.
Toutes les informations sont données sur la page des portages. On suit donc la "recette", on active la cross compilation : make -C mpy-cross
.
On se place maintenant dans le répertoire dédié aux cartes STM32 : cd ports/stm32
. Puis on compile avec un make BOARD=NUCLEO_F411RE
. Normalement, ça devrait bien se passer si vous avez bien installer les dépendances 😎.
Pour déployer le code, on peut le faire manuellement avec stlink (avec st-flash
) mais le plus simple c'est de compiler avec make BOARD=NUCLEO_F411RE deploy-stlink
, ce qui va compiler ET flasher la carte Nucleo (qui soit être branchée sur le port USB).
La compilation est toujours un peu plus délicate à mettre en oeuvre mais le résultat est un plus large choix de possibilité. Ça nous permet ici de nous passer du mode DFU qui nécessite un câble ou du matériel supplémentaire. On va pouvoir tester notre installation maintenant 😉.
Utiliser MicroPython sur STM32
C'est parti pour quelques petits tests de bon fonctionnement 😎 :
Connexion série
J'utilise pour ma part l'utilitaire screen
sous Linux ou Mac :
screen /dev/cu.usbmodem14103 115200
C'est bien sûr à adapter à votre système : pour moi usbmodem14103
est le port où est connecté ma carte Nucleo. Normalement vous devriez obtenir un shell Python :
MicroPython v1.10-265-gfd523c53c on 2019-04-07; NUCLEO-F411RE with STM32F411xE
Type "help()" for more information.
>>>
Parfait ! 🤗 🤗 🤗. Essayez un help()
pour voir un peu ce que cette carte a dans le ventre.
LED
Si vous avez fait un help()
vous avez peut-être vu une fonction led()
. On va faire un petit essai :
>>> led = pyb.LED(1) #déclare une variable 'led' avec l'argument '1'
>>> led.on() # allume la led
>>> led.off() # éteint la led
>>> led.toggle() # change l'état la led
Conclusion
J'ai utilisé le mode compilation pour flasher ma carte. C'est un peu long mais je n'ai pas eu à sacrifier un câble USB ^^. J'ai rapidement tester (un pseudo blink tellement classique) mais j'espère avoir le temps de "jouer" un peu plus avec, notamment ajouter une librairie, développer un peu de code, etc.
La suite à un prochain épisode 🤩 !
Commentaires
Enregistrer un commentaire