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

RP2350 (générique / cartes basées sur le 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

Objectifs

L'ADN des puces RP2 : les PIO (Programmable I/O). Le RP2350 double la mise par rapport au RP2040 : 3 blocs PIO au lieu de 2, 12 machines d'état (4 par bloc) au lieu de 8, et surtout 2 IRQ dédiées par bloc (PIO0/1/2_IRQ_0/1) là où le RP2040 partageait une seule paire (datasheet RP2350, §3.2 table d'interruptions). Tu vas faire tourner une PIO autonome pendant que le CPU fait autre chose, puis comprendre pourquoi 12 SM ouvrent des architectures que le RP2040 ne permettait pas.

Matériel

Code complet

# 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)

Vérification attendue

La LED GP25 clignote à ~1 Hz pendant que la boucle Python tourne à 500 ms : la PIO exécute son propre programme, sans aucune instruction CPU. Le freq=2000 de la machine, divisé par les ~2 × 32 × 30 cycles du double compteur, donne environ 1 Hz. Pousse ensuite le compteur : réutilise les indices 4..11 avec des programmes différents — les 12 places doivent toutes s'activer, preuve des 3 blocs.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels