class StateMachine – åtkomst till RP2040:s programmerbara I/O-gränssnitt

Klassen StateMachine ger åtkomst till RP2040:s PIO-gränssnitt (programmerbar I/O).

För att assemblera PIO-program, se rp2.asm_pio().

Konstruktorer

class rp2.StateMachine(id: int, program: Callable | None = None, *args, **kwargs)

Hämtar tillståndsmaskinen med numret id. RP2040 har två identiska PIO-instanser, var och en med 4 tillståndsmaskiner: det finns alltså 8 tillståndsmaskiner totalt, numrerade 0 till 7.

Initiera den eventuellt med det angivna programmet program: se 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

Konfigurerar tillståndsmaskininstansen att köra det angivna program.

Programmet läggs till i instruktionsminnet för denna PIO-instans. Om instruktionsminnet redan innehåller detta program återanvänds dess offset för att spara instruktionsminne.

  • freq är frekvensen i Hz som tillståndsmaskinen ska köras på. Standardvärdet är systemklockans frekvens.

    Klockdelaren beräknas som system clock frequency / freq, så det kan förekomma små avrundningsfel.

    Den minsta möjliga klockdelaren är en 65536-del av systemklockan: vid standardsystemklockfrekvensen 125MHz är därför minimivärdet för freq 1908. För att köra tillståndsmaskiner på lägre frekvenser måste du sänka systemklockans hastighet med machine.freq().

  • in_base är det första stiftet att använda för in()-instruktioner.

  • out_base är det första stiftet att använda för out()-instruktioner.

  • set_base är det första stiftet att använda för set()-instruktioner.

  • jmp_pin är det första stiftet att använda för jmp(pin, ...)-instruktioner.

  • sideset_base är det första stiftet att använda för side-set.

  • in_shiftdir är riktningen som ISR skiftar i, antingen PIO.SHIFT_LEFT eller PIO.SHIFT_RIGHT.

  • out_shiftdir är riktningen som OSR skiftar i, antingen PIO.SHIFT_LEFT eller PIO.SHIFT_RIGHT.

  • push_thresh är tröskelvärdet i bitar innan auto-push eller villkorlig återpush utlöses.

  • pull_thresh är tröskelvärdet i bitar innan auto-pull eller villkorlig återpull utlöses.

Obs: stift som används för in_base måste konfigureras manuellt för ingång (eller annat) så att PIO kan se den önskade signalen (de kan vara ingångsstift, utgångsstift eller anslutna till en annan kringutrustning). jmp_pin kan också konfigureras manuellt, men är som standard ett ingångsstift.

active(value: bool | int | None = None, /) bool

Hämtar eller anger huruvida tillståndsmaskinen för närvarande körs.

>>> sm.active()
True
>>> sm.active(0)
False
restart() None

Startar om tillståndsmaskinen och hoppar till programmets början.

Denna metod nollställer tillståndsmaskinens interna tillstånd med RP2040:s SM_RESTART-register. Detta inkluderar:

  • in- och utskiftningsräknare

  • innehållet i inskiftningsregistret

  • fördröjningsräknaren

  • tillståndet för väntan på IRQ

  • en stoppad instruktion som körts med StateMachine.exec()

exec(instr: str | int) None

Exekverar en enstaka PIO-instruktion.

Om instr är en sträng används asm_pio_encode för att koda instruktionen från den angivna strängen.

>>> sm.exec("set(0, 1)")

Om instr är ett heltal behandlas det som en redan kodad PIO-maskinkodsinstruktion som ska exekveras.

>>> sm.exec(rp2.asm_pio_encode("out(y, 8)", 0))
get(buf: 'bytearray | array | None' = None, shift: int = 0) int

Hämtar ett ord från tillståndsmaskinens RX-FIFO.

Om FIFO:n är tom blockerar den tills data anländer (dvs. tillståndsmaskinen skickar ett ord).

Värdet skiftas höger med shift bitar innan det returneras, dvs. returvärdet är word >> shift.

put(value: 'int | bytes | bytearray | array', shift: int = 0) None

Lägger ord i tillståndsmaskinens TX-FIFO.

value kan vara ett heltal, en array av typen B, H eller I, eller en bytearray.

Denna metod blockerar tills alla ord har skrivits till FIFO:n. Om FIFO:n är, eller blir, full blockerar metoden tills tillståndsmaskinen hämtar tillräckligt många ord för att slutföra skrivningen.

Varje ord skiftas först vänster med shift bitar, dvs. tillståndsmaskinen tar emot word << shift.

rx_fifo() int

Returnerar antalet ord i tillståndsmaskinens RX-FIFO. Värdet 0 indikerar att FIFO:n är tom.

Användbart för att kontrollera om data väntar på att läsas innan StateMachine.get() anropas.

tx_fifo() int

Returnerar antalet ord i tillståndsmaskinens TX-FIFO. Värdet 0 indikerar att FIFO:n är tom.

Användbart för att kontrollera om det finns plats att lägga in ytterligare ett ord med StateMachine.put().

irq(handler: Callable[[StateMachine], None] | None = None, trigger: int = 0 | 1, hard: bool = False) Callable

Returnerar IRQ-objektet för den angivna StateMachine.

Konfigurera det eventuellt.

Buffertprotokoll

Klassen StateMachine stöder buffer protocol, vilket möjliggör direkt åtkomst till sänd- och mottagnings-FIFO:erna för varje tillståndsmaskin. Detta är främst till för att tillåta att StateMachine-objekt skickas direkt som läs- eller skrivparametrar vid konfiguration av en rp2.DMA()-kanal.