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
PIOpentru blocul PIO identificat prinid. RP2040 are două blocuri PIO, numerotate0și1. GenereazăValueErrorpentru 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,
0sau16).Cu un argument, setează baza.
basepoate fi o instanțămachine.Pinsau 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ă
programdin memoria de instrucțiuni a acestui PIO, eliberând spațiu pentru programe noi. Dacăprogrameste 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
StateMachinedeținute de acest bloc PIO.ideste indexul local al mașinii de stare (0–3).Dacă este furnizat
program, mașina de stare este configurată să îl ruleze – toate argumentele poziționale/cu cuvinte-cheie sunt transmise cătreStateMachine.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.
handlereste 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țăPIOca singur argument; în interiorul handlerului, mașinile de stare care s-au declanșat pot fi identificate prinself.irq().flags()aplicat cu AND asupra constantelorIRQ_SM*.triggereste o mască de biți compusă din una sau mai multe dintreIRQ_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_initdinasm_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_initdinasm_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_initdinasm_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_initdinasm_pio()astfel încât pinul să pornească ca ieșire comandată la nivel logic 1.
- SHIFT_LEFT: int¶
Se transmite lui
in_shiftdir/out_shiftdirdinasm_pio()sauStateMachine.init()astfel încât deplasările să mute biții către MSB.
- SHIFT_RIGHT: int¶
Se transmite lui
in_shiftdir/out_shiftdirdinasm_pio()sauStateMachine.init()astfel încât deplasările să mute biții către LSB.
- JOIN_NONE: int¶
Se transmite lui
fifo_joindinasm_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_joindinasm_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.