🛠 Première machine à états PIO : un blink sans CPU
Objectifs
Comprendre la fonction signature du RP2040 : les PIO (Programmable I/O) — 2 blocs de 4 machines à états programmables qui fabriquent des interfaces bas niveau sans consommer de temps CPU. Tu écriras une petite machine à états qui clignote la LED GP25 à 1 Hz de façon autonome, le cœur principal restant libre pour autre chose. Chaque SM possède 4 registres (X, Y, FIFO, OSR) et exécute ses instructions en 1 cycle.
Matériel
- 1 × Raspberry Pi Pico
- Firmware MicroPython rp2 (voir le tuto MicroPython de cette série) — le plus court chemin pour découvrir les PIO
- Aucun composant externe (LED embarquée GP25)
Code complet
# pio_blink.py — d'après la quick reference MicroPython rp2
from machine import Pin
import rp2
@rp2.asm_pio(set_init=rp2.PIO.OUT_LOW)
def blink_1hz:
# 1000 cycles par moitié à freq=2000 -> 0,5 s
set(pins, 1) # LED ON
set(x, 31) [6]
label("high")
nop [29] # 30 cycles par boucle
jmp(x_dec, "high")
set(pins, 0) # LED OFF
set(x, 31) [6]
label("low")
nop [29]
jmp(x_dec, "low")
sm = rp2.StateMachine(0, blink_1hz, freq=2000, set_base=Pin(25))
sm.active(1) # la PIO clignote seule
# Le CPU est 100 % libre : la tâche ci-dessous tourne en parallèle
import time, machine
aux = machine.Pin(21, machine.Pin.OUT) # >
while True:
aux.toggle
time.sleep_ms(7)
Vérification attendue
La LED GP25 clignote à 1 Hz en permanence, même si tu boucles à côté sur une tâche CPU occupée (la broche auxiliaire commute beaucoup plus vite en parallèle). C'est la preuve que le timing est tenu par le matériel PIO, pas par le logiciel. Coupe le script au REPL : la SM s'arrête, le CPU doit rester maître.
Erreurs fréquentes
- Compter les cycles faux : chaque instruction vaut 1 cycle, les
[n]ajoutent n cycles d'attente — le calcul du 1 Hz se fait à la main (1000 cycles × 2 moitiés à 2 kHz). - Oublier
set_init=rp2.PIO.OUT_LOW: la broche n'est pas configurée en sortie PIO, rien ne sort. - Utiliser une SM déjà prise : les 8 SM sont partagées entre tous les utilisateurs des PIO.
- Attendre que la PIO continue après reset : elle vit tant que le programme MicroPython tourne, pas après un reset.
- Confondre fréquence PIO et période :
freq=2000est l'horloge de la SM, pas la fréquence de clignotement.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython