StateMachine osztály – hozzáférés az RP2040 programozható I/O interfészéhez

A StateMachine osztály hozzáférést biztosít az RP2040 PIO (programozható I/O) interfészéhez.

A PIO-programok összeállításához lásd: rp2.asm_pio().

Konstruktorok

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

Lekéri az id sorszámú állapotgépet. Az RP2040-nek két azonos PIO-példánya van, mindegyikben 4 állapotgép: tehát összesen 8 állapotgép van, 0-tól 7-ig számozva.

Opcionálisan inicializálja az adott program programmal: lásd 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

Konfigurálja az állapotgép-példányt az adott program futtatására.

A program hozzáadódik ennek a PIO-példánynak az utasításmemóriájához. Ha az utasításmemória már tartalmazza ezt a programot, akkor annak eltolása újrafelhasználódik az utasításmemória megtakarítása érdekében.

  • A freq az a frekvencia Hz-ben, amelyen az állapotgép fut. Alapértelmezés szerint a rendszerórajel frekvenciája.

    Az órajel-osztó a system clock frequency / freq képlettel számítódik, így enyhe kerekítési hibák előfordulhatnak.

    A lehetséges legkisebb órajel-osztó a rendszerórajel 65536-od része: így a 125MHz-es alapértelmezett rendszerórajel-frekvencián a freq minimális értéke 1908. Az állapotgépek lassabb frekvencián való futtatásához csökkentened kell a rendszerórajel sebességét a machine.freq() függvénnyel.

  • Az in_base az első láb, amelyet az in() utasításokhoz használ.

  • Az out_base az első láb, amelyet az out() utasításokhoz használ.

  • A set_base az első láb, amelyet a set() utasításokhoz használ.

  • A jmp_pin az első láb, amelyet a jmp(pin, ...) utasításokhoz használ.

  • A sideset_base az első láb, amelyet a side-set műveletekhez használ.

  • Az in_shiftdir az az irány, amerre az ISR eltol, vagy PIO.SHIFT_LEFT, vagy PIO.SHIFT_RIGHT.

  • Az out_shiftdir az az irány, amerre az OSR eltol, vagy PIO.SHIFT_LEFT, vagy PIO.SHIFT_RIGHT.

  • A push_thresh az a küszöbérték bitekben, amely az automatikus push vagy a feltételes újratolás kiváltása előtt érvényesül.

  • A pull_thresh az a küszöbérték bitekben, amely az automatikus pull vagy a feltételes újrahúzás kiváltása előtt érvényesül.

Megjegyzés: az in_base értékhez használt lábakat manuálisan kell konfigurálni bemenetként (vagy másként), hogy a PIO láthassa a kívánt jelet (lehetnek bemeneti lábak, kimeneti lábak, vagy egy másik perifériához csatlakoztatva). A jmp_pin szintén konfigurálható manuálisan, de alapértelmezés szerint bemeneti láb lesz.

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

Lekérdezi vagy beállítja, hogy az állapotgép éppen fut-e.

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

Újraindítja az állapotgépet, és a program elejére ugrik.

Ez a metódus törli az állapotgép belső állapotát az RP2040 SM_RESTART regiszterének használatával. Ez magában foglalja a következőket:

  • bemeneti és kimeneti eltolásszámlálók

  • a bemeneti eltolásregiszter tartalma

  • a késleltetésszámláló

  • az IRQ-ra váró állapot

  • egy elakadt utasítás, amely a StateMachine.exec() metódussal fut

exec(instr: str | int) None

Egyetlen PIO-utasítás végrehajtása.

Ha az instr egy karakterlánc, akkor az asm_pio_encode segítségével kódolja az utasítást az adott karakterláncból.

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

Ha az instr egy egész szám, akkor azt egy már kódolt PIO gépikód-utasításként kezeli, amelyet végre kell hajtani.

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

Kiolvas egy szót az állapotgép RX FIFO-jából.

Ha a FIFO üres, addig blokkol, amíg adat nem érkezik (azaz amíg az állapotgép be nem tol egy szót).

Az érték shift bittel jobbra tolódik a visszaadás előtt, azaz a visszatérési érték word >> shift.

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

Szavakat tol az állapotgép TX FIFO-jába.

A value lehet egy egész szám, egy B, H vagy I típusú tömb, vagy egy bytearray.

Ez a metódus addig blokkol, amíg minden szó beíródik a FIFO-ba. Ha a FIFO megtelt vagy megtelik, a metódus addig blokkol, amíg az állapotgép elegendő szót ki nem húz az írás befejezéséhez.

Minden szó először shift bittel balra tolódik, azaz az állapotgép a word << shift értéket kapja.

rx_fifo() int

Visszaadja az állapotgép RX FIFO-jában lévő szavak számát. A 0 érték azt jelzi, hogy a FIFO üres.

Hasznos annak ellenőrzéséhez, hogy van-e beolvasásra váró adat, mielőtt meghívnád a StateMachine.get() metódust.

tx_fifo() int

Visszaadja az állapotgép TX FIFO-jában lévő szavak számát. A 0 érték azt jelzi, hogy a FIFO üres.

Hasznos annak ellenőrzéséhez, hogy van-e hely egy újabb szó betolásához a StateMachine.put() metódussal.

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

Visszaadja az adott StateMachine IRQ-objektumát.

Opcionálisan konfigurálja azt.

Pufferprotokoll

A StateMachine osztály támogatja a buffer protocol protokollt, amely közvetlen hozzáférést tesz lehetővé minden állapotgép adó- és vevő-FIFO-jához. Ez elsősorban azt teszi lehetővé, hogy a StateMachine objektumok közvetlenül átadhatók legyenek olvasási vagy írási paraméterként egy rp2.DMA() csatorna konfigurálásakor.