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
PIOper il blocco PIO identificato daid. L’RP2040 ha due blocchi PIO, numerati0e1. SollevaValueErrorper 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,
0o16).Con un argomento, imposta la base.
basepuò essere un’istanzamachine.Pino 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
programnella 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
programdalla memoria di istruzioni di questo PIO, liberando spazio per nuovi programmi. Seprogramè 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
StateMachinedi proprietà di questo blocco PIO.idè l’indice locale della state machine (0–3).Se viene fornito
program, la state machine viene configurata per eseguirlo – tutti gli argomenti posizionali/keyword vengono inoltrati aStateMachine.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 istanzaPIOcome unico argomento; all’interno del gestore le state machine che attivano l’interrupt possono essere identificate tramiteself.irq().flags()messo in AND con le costantiIRQ_SM*.triggerè una maschera di bit di una o più traIRQ_SM0..IRQ_SM3. Il valore predefinito si attiva su qualsiasi state machine.hard=Trueregistra 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_initdiasm_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_initdiasm_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_initdiasm_pio()affinché il pin parta come uscita pilotata a livello logico 0.
- OUT_HIGH: int¶
Da passare a
out_init/set_init/sideset_initdiasm_pio()affinché il pin parta come uscita pilotata a livello logico 1.
- SHIFT_LEFT: int¶
Da passare a
in_shiftdir/out_shiftdirdiasm_pio()oStateMachine.init()affinché gli scorrimenti spostino i bit verso il MSB.
- SHIFT_RIGHT: int¶
Da passare a
in_shiftdir/out_shiftdirdiasm_pio()oStateMachine.init()affinché gli scorrimenti spostino i bit verso il LSB.
- JOIN_NONE: int¶
Da passare a
fifo_joindiasm_pio()affinché la state machine abbia FIFO TX e RX separate da 4 parole (l’impostazione predefinita).
- JOIN_TX: int¶
Da passare a
fifo_joindiasm_pio()affinché la FIFO TX venga raddoppiata a 8 parole assorbendo la FIFO RX. La state machine non può più ricevere dati.