clasa StateMachine – acces la interfața programabilă I/O a RP2040

Clasa StateMachine oferă acces la interfața PIO (programmable I/O) a RP2040.

Pentru asamblarea programelor PIO, consultați rp2.asm_pio().

Constructori

class rp2.StateMachine(id: int, program: Callable | None = None, *args, **kwargs)

Obține mașina de stare numerotată id. RP2040 are două instanțe PIO identice, fiecare cu 4 mașini de stare: astfel există în total 8 mașini de stare, numerotate de la 0 la 7.

Opțional, o inițializează cu programul dat program: consultați 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

Configurează instanța mașinii de stare să ruleze programul dat program.

Programul este adăugat în memoria de instrucțiuni a acestei instanțe PIO. Dacă memoria de instrucțiuni conține deja acest program, atunci se reutilizează offsetul său pentru a economisi memorie de instrucțiuni.

  • freq este frecvența în Hz la care se rulează mașina de stare. Valoarea implicită este frecvența ceasului de sistem.

    Divizorul de ceas este calculat ca system clock frequency / freq, deci pot exista mici erori de rotunjire.

    Cel mai mic divizor de ceas posibil este a 65536-a parte din ceasul de sistem: astfel, la frecvența implicită a ceasului de sistem de 125MHz, valoarea minimă a lui freq este 1908. Pentru a rula mașini de stare la frecvențe mai mici, va trebui să reduceți viteza ceasului de sistem cu machine.freq().

  • in_base este primul pin de utilizat pentru instrucțiunile in().

  • out_base este primul pin de utilizat pentru instrucțiunile out().

  • set_base este primul pin de utilizat pentru instrucțiunile set().

  • jmp_pin este primul pin de utilizat pentru instrucțiunile jmp(pin, ...).

  • sideset_base este primul pin de utilizat pentru side-setting.

  • in_shiftdir este direcția în care va deplasa ISR-ul, fie PIO.SHIFT_LEFT, fie PIO.SHIFT_RIGHT.

  • out_shiftdir este direcția în care va deplasa OSR-ul, fie PIO.SHIFT_LEFT, fie PIO.SHIFT_RIGHT.

  • push_thresh este pragul în biți înainte de declanșarea auto-push-ului sau a re-push-ului condiționat.

  • pull_thresh este pragul în biți înainte de declanșarea auto-pull-ului sau a re-pull-ului condiționat.

Notă: pinii utilizați pentru in_base trebuie configurați manual ca intrare (sau altfel) astfel încât PIO-ul să poată vedea semnalul dorit (pot fi pini de intrare, pini de ieșire sau conectați la un alt periferic). Și jmp_pin poate fi configurat manual, dar în mod implicit va fi un pin de intrare.

active(value: bool | int | None = None, /) bool

Obține sau setează dacă mașina de stare rulează în prezent.

>>> sm.active()
True
>>> sm.active(0)
False
restart() None

Repornește mașina de stare și sare la începutul programului.

Această metodă șterge starea internă a mașinii de stare folosind registrul SM_RESTART al RP2040. Aceasta include:

  • contoarele de deplasare la intrare și la ieșire

  • conținutul registrului de deplasare la intrare

  • contorul de întârziere

  • starea de așteptare a unui IRQ

  • o instrucțiune blocată rulată cu StateMachine.exec()

exec(instr: str | int) None

Execută o singură instrucțiune PIO.

Dacă instr este un șir de caractere, atunci se folosește asm_pio_encode pentru a codifica instrucțiunea din șirul dat.

>>> sm.exec("set(0, 1)")

Dacă instr este un întreg, atunci este tratat ca o instrucțiune de cod-mașină PIO deja codificată, care urmează să fie executată.

>>> sm.exec(rp2.asm_pio_encode("out(y, 8)", 0))
get(buf: 'bytearray | array | None' = None, shift: int = 0) int

Extrage un cuvânt din FIFO-ul RX al mașinii de stare.

Dacă FIFO-ul este gol, se blochează până la sosirea datelor (adică până când mașina de stare împinge un cuvânt).

Valoarea este deplasată la dreapta cu shift biți înainte de a fi returnată, adică valoarea returnată este word >> shift.

put(value: 'int | bytes | bytearray | array', shift: int = 0) None

Împinge cuvinte în FIFO-ul TX al mașinii de stare.

value poate fi un întreg, un tablou de tip B, H sau I, sau un bytearray.

Această metodă se va bloca până când toate cuvintele au fost scrise în FIFO. Dacă FIFO-ul este sau devine plin, metoda se va bloca până când mașina de stare extrage suficiente cuvinte pentru a finaliza scrierea.

Fiecare cuvânt este mai întâi deplasat la stânga cu shift biți, adică mașina de stare primește word << shift.

rx_fifo() int

Returnează numărul de cuvinte din FIFO-ul RX al mașinii de stare. O valoare de 0 indică faptul că FIFO-ul este gol.

Util pentru a verifica dacă există date în așteptare să fie citite, înainte de apelarea lui StateMachine.get().

tx_fifo() int

Returnează numărul de cuvinte din FIFO-ul TX al mașinii de stare. O valoare de 0 indică faptul că FIFO-ul este gol.

Util pentru a verifica dacă există spațiu pentru a împinge un alt cuvânt folosind StateMachine.put().

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

Returnează obiectul IRQ pentru mașina de stare dată.

Opțional, îl configurează.

Protocol de tampon (buffer)

Clasa StateMachine acceptă buffer protocol, permițând accesul direct la FIFO-urile de transmisie și recepție pentru fiecare mașină de stare. Acest lucru este destinat în principal pentru a permite ca obiectele StateMachine să fie transmise direct ca parametri de citire sau scriere atunci când se configurează un canal rp2.DMA().