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_LEFT lub PIO.SHIFT_RIGHT.

  • out_shiftdir to kierunek, w którym przesuwa OSR, czyli PIO.SHIFT_LEFT lub PIO.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_RESTART mikrokontrolera 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_encode do 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, H lub I albo obiektem bytearray.

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().

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

Zwraca obiekt IRQ dla danej maszyny stanów (StateMachine).

Opcjonalnie ją konfiguruje.

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().