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ó, egyetlenPIOobjektumot. Az RP2040-nek két PIO-blokkja van,0és1sorszámmal. Bármilyen más id eseténValueErrorkivé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,
0vagy16).Argumentummal beállítja a bázist. A
baselehet egymachine.Pinpé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
programprogramot 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
programprogramot ennek a PIO-nak az utasításmemóriájából, helyet felszabadítva új programok számára. Ha aprogramel 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
StateMachinepéldány egyikét. Azida helyi állapotgép-index (0–3).Ha a
programmeg van adva, az állapotgép úgy van konfigurálva, hogy azt futtassa – az összes pozicionális/kulcsszavas argumentum továbbításra kerül aStateMachine.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
handlera visszahívás, amely akkor sül el, amikor a kért állapotgép-IRQ-k bármelyike bereteszelődik. A kezelő a sajátPIOpéldányát kapja meg egyetlen argumentumként; a kezelőn belül az elsülő állapotgépek aself.irq().flags()és azIRQ_SM*konstansok AND-elésével azonosíthatók.A
triggeregy bitmaszk, amely egy vagy többIRQ_SM0..IRQ_SM3értéket tartalmaz. Az alapértelmezett bármely állapotgépnél elsül.A
hard=Trueegy 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_initparamé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_initparamé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_initparamé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_initparaméterének, hogy a láb logikai 1-et kimeneti vezérelt kimenetként induljon.
- SHIFT_LEFT: int¶
Add át az
asm_pio()vagy aStateMachine.init()in_shiftdir/out_shiftdirparaméterének, hogy az eltolások a bitek az MSB felé mozgassák.
- SHIFT_RIGHT: int¶
Add át az
asm_pio()vagy aStateMachine.init()in_shiftdir/out_shiftdirparaméterének, hogy az eltolások a bitek az LSB felé mozgassák.
- JOIN_NONE: int¶
Add át az
asm_pio()fifo_joinparamé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_joinparamé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.