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 medmachine.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_LEFTellerPIO.SHIFT_RIGHT.out_shiftdir är riktningen som OSR skiftar i, antingen
PIO.SHIFT_LEFTellerPIO.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_encodefö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,HellerI, eller enbytearray.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().
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.