PIO osztály – haladó PIO-használat

A PIO osztály az RP2040 két programozható I/O (PIO) blokkjának egyikét csomagolja. Minden PIO-blokk tartalmaz egy utasításmemóriát (32 utasítás), amelyet négy független állapotgép oszt meg, valamint egy privát FIFO-interfészt minden állapotgéphez és egy IRQ-vezérlőt.

A legtöbb szkript a StateMachine osztályon keresztül kommunikál a PIO-val – ez az osztály olyan haladó használati esetekre szolgál, amelyekhez a következőkre van szükség:

  • Programok explicit betöltése és eltávolítása az add_program() / remove_program() metódusokkal.

  • A PIO GPIO-bázisának áthelyezése a chip 32 lábas ablakán belül az gpio_base() metódussal.

  • Bekapcsolódás a blokkszintű IRQ-jelzőkbe az irq() metódussal.

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

Konstruktorok

class rp2.PIO(id: int)

Visszaadja az id által azonosított PIO-blokkhoz tartozó, egyetlen PIO objektumot. Az RP2040-nek két PIO-blokkja van, 0 és 1 sorszámmal. Bármilyen más id esetén ValueError kivételt vált ki.

Metódusok

gpio_base(base: machine.Pin | int | None = None, /) int

Lekérdezi vagy beállítja a GPIO-bázist ehhez a PIO-blokkhoz.

Az RP2040 PIO egy 32 lábas ablakot lát a GPIO-térbe; az ablak a GPIO0-nál vagy a GPIO16-nál kezdődhet. A bázis határozza meg, melyik ablak van érvényben a PIO összes állapotgépénél.

Argumentum nélkül visszaadja az aktuális bázist (a GPIO láb számát, 0 vagy 16).

Argumentummal beállítja a bázist. A base lehet egy machine.Pin példány vagy az egész szám lábszám, és GPIO0-ra vagy GPIO16-ra kell feloldódnia. A bázist azelőtt kell beállítani, mielőtt bármilyen programot hozzáadnál vagy állapotgépet hoznál létre ezen a PIO-blokkon.

add_program(program: Callable) None

Betölti a program programot ennek a PIO-nak az utasításmemóriájába. A létrejövő memóriaelrendezés újrafelhasználásra kerül a PIO-blokk összes állapotgépén.

Minden PIO csak 32 utasításnyi programmemóriával rendelkezik, amelyet minden program megoszt; ha az új program nem fér el, ez a metódus OSError(ENOMEM) kivételt vált ki. Ugyanaz a program betölthető mindkét PIO-példányra, de külön memóriaterületeket foglalnak el.

remove_program(program: Callable | None = None, /) None

Eltávolítja a program programot ennek a PIO-nak az utasításmemóriájából, helyet felszabadítva új programok számára. Ha a program el van hagyva, a PIO-ra jelenleg betöltött összes program eltávolításra kerül.

Egy be nem töltött program eltávolítása nem csinál semmit (nincs kivétel).

state_machine(id: int, program: Callable | None = None, *args, **kwargs) StateMachine

Visszaadja az ehhez a PIO-blokkhoz tartozó négy StateMachine példány egyikét. Az id a helyi állapotgép-index (03).

Ha a program meg van adva, az állapotgép úgy van konfigurálva, hogy azt futtassa – az összes pozicionális/kulcsszavas argumentum továbbításra kerül a StateMachine.init() metódusnak.

Példa:

>>> rp2.PIO(1).state_machine(3)
StateMachine(7)

A visszaadott objektum globális állapotgép-azonosítója pio_id * 4 + sm_id.

irq(handler: Callable[[PIO], None] | None = None, trigger: int = IRQ_SM0 | IRQ_SM1 | IRQ_SM2 | IRQ_SM3, hard: bool = False) Callable

Lekérdezi vagy konfigurálja a blokkszintű IRQ-t ehhez a PIO-hoz.

A handler a visszahívás, amely akkor sül el, amikor a kért állapotgép-IRQ-k bármelyike bereteszelődik. A kezelő a saját PIO példányát kapja meg egyetlen argumentumként; a kezelőn belül az elsülő állapotgépek a self.irq().flags() és az IRQ_SM* konstansok AND-elésével azonosíthatók.

A trigger egy bitmaszk, amely egy vagy több IRQ_SM0 .. IRQ_SM3 értéket tartalmaz. Az alapértelmezett bármely állapotgépnél elsül.

A hard=True egy kemény megszakítási kezelőt regisztrál (nincs heap-allokáció a visszahívásban).

A MicroPython mindegyik PIO-blokkon az IRQ 0-t köti be; az IRQ 1 fenntartott, és Pythonból nem érhető el.

Konstansok

IN_LOW: int

Add át az asm_pio() out_init / set_init / sideset_init paraméterének, hogy a láb alacsony szintre húzott bemenetként induljon (azaz tristate állapotban, a kimeneti puffer 0-t tartva).

IN_HIGH: int

Add át az asm_pio() out_init / set_init / sideset_init paraméterének, hogy a láb bemenetként induljon, miközben a kimeneti puffer 1-et tart.

OUT_LOW: int

Add át az asm_pio() out_init / set_init / sideset_init paraméterének, hogy a láb logikai 0-t kimeneti vezérelt kimenetként induljon.

OUT_HIGH: int

Add át az asm_pio() out_init / set_init / sideset_init paraméterének, hogy a láb logikai 1-et kimeneti vezérelt kimenetként induljon.

SHIFT_LEFT: int

Add át az asm_pio() vagy a StateMachine.init() in_shiftdir / out_shiftdir paraméterének, hogy az eltolások a bitek az MSB felé mozgassák.

SHIFT_RIGHT: int

Add át az asm_pio() vagy a StateMachine.init() in_shiftdir / out_shiftdir paraméterének, hogy az eltolások a bitek az LSB felé mozgassák.

JOIN_NONE: int

Add át az asm_pio() fifo_join paraméterének, hogy az állapotgépnek külön 4 szavas TX és RX FIFO-ja legyen (az alapértelmezett).

JOIN_TX: int

Add át az asm_pio() fifo_join paraméterének, hogy a TX FIFO 8 szóra duplázódjon az RX FIFO felszívásával. Az állapotgép ekkor már nem tud adatot fogadni.

JOIN_RX: int

Add át az asm_pio() fifo_join paraméterének, hogy az RX FIFO 8 szóra duplázódjon a TX FIFO felszívásával. Az állapotgép ekkor már nem tud adatot küldeni.

IRQ_SM0: int

irq() trigger jelző: a 0. állapotgép kiváltotta az IRQ-ját.

IRQ_SM1: int

irq() trigger jelző: az 1. állapotgép kiváltotta az IRQ-ját.

IRQ_SM2: int

irq() trigger jelző: a 2. állapotgép kiváltotta az IRQ-ját.

IRQ_SM3: int

irq() trigger jelző: a 3. állapotgép kiváltotta az IRQ-ját.