🛠 Première machine à états PIO : un blink sans CPU

Raspberry Pi Pico · intermediaire · Schéma : IMG-pico-intermediaire-2-pico-pio-machine-etats.svg — bloc PIO du RP2040 avec une machine à états (SM0) et sa boucle d'états set/delay/jmp, sortie reliée à GP25, cœur CPU endormi à côté

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

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

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels