clasa PIO – utilizare avansată a PIO

Clasa PIO încapsulează unul dintre cele două blocuri Programmable I/O (PIO) ale RP2040. Fiecare bloc PIO conține o memorie de instrucțiuni (32 de instrucțiuni) partajată de patru mașini de stare independente, plus o interfață FIFO privată pentru fiecare mașină de stare și un controler IRQ.

Majoritatea scripturilor interacționează cu PIO prin StateMachine – această clasă este destinată cazurilor de utilizare avansate care trebuie să:

  • Încarce și să elimine programe explicit prin add_program() / remove_program().

  • Mute baza GPIO a PIO peste fereastra de 32 de pini a cipului prin gpio_base().

  • Se conecteze la indicatorii IRQ la nivel de bloc prin irq().

Pentru asamblarea programelor PIO consultați rp2.asm_pio().

Constructori

class rp2.PIO(id: int)

Returnează obiectul singleton PIO pentru blocul PIO identificat prin id. RP2040 are două blocuri PIO, numerotate 0 și 1. Generează ValueError pentru orice alt id.

Metode

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

Obține sau setează baza GPIO pentru acest bloc PIO.

PIO-ul RP2040 vede o fereastră de 32 de pini în spațiul GPIO; fereastra poate începe la GPIO0 sau GPIO16. Baza controlează care fereastră este în vigoare pentru toate mașinile de stare de pe acest PIO.

Fără niciun argument, returnează baza curentă (numărul pinului GPIO, 0 sau 16).

Cu un argument, setează baza. base poate fi o instanță machine.Pin sau numărul întreg al pinului și trebuie să se rezolve la GPIO0 sau GPIO16. Baza trebuie setată înainte de adăugarea oricărui program sau de construirea oricărei mașini de stare pe acest bloc PIO.

add_program(program: Callable) None

Încarcă program în memoria de instrucțiuni a acestui PIO. Schema de memorie rezultată este reutilizată de toate mașinile de stare de pe acest bloc PIO.

Fiecare PIO are doar 32 de instrucțiuni de memorie de program partajate între toate programele; dacă noul program nu încape, această metodă generează OSError(ENOMEM). Același program poate fi încărcat pe ambele instanțe PIO, dar acestea consumă regiuni de memorie separate.

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

Elimină program din memoria de instrucțiuni a acestui PIO, eliberând spațiu pentru programe noi. Dacă program este omis, fiecare program încărcat în prezent pe acest PIO este eliminat.

Eliminarea unui program care nu a fost încărcat nu are niciun efect (fără excepție).

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

Returnează una dintre cele patru instanțe StateMachine deținute de acest bloc PIO. id este indexul local al mașinii de stare (03).

Dacă este furnizat program, mașina de stare este configurată să îl ruleze – toate argumentele poziționale/cu cuvinte-cheie sunt transmise către StateMachine.init().

Exemplu:

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

ID-ul global al mașinii de stare al obiectului returnat este 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

Obține sau configurează IRQ-ul la nivel de bloc pentru acest PIO.

handler este funcția de retroapelare (callback) care se declanșează atunci când oricare dintre IRQ-urile solicitate ale mașinilor de stare se activează. Handlerul primește această instanță PIO ca singur argument; în interiorul handlerului, mașinile de stare care s-au declanșat pot fi identificate prin self.irq().flags() aplicat cu AND asupra constantelor IRQ_SM*.

trigger este o mască de biți compusă din una sau mai multe dintre IRQ_SM0 .. IRQ_SM3. Valoarea implicită se declanșează pentru orice mașină de stare.

hard=True înregistrează un handler de întrerupere hardware (fără alocare de memorie heap în funcția de retroapelare).

MicroPython leagă IRQ 0 pe fiecare bloc PIO; IRQ 1 este rezervat și nu este accesibil din Python.

Constante

IN_LOW: int

Se transmite lui out_init / set_init / sideset_init din asm_pio() astfel încât pinul să pornească ca intrare comandată la nivel jos (adică tristate, cu tamponul de ieșire menținând un 0).

IN_HIGH: int

Se transmite lui out_init / set_init / sideset_init din asm_pio() astfel încât pinul să pornească ca intrare cu tamponul de ieșire menținând un 1.

OUT_LOW: int

Se transmite lui out_init / set_init / sideset_init din asm_pio() astfel încât pinul să pornească ca ieșire comandată la nivel logic 0.

OUT_HIGH: int

Se transmite lui out_init / set_init / sideset_init din asm_pio() astfel încât pinul să pornească ca ieșire comandată la nivel logic 1.

SHIFT_LEFT: int

Se transmite lui in_shiftdir / out_shiftdir din asm_pio() sau StateMachine.init() astfel încât deplasările să mute biții către MSB.

SHIFT_RIGHT: int

Se transmite lui in_shiftdir / out_shiftdir din asm_pio() sau StateMachine.init() astfel încât deplasările să mute biții către LSB.

JOIN_NONE: int

Se transmite lui fifo_join din asm_pio() astfel încât mașina de stare să aibă FIFO-uri TX și RX separate de câte 4 cuvinte (valoarea implicită).

JOIN_TX: int

Se transmite lui fifo_join din asm_pio() astfel încât FIFO-ul TX să fie dublat la 8 cuvinte prin absorbirea FIFO-ului RX. Mașina de stare nu mai poate primi date.

JOIN_RX: int

Se transmite lui fifo_join din asm_pio() astfel încât FIFO-ul RX să fie dublat la 8 cuvinte prin absorbirea FIFO-ului TX. Mașina de stare nu mai poate transmite date.

IRQ_SM0: int

Indicator trigger pentru irq(): mașina de stare 0 și-a ridicat IRQ-ul.

IRQ_SM1: int

Indicator trigger pentru irq(): mașina de stare 1 și-a ridicat IRQ-ul.

IRQ_SM2: int

Indicator trigger pentru irq(): mașina de stare 2 și-a ridicat IRQ-ul.

IRQ_SM3: int

Indicator trigger pentru irq(): mașina de stare 3 și-a ridicat IRQ-ul.