class PIO – avancerad PIO-användning

Klassen PIO omsluter ett av RP2040:s två Programmable I/O-block (PIO). Varje PIO-block innehåller ett instruktionsminne (32 instruktioner) som delas av fyra oberoende tillståndsmaskiner, plus ett privat FIFO-gränssnitt till varje tillståndsmaskin och en IRQ-styrenhet.

De flesta skript interagerar med PIO via StateMachine – denna klass är till för avancerade användningsfall som behöver:

  • Ladda och ta bort program explicit via add_program() / remove_program().

  • Flytta PIO:s GPIO-bas över chipets 32-stiftsfönster via gpio_base().

  • Koppla in sig på blockövergripande IRQ-flaggor via irq().

För att assemblera PIO-program, se rp2.asm_pio().

Konstruktorer

class rp2.PIO(id: int)

Returnerar singleton-objektet PIO för PIO-blocket som identifieras av id. RP2040 har två PIO-block, numrerade 0 och 1. Ger upphov till ValueError för andra id-värden.

Metoder

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

Hämtar eller anger GPIO-basen för detta PIO-block.

RP2040:s PIO ser ett 32-stiftsfönster in i GPIO-rymden; fönstret kan börja vid GPIO0 eller GPIO16. Basen styr vilket fönster som gäller för alla tillståndsmaskiner på denna PIO.

Utan argument returneras den aktuella basen (GPIO-stiftnumret, 0 eller 16).

Med ett argument anges basen. base kan vara en machine.Pin-instans eller ett heltalsstiftnummer och måste lösas upp till GPIO0 eller GPIO16. Basen måste anges innan något program läggs till eller någon tillståndsmaskin konstrueras på detta PIO-block.

add_program(program: Callable) None

Laddar program in i detta PIO:s instruktionsminne. Den resulterande minneslayouten återanvänds av alla tillståndsmaskiner på detta PIO-block.

Varje PIO har endast 32 instruktioners programminne som delas av alla program; om det nya programmet inte får plats ger denna metod upphov till OSError(ENOMEM). Samma program kan laddas på båda PIO-instanserna, men de förbrukar separata minnesregioner.

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

Tar bort program från detta PIO:s instruktionsminne och frigör plats för nya program. Om program utelämnas tas alla program som för närvarande är laddade på denna PIO bort.

Att ta bort ett program som inte var laddat är en no-op (inget undantag).

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

Returnerar en av de fyra StateMachine-instanserna som ägs av detta PIO-block. id är det lokala tillståndsmaskinindexet (03).

Om program anges konfigureras tillståndsmaskinen att köra det – alla positions- och nyckelordsargument vidarebefordras till StateMachine.init().

Exempel:

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

Det returnerade objektets globala tillståndsmaskin-ID är 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

Hämtar eller konfigurerar IRQ på blocknivå för denna PIO.

handler är det återanrop som ska utlösas när någon av de begärda tillståndsmaskin-IRQ:erna låser. Hanteraren tar emot denna PIO-instans som sitt enda argument; inuti hanteraren kan de utlösande tillståndsmaskinerna identifieras via self.irq().flags() AND:at mot konstanterna IRQ_SM*.

trigger är en bitmask av en eller flera IRQ_SM0 .. IRQ_SM3. Standardvärdet utlöser för valfri tillståndsmaskin.

hard=True registrerar en hård avbrottshanterare (ingen heap-allokering i återanropet).

MicroPython binder IRQ 0 på varje PIO-block; IRQ 1 är reserverad och inte åtkomlig från Python.

Konstanter

IN_LOW: int

Skicka till out_init / set_init / sideset_init för asm_pio() så att stiftet startar som en ingång driven lågt (dvs. tristate med utgångsbufferten hållande en 0:a).

IN_HIGH: int

Skicka till out_init / set_init / sideset_init för asm_pio() så att stiftet startar som en ingång med utgångsbufferten hållande en 1:a.

OUT_LOW: int

Skicka till out_init / set_init / sideset_init för asm_pio() så att stiftet startar som en driven utgång på logisk 0.

OUT_HIGH: int

Skicka till out_init / set_init / sideset_init för asm_pio() så att stiftet startar som en driven utgång på logisk 1.

SHIFT_LEFT: int

Skicka till in_shiftdir / out_shiftdir för asm_pio() eller StateMachine.init() så att skiftningar flyttar bitar mot MSB.

SHIFT_RIGHT: int

Skicka till in_shiftdir / out_shiftdir för asm_pio() eller StateMachine.init() så att skiftningar flyttar bitar mot LSB.

JOIN_NONE: int

Skicka till fifo_join för asm_pio() så att tillståndsmaskinen har separata 4-ords TX- och RX-FIFO:er (standard).

JOIN_TX: int

Skicka till fifo_join för asm_pio() så att TX-FIFO:n fördubblas till 8 ord genom att absorbera RX-FIFO:n. Tillståndsmaskinen kan inte längre ta emot data.

JOIN_RX: int

Skicka till fifo_join för asm_pio() så att RX-FIFO:n fördubblas till 8 ord genom att absorbera TX-FIFO:n. Tillståndsmaskinen kan inte längre sända data.

IRQ_SM0: int

irq() trigger-flagga: tillståndsmaskin 0 utlöste sin IRQ.

IRQ_SM1: int

irq() trigger-flagga: tillståndsmaskin 1 utlöste sin IRQ.

IRQ_SM2: int

irq() trigger-flagga: tillståndsmaskin 2 utlöste sin IRQ.

IRQ_SM3: int

irq() trigger-flagga: tillståndsmaskin 3 utlöste sin IRQ.