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
PIOpro PIO blok určený parametremid. RP2040 má dva PIO bloky, číslované0a1. 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,
0nebo16).S argumentem nastaví základ.
basemůže být instancemachine.Pinnebo 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
programdo 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
programz instrukční paměti tohoto PIO a uvolní místo pro nové programy. Pokud jeprogramvynechá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í
StateMachinevlastněných tímto PIO blokem.idje lokální index stavového automatu (0–3).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.
handlerje callback, který se spustí, když se zaklíčuje kterákoliv z požadovaných IRQ stavových automatů. Handler obdrží tuto instanciPIOjako 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 konstantamiIRQ_SM*.triggerje bitová maska jedné nebo více hodnotIRQ_SM0..IRQ_SM3. Výchozí hodnota se spouští pro jakýkoliv stavový automat.hard=Trueregistruje 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_initfunkceasm_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_initfunkceasm_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_initfunkceasm_pio(), aby pin začal jako řízený výstup na logické 0.
- OUT_HIGH: int¶
Předejte do
out_init/set_init/sideset_initfunkceasm_pio(), aby pin začal jako řízený výstup na logické 1.
- SHIFT_LEFT: int¶
Předejte do
in_shiftdir/out_shiftdirfunkceasm_pio()nebo metodyStateMachine.init(), aby se posuvy přesouvaly bity směrem k MSB.
- SHIFT_RIGHT: int¶
Předejte do
in_shiftdir/out_shiftdirfunkceasm_pio()nebo metodyStateMachine.init(), aby se posuvy přesouvaly bity směrem k LSB.
- JOIN_NONE: int¶
Předejte do
fifo_joinfunkceasm_pio(), aby měl stavový automat oddělená 4slovní TX a RX FIFO (výchozí).
- JOIN_TX: int¶
Předejte do
fifo_joinfunkceasm_pio(), aby se TX FIFO zdvojnásobilo na 8 slov pohlcením RX FIFO. Stavový automat již nemůže přijímat data.