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 con machine.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_LEFT o PIO.SHIFT_RIGHT.

  • out_shiftdir è la direzione in cui l’OSR effettuerà lo scorrimento, o PIO.SHIFT_LEFT o PIO.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_RESTART dell’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_encode per 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, H o I, oppure un bytearray.

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().

irq(handler: Callable[[StateMachine], None] | None = None, trigger: int = 0 | 1, hard: bool = False) Callable

Restituisce l’oggetto IRQ per la StateMachine data.

Opzionalmente lo configura.

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().