klasa PIO – napredno korištenje PIO-a

Klasa PIO omata jedan od dvaju blokova programabilnog ulaza/izlaza (PIO) RP2040. Svaki PIO blok sadrži memoriju instrukcija (32 instrukcije) zajedničku za četiri neovisna stanja stroja, uz privatno FIFO sučelje za svaki stroj stanja i IRQ kontroler.

Većina skripti komunicira s PIO-om putem StateMachine – ova klasa namijenjena je za napredne slučajeve korištenja koji trebaju:

  • Izričito učitavati i uklanjati programe putem add_program() / remove_program().

  • Pomicati GPIO bazu PIO-a unutar 32-pinskog prozora čipa putem gpio_base().

  • Spajati se na zastavice IRQ-a na razini cijelog bloka putem irq().

Za sastavljanje PIO programa pogledajte rp2.asm_pio().

Konstruktori

class rp2.PIO(id: int)

Vraća jedinstveni (singleton) objekt PIO za PIO blok određen s id. RP2040 ima dva PIO bloka, označena s 0 i 1. Podiže ValueError za bilo koji drugi id.

Metode

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

Dohvaća ili postavlja GPIO bazu za ovaj PIO blok.

PIO RP2040 vidi 32-pinski prozor u GPIO prostoru; prozor može započeti na GPIO0 ili GPIO16. Baza upravlja time koji je prozor na snazi za sve strojeve stanja na ovom PIO-u.

Bez argumenta vraća trenutnu bazu (broj GPIO pina, 0 ili 16).

S argumentom postavlja bazu. base može biti instanca machine.Pin ili cjelobrojni broj pina, a mora se razriješiti na GPIO0 ili GPIO16. Baza se mora postaviti prije dodavanja bilo kojeg programa ili konstruiranja stroja stanja na ovom PIO bloku.

add_program(program: Callable) None

Učitava program u memoriju instrukcija ovog PIO-a. Rezultirajući raspored memorije ponovno se koristi za sve strojeve stanja na ovom PIO bloku.

Svaki PIO ima samo 32 instrukcije programske memorije zajedničke za sve programe; ako novi program ne stane, ova metoda podiže OSError(ENOMEM). Isti se program može učitati na obje PIO instance, ali one koriste odvojene regije memorije.

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

Uklanja program iz memorije instrukcija ovog PIO-a, oslobađajući prostor za nove programe. Ako je program izostavljen, uklanjaju se svi programi trenutno učitani na ovom PIO-u.

Uklanjanje programa koji nije bio učitan nema učinka (bez iznimke).

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

Vraća jednu od četiri instance StateMachine u vlasništvu ovog PIO bloka. id je lokalni indeks stroja stanja (03).

Ako je naveden program, stroj stanja konfiguriran je da ga pokrene – svi pozicijski/ključni argumenti prosljeđuju se metodi StateMachine.init().

Primjer:

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

Globalni ID stroja stanja vraćenog objekta 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

Dohvaća ili konfigurira IRQ na razini bloka za ovaj PIO.

handler je povratni poziv koji se aktivira kada se zaključa bilo koji od zatraženih IRQ-ova strojeva stanja. Rukovatelj prima ovu instancu PIO kao jedini argument; unutar rukovatelja strojevi stanja koji su se aktivirali mogu se identificirati putem self.irq().flags() u kombinaciji (AND) s konstantama IRQ_SM*.

trigger je bitmaska jednog ili više IRQ_SM0 .. IRQ_SM3. Zadano se aktivira na bilo kojem stroju stanja.

hard=True registrira rukovatelj tvrdim prekidom (bez alokacije gomile u povratnom pozivu).

MicroPython veže IRQ 0 na svakom PIO bloku; IRQ 1 je rezerviran i nije dostupan iz Pythona.

Konstante

IN_LOW: int

Proslijedite u out_init / set_init / sideset_init od asm_pio() tako da pin započne kao ulaz vođen na nisku razinu (tj. tristate s izlaznim međuspremnikom koji drži 0).

IN_HIGH: int

Proslijedite u out_init / set_init / sideset_init od asm_pio() tako da pin započne kao ulaz s izlaznim međuspremnikom koji drži 1.

OUT_LOW: int

Proslijedite u out_init / set_init / sideset_init od asm_pio() tako da pin započne kao vođeni izlaz na logičkoj 0.

OUT_HIGH: int

Proslijedite u out_init / set_init / sideset_init od asm_pio() tako da pin započne kao vođeni izlaz na logičkoj 1.

SHIFT_LEFT: int

Proslijedite u in_shiftdir / out_shiftdir od asm_pio() ili StateMachine.init() tako da pomaci pomiču bitove prema MSB.

SHIFT_RIGHT: int

Proslijedite u in_shiftdir / out_shiftdir od asm_pio() ili StateMachine.init() tako da pomaci pomiču bitove prema LSB.

JOIN_NONE: int

Proslijedite u fifo_join od asm_pio() tako da stroj stanja ima odvojene 4-riječne TX i RX FIFO-e (zadano).

JOIN_TX: int

Proslijedite u fifo_join od asm_pio() tako da se TX FIFO udvostruči na 8 riječi apsorbiranjem RX FIFO-a. Stroj stanja više ne može primati podatke.

JOIN_RX: int

Proslijedite u fifo_join od asm_pio() tako da se RX FIFO udvostruči na 8 riječi apsorbiranjem TX FIFO-a. Stroj stanja više ne može odašiljati podatke.

IRQ_SM0: int

Zastavica trigger metode irq(): stroj stanja 0 podigao je svoj IRQ.

IRQ_SM1: int

Zastavica trigger metode irq(): stroj stanja 1 podigao je svoj IRQ.

IRQ_SM2: int

Zastavica trigger metode irq(): stroj stanja 2 podigao je svoj IRQ.

IRQ_SM3: int

Zastavica trigger metode irq(): stroj stanja 3 podigao je svoj IRQ.