class StateMachine – toegang tot de programmeerbare I/O-interface van de RP2040¶
De klasse StateMachine geeft toegang tot de PIO (programmeerbare I/O)-interface van de RP2040.
Voor het assembleren van PIO-programma’s, zie rp2.asm_pio().
Constructors¶
- class rp2.StateMachine(id: int, program: Callable | None = None, *args, **kwargs)¶
Haal de toestandsmachine met nummer id op. De RP2040 heeft twee identieke PIO-instanties, elk met 4 toestandsmachines: er zijn dus in totaal 8 toestandsmachines, genummerd 0 tot en met 7.
Initialiseer deze optioneel met het opgegeven programma program: zie
StateMachine.init.- init(program: Callable, freq: int = -1, *, in_base: machine.Pin | None = None, out_base: machine.Pin | None = None, set_base: machine.Pin | None = None, jmp_pin: machine.Pin | None = None, sideset_base: machine.Pin | None = None, in_shiftdir: int | None = None, out_shiftdir: int | None = None, push_thresh: int | None = None, pull_thresh: int | None = None) None¶
Configureer de toestandsmachine-instantie om het opgegeven program uit te voeren.
Het programma wordt toegevoegd aan het instructiegeheugen van deze PIO-instantie. Als het instructiegeheugen dit programma al bevat, wordt de offset ervan hergebruikt om instructiegeheugen te besparen.
freq is de frequentie in Hz waarop de toestandsmachine moet draaien. Standaard de systeemklokfrequentie.
De klokdeler wordt berekend als
system clock frequency / freq, dus er kunnen kleine afrondingsfouten optreden.De minimaal mogelijke klokdeler is een 65536e van de systeemklok: bij de standaard systeemklokfrequentie van 125MHz is de minimumwaarde van freq dus
1908. Om toestandsmachines op lagere frequenties te laten draaien, moet je de systeemkloksnelheid verlagen metmachine.freq().in_base is de eerste pin die wordt gebruikt voor
in()-instructies.out_base is de eerste pin die wordt gebruikt voor
out()-instructies.set_base is de eerste pin die wordt gebruikt voor
set()-instructies.jmp_pin is de eerste pin die wordt gebruikt voor
jmp(pin, ...)-instructies.sideset_base is de eerste pin die wordt gebruikt voor side-setting.
in_shiftdir is de richting waarin de ISR zal verschuiven, ofwel
PIO.SHIFT_LEFTofwelPIO.SHIFT_RIGHT.out_shiftdir is de richting waarin de OSR zal verschuiven, ofwel
PIO.SHIFT_LEFTofwelPIO.SHIFT_RIGHT.push_thresh is de drempelwaarde in bits voordat auto-push of voorwaardelijk opnieuw pushen wordt geactiveerd.
pull_thresh is de drempelwaarde in bits voordat auto-pull of voorwaardelijk opnieuw pullen wordt geactiveerd.
Opmerking: pinnen die voor in_base worden gebruikt moeten handmatig worden geconfigureerd als ingang (of anderszins) zodat de PIO het gewenste signaal kan zien (het kunnen ingangspinnen, uitgangspinnen of pinnen verbonden met een ander randapparaat zijn). De jmp_pin kan ook handmatig worden geconfigureerd, maar zal standaard een ingangspin zijn.
- active(value: bool | int | None = None, /) bool¶
Haalt op of stelt in of de toestandsmachine momenteel draait.
>>> sm.active() True >>> sm.active(0) False
- restart() None¶
Herstart de toestandsmachine en springt naar het begin van het programma.
Deze methode wist de interne toestand van de toestandsmachine met behulp van het
SM_RESTART-register van de RP2040. Dit omvat:in- en uitgangsverschuivingstellers
de inhoud van het ingangsverschuivingsregister
de vertragingsteller
de wachten-op-IRQ-toestand
een vastgelopen instructie uitgevoerd met
StateMachine.exec()
- exec(instr: str | int) None¶
Voer een enkele PIO-instructie uit.
Als instr een string is, wordt
asm_pio_encodegebruikt om de instructie vanuit de opgegeven string te coderen.>>> sm.exec("set(0, 1)")Als instr een geheel getal is, wordt het behandeld als een reeds gecodeerde PIO-machinecode-instructie die moet worden uitgevoerd.
>>> sm.exec(rp2.asm_pio_encode("out(y, 8)", 0))
- get(buf: 'bytearray | array | None' = None, shift: int = 0) int¶
Haal een woord uit de RX-FIFO van de toestandsmachine.
Als de FIFO leeg is, blokkeert het totdat er gegevens arriveren (d.w.z. de toestandsmachine een woord pusht).
De waarde wordt vóór retournering met shift bits naar rechts verschoven, d.w.z. de retourwaarde is
word >> shift.
- put(value: 'int | bytes | bytearray | array', shift: int = 0) None¶
Push woorden naar de TX-FIFO van de toestandsmachine.
value kan een geheel getal zijn, een array van het type
B,HofI, of eenbytearray.Deze methode blokkeert totdat alle woorden naar de FIFO zijn geschreven. Als de FIFO vol is of wordt, blokkeert de methode totdat de toestandsmachine voldoende woorden pullt om de schrijfbewerking te voltooien.
Elk woord wordt eerst met shift bits naar links verschoven, d.w.z. de toestandsmachine ontvangt
word << shift.
- rx_fifo() int¶
Retourneert het aantal woorden in de RX-FIFO van de toestandsmachine. Een waarde van 0 geeft aan dat de FIFO leeg is.
Handig om te controleren of er gegevens wachten om gelezen te worden, voordat
StateMachine.get()wordt aangeroepen.
- tx_fifo() int¶
Retourneert het aantal woorden in de TX-FIFO van de toestandsmachine. Een waarde van 0 geeft aan dat de FIFO leeg is.
Handig om te controleren of er ruimte is om nog een woord te pushen met
StateMachine.put().
Buffer protocol¶
De klasse StateMachine ondersteunt het buffer protocol, wat directe toegang mogelijk maakt tot de zend- en ontvangst-FIFO’s voor elke toestandsmachine. Dit is voornamelijk bedoeld om StateMachine-objecten rechtstreeks als de read- of write-parameters te kunnen doorgeven bij het configureren van een rp2.DMA()-kanaal.