class PIO – edistynyt PIO-käyttö

PIO-luokka kapseloi yhden RP2040:n kahdesta ohjelmoitavasta I/O-lohkosta (PIO). Jokainen PIO-lohko sisältää käskymuistin (32 käskyä), joka on jaettu neljän itsenäisen tilakoneen kesken, sekä yksityisen FIFO-rajapinnan kuhunkin tilakoneeseen ja IRQ-ohjaimen.

Useimmat skriptit ovat vuorovaikutuksessa PIO:n kanssa StateMachine -luokan kautta – tämä luokka on tarkoitettu edistyneisiin käyttötapauksiin, joissa täytyy:

  • Ladata ja poistaa ohjelmia eksplisiittisesti add_program() / remove_program() -metodien avulla.

  • Siirtää PIO:n GPIO-perustaa piirin 32-nastaisessa ikkunassa gpio_base() -metodilla.

  • Kytkeytyä lohkonlaajuisiin IRQ-lippuihin irq() -metodin kautta.

PIO-ohjelmien kokoamisesta katso rp2.asm_pio().

Konstruktorit

class rp2.PIO(id: int)

Palauttaa singleton-tyyppisen PIO -olion id -tunnisteella määritetylle PIO-lohkolle. RP2040:ssä on kaksi PIO-lohkoa, numeroitu 0 ja 1. Nostaa ValueError -poikkeuksen muilla tunnisteilla.

Metodit

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

Hakee tai asettaa tämän PIO-lohkon GPIO-perustan.

RP2040:n PIO näkee 32-nastaisen ikkunan GPIO-avaruuteen; ikkuna voi alkaa GPIO0:sta tai GPIO16:sta. Perusta määrää, mikä ikkuna on voimassa kaikille tämän PIO:n tilakoneille.

Ilman argumenttia palauttaa nykyisen perustan (GPIO-nastan numeron, 0 tai 16).

Argumentin kanssa asettaa perustan. base voi olla machine.Pin -instanssi tai kokonaislukuna ilmaistu nastan numero, ja sen on vastattava GPIO0:aa tai GPIO16:ta. Perusta on asetettava ennen kuin tähän PIO-lohkoon lisätään mitään ohjelmaa tai luodaan tilakone.

add_program(program: Callable) None

Lataa program tämän PIO:n käskymuistiin. Tuloksena syntyvä muistiasettelu käytetään uudelleen kaikkien tämän PIO-lohkon tilakoneiden kesken.

Kullakin PIO:lla on vain 32 käskyn verran ohjelmamuistia jaettuna kaikkien ohjelmien kesken; jos uusi ohjelma ei mahdu, tämä metodi nostaa OSError(ENOMEM) -poikkeuksen. Sama ohjelma voidaan ladata molempiin PIO-instansseihin, mutta ne kuluttavat erilliset muistialueet.

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

Poistaa program -ohjelman tämän PIO:n käskymuistista vapauttaen tilaa uusille ohjelmille. Jos program jätetään pois, kaikki tähän PIO:hon parhaillaan ladatut ohjelmat poistetaan.

Sellaisen ohjelman poistaminen, jota ei ollut ladattu, on tyhjä operaatio (ei poikkeusta).

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

Palauttaa yhden tämän PIO-lohkon neljästä StateMachine -instanssista. id on paikallinen tilakoneindeksi (03).

Jos program annetaan, tilakone konfiguroidaan suorittamaan se – kaikki positionaaliset/avainsana-argumentit välitetään StateMachine.init() -metodille.

Esimerkki:

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

Palautetun olion globaali tilakonetunniste on 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

Hakee tai konfiguroi tämän PIO:n lohkotason IRQ:n.

handler on takaisinkutsu, joka laukaistaan, kun mikä tahansa pyydetyistä tilakoneiden IRQ:ista lukittuu. Käsittelijä saa ainoana argumenttinaan tämän PIO -instanssin; käsittelijän sisällä laukaisevat tilakoneet voidaan tunnistaa self.irq().flags() -arvolla, joka AND-yhdistetään IRQ_SM* -vakioiden kanssa.

trigger on bittimaski yhdestä tai useammasta arvosta IRQ_SM0 .. IRQ_SM3. Oletuksena laukeaa minkä tahansa tilakoneen kohdalla.

hard=True rekisteröi kovan keskeytyksen käsittelijän (ei kekoallokointia takaisinkutsussa).

MicroPython sitoo IRQ 0:n kuhunkin PIO-lohkoon; IRQ 1 on varattu eikä siihen pääse Pythonista.

Vakiot

IN_LOW: int

Anna asm_pio() -funktion parametreille out_init / set_init / sideset_init, jolloin nasta alkaa alas vedettynä tulona (ts. kolmitilainen lähtöpuskurin pitäessä arvoa 0).

IN_HIGH: int

Anna asm_pio() -funktion parametreille out_init / set_init / sideset_init, jolloin nasta alkaa tulona lähtöpuskurin pitäessä arvoa 1.

OUT_LOW: int

Anna asm_pio() -funktion parametreille out_init / set_init / sideset_init, jolloin nasta alkaa ohjattuna lähtönä loogisella arvolla 0.

OUT_HIGH: int

Anna asm_pio() -funktion parametreille out_init / set_init / sideset_init, jolloin nasta alkaa ohjattuna lähtönä loogisella arvolla 1.

SHIFT_LEFT: int

Anna asm_pio() -funktion tai StateMachine.init() -metodin parametreille in_shiftdir / out_shiftdir, jolloin siirrot siirtävät bittejä kohti MSB:tä.

SHIFT_RIGHT: int

Anna asm_pio() -funktion tai StateMachine.init() -metodin parametreille in_shiftdir / out_shiftdir, jolloin siirrot siirtävät bittejä kohti LSB:tä.

JOIN_NONE: int

Anna asm_pio() -funktion parametrille fifo_join, jolloin tilakoneella on erilliset 4 sanan TX- ja RX-FIFO:t (oletus).

JOIN_TX: int

Anna asm_pio() -funktion parametrille fifo_join, jolloin TX-FIFO kaksinkertaistetaan 8 sanaan absorboimalla RX-FIFO. Tilakone ei voi enää vastaanottaa dataa.

JOIN_RX: int

Anna asm_pio() -funktion parametrille fifo_join, jolloin RX-FIFO kaksinkertaistetaan 8 sanaan absorboimalla TX-FIFO. Tilakone ei voi enää lähettää dataa.

IRQ_SM0: int

irq() trigger -lippu: tilakone 0 nosti IRQ:nsa.

IRQ_SM1: int

irq() trigger -lippu: tilakone 1 nosti IRQ:nsa.

IRQ_SM2: int

irq() trigger -lippu: tilakone 2 nosti IRQ:nsa.

IRQ_SM3: int

irq() trigger -lippu: tilakone 3 nosti IRQ:nsa.