🛠 Première machine à états PIO : un blink sans CPU
Objetivos
Comprender la función signature del RP2040: los PIO (Programmable I/O) — 2 bloques de 4 máquinas de estados programables que fabrican interfaces de bajo nivel sin consumir tiempo de CPU. Escribirás una pequeña máquina de estados que hace parpadear el LED GP25 a 1 Hz de forma autónoma, dejando el núcleo principal libre para otras tareas. Cada SM posee 4 registros (X, Y, FIFO, OSR) y ejecuta sus instrucciones en 1 ciclo.
Material
- 1 × Raspberry Pi Pico
- Firmware MicroPython rp2 (ver el tutorial de MicroPython de esta serie) — el camino más corto para descubrir los PIO
- Ningún componente externo (LED integrado GP25)
Código completo
# 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)
Verificación esperada
El LED GP25 parpadea a 1 Hz permanentemente, incluso si ejecutas en bucle una tarea de CPU ocupada al lado (el pin auxiliar conmuta mucho más rápido en paralelo). Esta es la prueba de que el temporizador lo mantiene el hardware PIO, no el software. Detén el script en el REPL: la SM se detiene, el CPU debe seguir siendo el maestro.
Errores frecuentes
- Contar mal los ciclos: cada instrucción vale 1 ciclo, los
[n]añaden n ciclos de espera — el cálculo de 1 Hz se hace a mano (1000 ciclos × 2 mitades a 2 kHz). - Olvidar
set_init=rp2.PIO.OUT_LOW: el pin no está configurado como salida PIO, no sale nada. - Usar una SM ya ocupada: las 8 SM están compartidas entre todos los usuarios de los PIO.
- Esperar que la PIO continúe después de un reset: vive mientras el programa MicroPython se ejecuta, no después de un reset.
- Confundir frecuencia PIO y período:
freq=2000es el reloj de la SM, no la frecuencia de parpadeo.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython