🛠 Exploiter les 3 blocs PIO et 12 machines d'état du RP2350 (avec IRQ dédiées)

RP2350 (genérico / placas basadas en RP2350) · intermediaire · Schéma : IMG-rp2350-generic-intermediaire-1-rp2350-pio-3-blocs-irq.svg — puce RP2350 avec les 3 blocs PIO (PIO0/1/2) et leurs 4 machines d'état chacun, signal WS2812 sur PIO0 et compteur sur PIO1, IRQ par bloc reliant PIO et cœurs, LED GP25 animée par la PIO

Objetivos

El ADN de los chips RP2: los PIO (Programmable I/O). El RP2350 duplica la apuesta respecto al RP2040: 3 bloques PIO en lugar de 2, 12 máquinas de estado (4 por bloque) en lugar de 8, y sobre todo 2 IRQ dedicadas por bloque (PIO0/1/2_IRQ_0/1) donde el RP2040 compartía un solo par (datasheet RP2350, §3.2 tabla de interrupciones). Vas a ejecutar un PIO autónomo mientras la CPU hace otra cosa, y luego entender por qué 12 SM abren arquitecturas que el RP2040 no permitía.

Material

Código completo

# pio_double.py — une PIO autonome + PWM matériel en parallèle
import rp2, time
from machine import Pin, PWM

# --- PIO0/SM0 : clignotement ~1 Hz, 100 % autonome (CPU libre) ---
@rp2.asm_pio(set_init=rp2.PIO.OUT_LOW)
def blink_1hz:
    set(pins, 1)
    set(x, 31) [6]
    label('high')
    nop [29]
    jmp(x_dec, 'high')
    set(pins, 0)
    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)

# Plan des 12 SM sur RP2350 : indices 0..3 -> PIO0,
# 4..7 -> PIO1, 8..11 -> PIO2. Sur RP2040, l'indice 8 lève une erreur ;
# ici sm2 = rp2.StateMachine(9, ...) est légal.

# --- PWM matériel en parallèle : 50 Hz « servo » sur GP2 ---
# (PWM du RP2350 : 8 tranches/16 canaux sur RP2350A,
#  12 tranches/24 canaux sur RP2350B — une tranche par fréquence servo)
servo = PWM(Pin(2), freq=50, duty_u16=int(65535 * 1.5 / 20))

n = 0
while True:
    n += 1            # le CPU ne fait QUE tourner ici : la PIO pilote la LED
    time.sleep_ms(500)

Verificación esperada

El LED GP25 parpadea a ~1 Hz mientras el bucle Python corre a 500 ms: el PIO ejecuta su propio programa, sin ninguna instrucción de CPU. El freq=2000 de la máquina, dividido por los ~2 × 32 × 30 ciclos del doble contador, da aproximadamente 1 Hz. Luego empuja el contador: reutiliza los índices 4..11 con programas diferentes — los 12 espacios deben activarse todos, prueba de los 3 bloques.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales