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 / freqké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 amachine.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, vagyPIO.SHIFT_RIGHT.Az out_shiftdir az az irány, amerre az OSR eltol, vagy
PIO.SHIFT_LEFT, vagyPIO.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_RESTARTregiszteré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_encodesegí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,HvagyItípusú tömb, vagy egybytearray.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.
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.