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
PIOvoor het PIO-blok dat wordt geïdentificeerd doorid. De RP2040 heeft twee PIO-blokken, genummerd0en1. WerptValueErrorop 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,
0of16).Met een argument wordt de basis ingesteld.
basemag eenmachine.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
programin 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
programuit het instructiegeheugen van deze PIO, waardoor er ruimte vrijkomt voor nieuwe programma’s. Alsprogramwordt 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.idis de lokale toestandsmachine-index (0–3).Als
programwordt opgegeven, wordt de toestandsmachine geconfigureerd om dit uit te voeren – alle positionele/sleutelwoordargumenten worden doorgestuurd naarStateMachine.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.
handleris de callback die wordt geactiveerd wanneer een van de aangevraagde toestandsmachine-IRQ’s vergrendelt. De handler ontvangt dezePIO-instantie als enige argument; binnen de handler kunnen de activerende toestandsmachines worden geïdentificeerd viaself.irq().flags()ge-AND met deIRQ_SM*-constanten.triggeris een bitmasker van een of meerIRQ_SM0..IRQ_SM3. De standaard activeert op elke toestandsmachine.hard=Trueregistreert 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_initvanasm_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_initvanasm_pio()zodat de pin start als een ingang met de uitgangsbuffer op 1.
- OUT_LOW: int¶
Geef door aan
out_init/set_init/sideset_initvanasm_pio()zodat de pin start als een aangestuurde uitgang op logisch 0.
- OUT_HIGH: int¶
Geef door aan
out_init/set_init/sideset_initvanasm_pio()zodat de pin start als een aangestuurde uitgang op logisch 1.
- SHIFT_LEFT: int¶
Geef door aan
in_shiftdir/out_shiftdirvanasm_pio()ofStateMachine.init()zodat verschuivingen bits richting de MSB verplaatsen.
- SHIFT_RIGHT: int¶
Geef door aan
in_shiftdir/out_shiftdirvanasm_pio()ofStateMachine.init()zodat verschuivingen bits richting de LSB verplaatsen.
- JOIN_NONE: int¶
Geef door aan
fifo_joinvanasm_pio()zodat de toestandsmachine afzonderlijke TX- en RX-FIFO’s van 4 woorden heeft (de standaard).
- JOIN_TX: int¶
Geef door aan
fifo_joinvanasm_pio()zodat de TX-FIFO wordt verdubbeld tot 8 woorden door de RX-FIFO te absorberen. De toestandsmachine kan dan geen gegevens meer ontvangen.