class PIO – geavanceerd PIO-gebruik

De klasse PIO omhult een van de twee Programmable I/O (PIO)-blokken van de RP2040. Elk PIO-blok bevat een instructiegeheugen (32 instructies) dat wordt gedeeld door vier onafhankelijke toestandsmachines, plus een privé FIFO-interface naar elke toestandsmachine en een IRQ-controller.

De meeste scripts werken met PIO via StateMachine – deze klasse is bedoeld voor geavanceerde gebruiksscenario’s die het volgende nodig hebben:

  • Programma’s expliciet laden en verwijderen via add_program() / remove_program().

  • De GPIO-basis van de PIO verplaatsen binnen het 32-pinsvenster van de chip via gpio_base().

  • Inhaken op blokbrede IRQ-vlaggen via irq().

Voor het assembleren van PIO-programma’s, zie rp2.asm_pio().

Constructors

class rp2.PIO(id: int)

Retourneer het singleton-object PIO voor het PIO-blok dat wordt geïdentificeerd door id. De RP2040 heeft twee PIO-blokken, genummerd 0 en 1. Werpt ValueError op voor elke andere id.

Methods

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

Haal de GPIO-basis voor dit PIO-blok op of stel deze in.

De PIO van de RP2040 ziet een venster van 32 pinnen in de GPIO-ruimte; het venster kan beginnen bij GPIO0 of GPIO16. De basis bepaalt welk venster van kracht is voor alle toestandsmachines op deze PIO.

Zonder argument retourneert het de huidige basis (het GPIO-pinnummer, 0 of 16).

Met een argument wordt de basis ingesteld. base mag een machine.Pin-instantie of het gehele pinnummer zijn, en moet herleiden naar GPIO0 of GPIO16. De basis moet worden ingesteld voordat er een programma wordt toegevoegd of een toestandsmachine wordt geconstrueerd op dit PIO-blok.

add_program(program: Callable) None

Laad program in het instructiegeheugen van deze PIO. De resulterende geheugenindeling wordt hergebruikt door alle toestandsmachines op dit PIO-blok.

Elke PIO heeft slechts 32 instructies aan programmageheugen die over alle programma’s worden gedeeld; als het nieuwe programma niet past, werpt deze methode OSError(ENOMEM) op. Hetzelfde programma kan op beide PIO-instanties worden geladen, maar ze verbruiken afzonderlijke geheugenregio’s.

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

Verwijder program uit het instructiegeheugen van deze PIO, waardoor er ruimte vrijkomt voor nieuwe programma’s. Als program wordt weggelaten, wordt elk programma dat momenteel op deze PIO is geladen verwijderd.

Een programma verwijderen dat niet was geladen heeft geen effect (geen uitzondering).

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

Retourneer een van de vier StateMachine-instanties die eigendom zijn van dit PIO-blok. id is de lokale toestandsmachine-index (03).

Als program wordt opgegeven, wordt de toestandsmachine geconfigureerd om dit uit te voeren – alle positionele/sleutelwoordargumenten worden doorgestuurd naar StateMachine.init().

Voorbeeld:

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

De globale toestandsmachine-ID van het geretourneerde object is 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

Haal de IRQ op blokniveau voor deze PIO op of configureer deze.

handler is de callback die wordt geactiveerd wanneer een van de aangevraagde toestandsmachine-IRQ’s vergrendelt. De handler ontvangt deze PIO-instantie als enige argument; binnen de handler kunnen de activerende toestandsmachines worden geïdentificeerd via self.irq().flags() ge-AND met de IRQ_SM*-constanten.

trigger is een bitmasker van een of meer IRQ_SM0 .. IRQ_SM3. De standaard activeert op elke toestandsmachine.

hard=True registreert een hard-interrupt-handler (geen heap-allocatie in de callback).

MicroPython koppelt IRQ 0 op elk PIO-blok; IRQ 1 is gereserveerd en niet toegankelijk vanuit Python.

Constants

IN_LOW: int

Geef door aan out_init / set_init / sideset_init van asm_pio() zodat de pin start als een ingang die laag wordt aangestuurd (d.w.z. tristate met de uitgangsbuffer op 0).

IN_HIGH: int

Geef door aan out_init / set_init / sideset_init van asm_pio() zodat de pin start als een ingang met de uitgangsbuffer op 1.

OUT_LOW: int

Geef door aan out_init / set_init / sideset_init van asm_pio() zodat de pin start als een aangestuurde uitgang op logisch 0.

OUT_HIGH: int

Geef door aan out_init / set_init / sideset_init van asm_pio() zodat de pin start als een aangestuurde uitgang op logisch 1.

SHIFT_LEFT: int

Geef door aan in_shiftdir / out_shiftdir van asm_pio() of StateMachine.init() zodat verschuivingen bits richting de MSB verplaatsen.

SHIFT_RIGHT: int

Geef door aan in_shiftdir / out_shiftdir van asm_pio() of StateMachine.init() zodat verschuivingen bits richting de LSB verplaatsen.

JOIN_NONE: int

Geef door aan fifo_join van asm_pio() zodat de toestandsmachine afzonderlijke TX- en RX-FIFO’s van 4 woorden heeft (de standaard).

JOIN_TX: int

Geef door aan fifo_join van asm_pio() zodat de TX-FIFO wordt verdubbeld tot 8 woorden door de RX-FIFO te absorberen. De toestandsmachine kan dan geen gegevens meer ontvangen.

JOIN_RX: int

Geef door aan fifo_join van asm_pio() zodat de RX-FIFO wordt verdubbeld tot 8 woorden door de TX-FIFO te absorberen. De toestandsmachine kan dan geen gegevens meer verzenden.

IRQ_SM0: int

irq() trigger-vlag: toestandsmachine 0 heeft haar IRQ geactiveerd.

IRQ_SM1: int

irq() trigger-vlag: toestandsmachine 1 heeft haar IRQ geactiveerd.

IRQ_SM2: int

irq() trigger-vlag: toestandsmachine 2 heeft haar IRQ geactiveerd.

IRQ_SM3: int

irq() trigger-vlag: toestandsmachine 3 heeft haar IRQ geactiveerd.