třída StateMachine – přístup k programovatelnému I/O rozhraní procesoru RP2040

Třída StateMachine poskytuje přístup k PIO (programovatelnému I/O) rozhraní procesoru RP2040.

Pro sestavování PIO programů viz rp2.asm_pio().

Konstruktory

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

Získá stavový automat s číslem id. RP2040 má dvě identické instance PIO, každou se 4 stavovými automaty: celkem je tedy 8 stavových automatů, číslovaných 0 až 7.

Volitelně jej inicializuje zadaným programem program: viz 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

Nakonfiguruje instanci stavového automatu ke spuštění zadaného programu program.

Program je přidán do instrukční paměti této instance PIO. Pokud instrukční paměť tento program již obsahuje, znovu se použije jeho offset, aby se ušetřila instrukční paměť.

  • freq je frekvence v Hz, na které se má stavový automat spouštět. Výchozí hodnotou je frekvence systémových hodin.

    Dělitel hodin se počítá jako system clock frequency / freq, takže může docházet k drobným zaokrouhlovacím chybám.

    Minimální možný dělitel hodin je jedna 65536tina systémových hodin: takže při výchozí frekvenci systémových hodin 125 MHz je minimální hodnota freq 1908. Pro běh stavových automatů na nižších frekvencích budete muset snížit rychlost systémových hodin pomocí machine.freq().

  • in_base je první pin použitý pro instrukce in().

  • out_base je první pin použitý pro instrukce out().

  • set_base je první pin použitý pro instrukce set().

  • jmp_pin je první pin použitý pro instrukce jmp(pin, ...).

  • sideset_base je první pin použitý pro side-set.

  • in_shiftdir je směr, kterým bude ISR posouvat, buď PIO.SHIFT_LEFT nebo PIO.SHIFT_RIGHT.

  • out_shiftdir je směr, kterým bude OSR posouvat, buď PIO.SHIFT_LEFT nebo PIO.SHIFT_RIGHT.

  • push_thresh je práh v bitech, po jehož dosažení se spustí automatický push nebo podmíněný opětovný push.

  • pull_thresh je práh v bitech, po jehož dosažení se spustí automatický pull nebo podmíněný opětovný pull.

Poznámka: piny použité pro in_base je třeba ručně nakonfigurovat jako vstup (nebo jinak), aby PIO vidělo požadovaný signál (mohou to být vstupní piny, výstupní piny nebo piny připojené k jiné periferii). jmp_pin lze rovněž nakonfigurovat ručně, ale ve výchozím stavu bude vstupním pinem.

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

Získá nebo nastaví, zda stavový automat aktuálně běží.

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

Restartuje stavový automat a skočí na začátek programu.

Tato metoda vymaže vnitřní stav stavového automatu pomocí registru SM_RESTART procesoru RP2040. To zahrnuje:

  • vstupní a výstupní posuvné čítače

  • obsah vstupního posuvného registru

  • čítač zpoždění

  • stav čekání na IRQ

  • uvázlou instrukci spuštěnou pomocí StateMachine.exec()

exec(instr: str | int) None

Provede jedinou PIO instrukci.

Pokud je instr řetězec, použije se asm_pio_encode k zakódování instrukce ze zadaného řetězce.

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

Pokud je instr celé číslo, je považováno za již zakódovanou instrukci strojového kódu PIO ke spuštění.

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

Vytáhne (pull) slovo z RX FIFO stavového automatu.

Pokud je FIFO prázdné, blokuje se, dokud nedorazí data (tj. dokud stavový automat nevloží slovo).

Hodnota je před vrácením posunuta vpravo o shift bitů, tj. návratová hodnota je word >> shift.

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

Vloží (push) slova do TX FIFO stavového automatu.

value může být celé číslo, pole typu B, H nebo I, nebo bytearray.

Tato metoda se bude blokovat, dokud nebudou do FIFO zapsána všechna slova. Pokud je FIFO plné nebo se zaplní, metoda se bude blokovat, dokud stavový automat nevytáhne dostatek slov k dokončení zápisu.

Každé slovo je nejprve posunuto vlevo o shift bitů, tj. stavový automat obdrží word << shift.

rx_fifo() int

Vrátí počet slov v RX FIFO stavového automatu. Hodnota 0 znamená, že FIFO je prázdné.

Užitečné pro kontrolu, zda čekají data ke čtení, před voláním StateMachine.get().

tx_fifo() int

Vrátí počet slov v TX FIFO stavového automatu. Hodnota 0 znamená, že FIFO je prázdné.

Užitečné pro kontrolu, zda je místo pro vložení dalšího slova pomocí StateMachine.put().

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

Vrátí IRQ objekt pro daný StateMachine.

Volitelně jej nakonfiguruje.

Buffer protokol

Třída StateMachine podporuje buffer protocol, což umožňuje přímý přístup k vysílacím a přijímacím FIFO každého stavového automatu. To slouží především k tomu, aby bylo možné objekty StateMachine předávat přímo jako parametry pro čtení nebo zápis při konfiguraci kanálu rp2.DMA().