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 cumachine.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, fiePIO.SHIFT_RIGHT.out_shiftdir este direcția în care va deplasa OSR-ul, fie
PIO.SHIFT_LEFT, fiePIO.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_RESTARTal 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_encodepentru 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,HsauI, sau unbytearray.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().
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().