klasa StateMachine – dostęp do interfejsu programowalnego wejścia/wyjścia mikrokontrolera RP2040¶
Klasa StateMachine zapewnia dostęp do interfejsu PIO (programowalnego wejścia/wyjścia) mikrokontrolera RP2040.
Informacje o asemblowaniu programów PIO znajdziesz w rp2.asm_pio().
Konstruktory¶
- class rp2.StateMachine(id: int, program: Callable | None = None, *args, **kwargs)¶
Pobiera maszynę stanów o numerze id. RP2040 ma dwie identyczne instancje PIO, każda z 4 maszynami stanów: zatem łącznie jest 8 maszyn stanów, ponumerowanych od 0 do 7.
Opcjonalnie inicjalizuje ją podanym programem program: zobacz
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¶
Konfiguruje instancję maszyny stanów do uruchomienia podanego program.
Program jest dodawany do pamięci instrukcji tej instancji PIO. Jeśli pamięć instrukcji już zawiera ten program, jego przesunięcie zostaje ponownie wykorzystane, co pozwala oszczędzić pamięć instrukcji.
freq to częstotliwość w Hz, z jaką ma działać maszyna stanów. Domyślnie częstotliwość zegara systemowego.
Dzielnik zegara jest obliczany jako
system clock frequency / freq, więc mogą wystąpić niewielkie błędy zaokrąglenia.Minimalny możliwy dzielnik zegara to jedna 65536-ta zegara systemowego: zatem przy domyślnej częstotliwości zegara systemowego 125 MHz minimalna wartość freq wynosi
1908. Aby uruchamiać maszyny stanów z niższymi częstotliwościami, należy obniżyć szybkość zegara systemowego za pomocąmachine.freq().in_base to pierwszy pin używany przez instrukcje
in().out_base to pierwszy pin używany przez instrukcje
out().set_base to pierwszy pin używany przez instrukcje
set().jmp_pin to pierwszy pin używany przez instrukcje
jmp(pin, ...).sideset_base to pierwszy pin używany do side-set.
in_shiftdir to kierunek, w którym przesuwa ISR, czyli
PIO.SHIFT_LEFTlubPIO.SHIFT_RIGHT.out_shiftdir to kierunek, w którym przesuwa OSR, czyli
PIO.SHIFT_LEFTlubPIO.SHIFT_RIGHT.push_thresh to próg w bitach, po którym uruchamiane jest automatyczne wypchnięcie (push) lub warunkowe ponowne wypchnięcie.
pull_thresh to próg w bitach, po którym uruchamiane jest automatyczne pobranie (pull) lub warunkowe ponowne pobranie.
Uwaga: piny używane jako in_base muszą być skonfigurowane ręcznie jako wejścia (lub inaczej), aby PIO mogło zobaczyć pożądany sygnał (mogą to być piny wejściowe, wyjściowe lub połączone z innym urządzeniem peryferyjnym). jmp_pin również można skonfigurować ręcznie, ale domyślnie będzie pinem wejściowym.
- active(value: bool | int | None = None, /) bool¶
Pobiera lub ustawia informację, czy maszyna stanów jest obecnie uruchomiona.
>>> sm.active() True >>> sm.active(0) False
- restart() None¶
Restartuje maszynę stanów i przeskakuje do początku programu.
Ta metoda czyści wewnętrzny stan maszyny stanów za pomocą rejestru
SM_RESTARTmikrokontrolera RP2040. Obejmuje to:liczniki przesunięć wejściowych i wyjściowych
zawartość wejściowego rejestru przesuwnego
licznik opóźnienia
stan oczekiwania na IRQ
zatrzymaną instrukcję uruchomioną za pomocą
StateMachine.exec()
- exec(instr: str | int) None¶
Wykonuje pojedynczą instrukcję PIO.
Jeśli instr jest łańcuchem znaków, używa
asm_pio_encodedo zakodowania instrukcji z podanego łańcucha.>>> sm.exec("set(0, 1)")Jeśli instr jest liczbą całkowitą, jest traktowana jako już zakodowana instrukcja kodu maszynowego PIO do wykonania.
>>> sm.exec(rp2.asm_pio_encode("out(y, 8)", 0))
- get(buf: 'bytearray | array | None' = None, shift: int = 0) int¶
Pobiera słowo z kolejki RX FIFO maszyny stanów.
Jeśli kolejka FIFO jest pusta, blokuje do momentu nadejścia danych (tj. dopóki maszyna stanów nie wypchnie słowa).
Wartość jest przesuwana w prawo o shift bitów przed zwróceniem, tj. zwracaną wartością jest
word >> shift.
- put(value: 'int | bytes | bytearray | array', shift: int = 0) None¶
Wypycha słowa do kolejki TX FIFO maszyny stanów.
value może być liczbą całkowitą, tablicą typu
B,HlubIalbo obiektembytearray.Ta metoda blokuje, dopóki wszystkie słowa nie zostaną zapisane do kolejki FIFO. Jeśli kolejka FIFO jest pełna lub stanie się pełna, metoda blokuje, dopóki maszyna stanów nie pobierze wystarczającej liczby słów, aby ukończyć zapis.
Każde słowo jest najpierw przesuwane w lewo o shift bitów, tj. maszyna stanów otrzymuje
word << shift.
- rx_fifo() int¶
Zwraca liczbę słów w kolejce RX FIFO maszyny stanów. Wartość 0 oznacza, że kolejka FIFO jest pusta.
Przydatne do sprawdzenia, czy dane czekają na odczyt, przed wywołaniem
StateMachine.get().
- tx_fifo() int¶
Zwraca liczbę słów w kolejce TX FIFO maszyny stanów. Wartość 0 oznacza, że kolejka FIFO jest pusta.
Przydatne do sprawdzenia, czy jest miejsce na wypchnięcie kolejnego słowa za pomocą
StateMachine.put().
Protokół bufora¶
Klasa StateMachine obsługuje buffer protocol, umożliwiając bezpośredni dostęp do kolejek FIFO nadawczych i odbiorczych każdej maszyny stanów. Służy to przede wszystkim umożliwieniu przekazywania obiektów StateMachine bezpośrednio jako parametry odczytu lub zapisu podczas konfigurowania kanału rp2.DMA().