třída PIO – pokročilé použití PIO

Třída PIO obaluje jeden ze dvou bloků Programmable I/O (PIO) procesoru RP2040. Každý PIO blok obsahuje instrukční paměť (32 instrukcí) sdílenou čtyřmi nezávislými stavovými automaty, dále soukromé FIFO rozhraní ke každému stavovému automatu a IRQ řadič.

Většina skriptů s PIO pracuje prostřednictvím StateMachine – tato třída je určena pro pokročilé případy použití, které potřebují:

  • Explicitně načítat a odebírat programy pomocí add_program() / remove_program().

  • Posouvat základ GPIO bloku PIO v rámci 32pinového okna čipu pomocí gpio_base().

  • Připojit se k blokovým IRQ příznakům pomocí irq().

Pro sestavování PIO programů viz rp2.asm_pio().

Konstruktory

class rp2.PIO(id: int)

Vrátí jedináčkový (singleton) objekt PIO pro PIO blok určený parametrem id. RP2040 má dva PIO bloky, číslované 0 a 1. Pro jakékoliv jiné id vyvolá ValueError.

Metody

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

Získá nebo nastaví základ GPIO pro tento PIO blok.

PIO procesoru RP2040 vidí 32pinové okno do prostoru GPIO; okno může začínat na GPIO0 nebo GPIO16. Základ určuje, které okno je aktivní pro všechny stavové automaty na tomto PIO.

Bez argumentu vrátí aktuální základ (číslo GPIO pinu, 0 nebo 16).

S argumentem nastaví základ. base může být instance machine.Pin nebo celočíselné číslo pinu a musí odpovídat GPIO0 nebo GPIO16. Základ musí být nastaven před přidáním jakéhokoliv programu nebo vytvořením stavového automatu na tomto PIO bloku.

add_program(program: Callable) None

Načte program do instrukční paměti tohoto PIO. Výsledné rozložení paměti se znovu využívá napříč všemi stavovými automaty na tomto PIO bloku.

Každý PIO má pouze 32 instrukcí programové paměti sdílené napříč všemi programy; pokud se nový program nevejde, tato metoda vyvolá OSError(ENOMEM). Stejný program lze načíst do obou instancí PIO, ale spotřebují oddělené oblasti paměti.

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

Odebere program z instrukční paměti tohoto PIO a uvolní místo pro nové programy. Pokud je program vynechán, odeberou se všechny programy aktuálně načtené na tomto PIO.

Odebrání programu, který nebyl načten, nemá žádný efekt (žádná výjimka).

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

Vrátí jednu ze čtyř instancí StateMachine vlastněných tímto PIO blokem. id je lokální index stavového automatu (03).

Pokud je zadán program, stavový automat je nakonfigurován k jeho spuštění – všechny poziční/klíčové argumenty jsou předány metodě StateMachine.init().

Příklad:

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

Globální ID stavového automatu vráceného objektu je 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

Získá nebo nakonfiguruje blokovou IRQ pro tento PIO.

handler je callback, který se spustí, když se zaklíčuje kterákoliv z požadovaných IRQ stavových automatů. Handler obdrží tuto instanci PIO jako svůj jediný argument; uvnitř handleru lze spouštějící stavové automaty identifikovat pomocí self.irq().flags() v logickém součinu (AND) s konstantami IRQ_SM*.

trigger je bitová maska jedné nebo více hodnot IRQ_SM0 .. IRQ_SM3. Výchozí hodnota se spouští pro jakýkoliv stavový automat.

hard=True registruje handler tvrdého přerušení (žádná alokace na haldě v callbacku).

MicroPython váže IRQ 0 na každém PIO bloku; IRQ 1 je rezervována a z Pythonu není přístupná.

Konstanty

IN_LOW: int

Předejte do out_init / set_init / sideset_init funkce asm_pio(), aby pin začal jako vstup řízený na nízkou úroveň (tj. tristate s výstupním bufferem držícím 0).

IN_HIGH: int

Předejte do out_init / set_init / sideset_init funkce asm_pio(), aby pin začal jako vstup s výstupním bufferem držícím 1.

OUT_LOW: int

Předejte do out_init / set_init / sideset_init funkce asm_pio(), aby pin začal jako řízený výstup na logické 0.

OUT_HIGH: int

Předejte do out_init / set_init / sideset_init funkce asm_pio(), aby pin začal jako řízený výstup na logické 1.

SHIFT_LEFT: int

Předejte do in_shiftdir / out_shiftdir funkce asm_pio() nebo metody StateMachine.init(), aby se posuvy přesouvaly bity směrem k MSB.

SHIFT_RIGHT: int

Předejte do in_shiftdir / out_shiftdir funkce asm_pio() nebo metody StateMachine.init(), aby se posuvy přesouvaly bity směrem k LSB.

JOIN_NONE: int

Předejte do fifo_join funkce asm_pio(), aby měl stavový automat oddělená 4slovní TX a RX FIFO (výchozí).

JOIN_TX: int

Předejte do fifo_join funkce asm_pio(), aby se TX FIFO zdvojnásobilo na 8 slov pohlcením RX FIFO. Stavový automat již nemůže přijímat data.

JOIN_RX: int

Předejte do fifo_join funkce asm_pio(), aby se RX FIFO zdvojnásobilo na 8 slov pohlcením TX FIFO. Stavový automat již nemůže vysílat data.

IRQ_SM0: int

Příznak trigger metody irq(): stavový automat 0 vyvolal svou IRQ.

IRQ_SM1: int

Příznak trigger metody irq(): stavový automat 1 vyvolal svou IRQ.

IRQ_SM2: int

Příznak trigger metody irq(): stavový automat 2 vyvolal svou IRQ.

IRQ_SM3: int

Příznak trigger metody irq(): stavový automat 3 vyvolal svou IRQ.