classe PIO – uso avanzato del PIO

La classe PIO incapsula uno dei due blocchi Programmable I/O (PIO) dell’RP2040. Ogni blocco PIO contiene una memoria di istruzioni (32 istruzioni) condivisa da quattro state machine indipendenti, oltre a un’interfaccia FIFO privata per ciascuna state machine e a un controller IRQ.

La maggior parte degli script interagisce con il PIO tramite StateMachine – questa classe è destinata a casi d’uso avanzati che richiedono di:

  • Caricare e rimuovere programmi esplicitamente tramite add_program() / remove_program().

  • Spostare la base GPIO del PIO lungo la finestra a 32 pin del chip tramite gpio_base().

  • Agganciarsi ai flag IRQ a livello di blocco tramite irq().

Per l’assemblaggio dei programmi PIO vedi rp2.asm_pio().

Costruttori

class rp2.PIO(id: int)

Restituisce l’oggetto singleton PIO per il blocco PIO identificato da id. L’RP2040 ha due blocchi PIO, numerati 0 e 1. Solleva ValueError per qualsiasi altro id.

Metodi

gpio_base(base: machine.Pin | int | None = None, /) int

Ottiene o imposta la base GPIO per questo blocco PIO.

Il PIO dell’RP2040 vede una finestra a 32 pin nello spazio GPIO; la finestra può iniziare a GPIO0 o GPIO16. La base controlla quale finestra è in vigore per tutte le state machine di questo PIO.

Senza argomento, restituisce la base corrente (il numero del pin GPIO, 0 o 16).

Con un argomento, imposta la base. base può essere un’istanza machine.Pin o il numero intero del pin, e deve risolversi a GPIO0 o GPIO16. La base deve essere impostata prima che venga aggiunto qualsiasi programma o costruita qualsiasi state machine su questo blocco PIO.

add_program(program: Callable) None

Carica program nella memoria di istruzioni di questo PIO. Il layout di memoria risultante è riutilizzato tra tutte le state machine di questo blocco PIO.

Ogni PIO ha solo 32 istruzioni di memoria di programma condivise tra tutti i programmi; se il nuovo programma non ci sta, questo metodo solleva OSError(ENOMEM). Lo stesso programma può essere caricato su entrambe le istanze PIO, ma occupano regioni di memoria separate.

remove_program(program: Callable | None = None, /) None

Rimuove program dalla memoria di istruzioni di questo PIO, liberando spazio per nuovi programmi. Se program è omesso, vengono rimossi tutti i programmi attualmente caricati su questo PIO.

Rimuovere un programma che non era caricato non ha effetto (nessuna eccezione).

state_machine(id: int, program: Callable | None = None, *args, **kwargs) StateMachine

Restituisce una delle quattro istanze StateMachine di proprietà di questo blocco PIO. id è l’indice locale della state machine (03).

Se viene fornito program, la state machine viene configurata per eseguirlo – tutti gli argomenti posizionali/keyword vengono inoltrati a StateMachine.init().

Esempio:

>>> rp2.PIO(1).state_machine(3)
StateMachine(7)

L’ID globale della state machine dell’oggetto restituito è pio_id * 4 + sm_id.

irq(handler: Callable[[PIO], None] | None = None, trigger: int = IRQ_SM0 | IRQ_SM1 | IRQ_SM2 | IRQ_SM3, hard: bool = False) Callable

Ottiene o configura l’IRQ a livello di blocco per questo PIO.

handler è il callback da attivare quando uno qualsiasi degli IRQ delle state machine richieste si attiva. Il gestore riceve questa istanza PIO come unico argomento; all’interno del gestore le state machine che attivano l’interrupt possono essere identificate tramite self.irq().flags() messo in AND con le costanti IRQ_SM*.

trigger è una maschera di bit di una o più tra IRQ_SM0 .. IRQ_SM3. Il valore predefinito si attiva su qualsiasi state machine.

hard=True registra un gestore di interrupt hardware (nessuna allocazione di heap nel callback).

MicroPython associa l’IRQ 0 su ciascun blocco PIO; l’IRQ 1 è riservato e non accessibile da Python.

Costanti

IN_LOW: int

Da passare a out_init / set_init / sideset_init di asm_pio() affinché il pin parta come ingresso pilotato a livello basso (cioè tristate con il buffer di uscita che mantiene uno 0).

IN_HIGH: int

Da passare a out_init / set_init / sideset_init di asm_pio() affinché il pin parta come ingresso con il buffer di uscita che mantiene un 1.

OUT_LOW: int

Da passare a out_init / set_init / sideset_init di asm_pio() affinché il pin parta come uscita pilotata a livello logico 0.

OUT_HIGH: int

Da passare a out_init / set_init / sideset_init di asm_pio() affinché il pin parta come uscita pilotata a livello logico 1.

SHIFT_LEFT: int

Da passare a in_shiftdir / out_shiftdir di asm_pio() o StateMachine.init() affinché gli scorrimenti spostino i bit verso il MSB.

SHIFT_RIGHT: int

Da passare a in_shiftdir / out_shiftdir di asm_pio() o StateMachine.init() affinché gli scorrimenti spostino i bit verso il LSB.

JOIN_NONE: int

Da passare a fifo_join di asm_pio() affinché la state machine abbia FIFO TX e RX separate da 4 parole (l’impostazione predefinita).

JOIN_TX: int

Da passare a fifo_join di asm_pio() affinché la FIFO TX venga raddoppiata a 8 parole assorbendo la FIFO RX. La state machine non può più ricevere dati.

JOIN_RX: int

Da passare a fifo_join di asm_pio() affinché la FIFO RX venga raddoppiata a 8 parole assorbendo la FIFO TX. La state machine non può più trasmettere dati.

IRQ_SM0: int

Flag trigger di irq(): la state machine 0 ha sollevato il suo IRQ.

IRQ_SM1: int

Flag trigger di irq(): la state machine 1 ha sollevato il suo IRQ.

IRQ_SM2: int

Flag trigger di irq(): la state machine 2 ha sollevato il suo IRQ.

IRQ_SM3: int

Flag trigger di irq(): la state machine 3 ha sollevato il suo IRQ.