classe StateMachine – accesso all’interfaccia I/O programmabile dell’RP2040¶
La classe StateMachine dà accesso all’interfaccia PIO (I/O programmabile) dell’RP2040.
Per l’assemblaggio dei programmi PIO, vedi rp2.asm_pio().
Costruttori¶
- class rp2.StateMachine(id: int, program: Callable | None = None, *args, **kwargs)¶
Ottiene la state machine numerata id. L’RP2040 ha due istanze PIO identiche, ciascuna con 4 state machine: quindi ci sono 8 state machine in totale, numerate da 0 a 7.
Opzionalmente la inizializza con il programma program dato: vedi
StateMachine.init.- init(program: Callable, freq: int = -1, *, in_base: machine.Pin | None = None, out_base: machine.Pin | None = None, set_base: machine.Pin | None = None, jmp_pin: machine.Pin | None = None, sideset_base: machine.Pin | None = None, in_shiftdir: int | None = None, out_shiftdir: int | None = None, push_thresh: int | None = None, pull_thresh: int | None = None) None¶
Configura l’istanza della state machine per eseguire il programma program dato.
Il programma viene aggiunto alla memoria di istruzioni di questa istanza PIO. Se la memoria di istruzioni contiene già questo programma, il suo offset viene riutilizzato in modo da risparmiare memoria di istruzioni.
freq è la frequenza in Hz alla quale far girare la state machine. Il valore predefinito è la frequenza del clock di sistema.
Il divisore di clock è calcolato come
system clock frequency / freq, quindi possono esserci lievi errori di arrotondamento.Il divisore di clock minimo possibile è un 65536-esimo del clock di sistema: quindi alla frequenza predefinita del clock di sistema di 125MHz, il valore minimo di freq è
1908. Per far girare le state machine a frequenze più basse, dovrai ridurre la velocità del clock di sistema conmachine.freq().in_base è il primo pin da usare per le istruzioni
in().out_base è il primo pin da usare per le istruzioni
out().set_base è il primo pin da usare per le istruzioni
set().jmp_pin è il primo pin da usare per le istruzioni
jmp(pin, ...).sideset_base è il primo pin da usare per il side-set.
in_shiftdir è la direzione in cui l’ISR effettuerà lo scorrimento, o
PIO.SHIFT_LEFToPIO.SHIFT_RIGHT.out_shiftdir è la direzione in cui l’OSR effettuerà lo scorrimento, o
PIO.SHIFT_LEFToPIO.SHIFT_RIGHT.push_thresh è la soglia in bit prima che venga attivato l’auto-push o il re-push condizionale.
pull_thresh è la soglia in bit prima che venga attivato l’auto-pull o il re-pull condizionale.
Nota: i pin usati per in_base devono essere configurati manualmente come ingressi (o altro) affinché il PIO possa vedere il segnale desiderato (possono essere pin di ingresso, pin di uscita o collegati a una periferica diversa). Anche il jmp_pin può essere configurato manualmente, ma per impostazione predefinita sarà un pin di ingresso.
- active(value: bool | int | None = None, /) bool¶
Ottiene o imposta se la state machine è attualmente in esecuzione.
>>> sm.active() True >>> sm.active(0) False
- restart() None¶
Riavvia la state machine e salta all’inizio del programma.
Questo metodo azzera lo stato interno della state machine usando il registro
SM_RESTARTdell’RP2040. Questo include:i contatori di scorrimento di ingresso e uscita
il contenuto del registro di scorrimento di ingresso
il contatore di ritardo
lo stato di attesa su IRQ
un’istruzione bloccata eseguita usando
StateMachine.exec()
- exec(instr: str | int) None¶
Esegue una singola istruzione PIO.
Se instr è una stringa, usa
asm_pio_encodeper codificare l’istruzione dalla stringa data.>>> sm.exec("set(0, 1)")Se instr è un intero, viene trattato come un’istruzione di codice macchina PIO già codificata da eseguire.
>>> sm.exec(rp2.asm_pio_encode("out(y, 8)", 0))
- get(buf: 'bytearray | array | None' = None, shift: int = 0) int¶
Estrae una parola dalla FIFO RX della state machine.
Se la FIFO è vuota, si blocca finché non arrivano dati (cioè finché la state machine non inserisce una parola).
Il valore viene fatto scorrere a destra di shift bit prima di essere restituito, cioè il valore restituito è
word >> shift.
- put(value: 'int | bytes | bytearray | array', shift: int = 0) None¶
Inserisce parole nella FIFO TX della state machine.
value può essere un intero, un array di tipo
B,HoI, oppure unbytearray.Questo metodo si bloccherà finché tutte le parole non saranno state scritte nella FIFO. Se la FIFO è, o diventa, piena, il metodo si bloccherà finché la state machine non estrae abbastanza parole da completare la scrittura.
Ogni parola viene prima fatta scorrere a sinistra di shift bit, cioè la state machine riceve
word << shift.
- rx_fifo() int¶
Restituisce il numero di parole nella FIFO RX della state machine. Un valore pari a 0 indica che la FIFO è vuota.
Utile per verificare se ci sono dati in attesa di essere letti, prima di chiamare
StateMachine.get().
- tx_fifo() int¶
Restituisce il numero di parole nella FIFO TX della state machine. Un valore pari a 0 indica che la FIFO è vuota.
Utile per verificare se c’è spazio per inserire un’altra parola usando
StateMachine.put().
Protocollo buffer¶
La classe StateMachine supporta il buffer protocol, consentendo l’accesso diretto alle FIFO di trasmissione e ricezione di ciascuna state machine. Questo serve principalmente per permettere di passare gli oggetti StateMachine direttamente come parametri di lettura o scrittura durante la configurazione di un canale rp2.DMA().