klasa PIO – zaawansowane wykorzystanie PIO

Klasa PIO opakowuje jeden z dwóch bloków programowalnego wejścia/wyjścia (PIO) mikrokontrolera RP2040. Każdy blok PIO zawiera pamięć instrukcji (32 instrukcje) współdzieloną przez cztery niezależne maszyny stanów, a także prywatny interfejs FIFO do każdej maszyny stanów oraz kontroler IRQ.

Większość skryptów współpracuje z PIO za pośrednictwem StateMachine – ta klasa jest przeznaczona do zaawansowanych zastosowań, które wymagają:

  • Jawnego ładowania i usuwania programów za pomocą add_program() / remove_program().

  • Przesuwania bazy GPIO bloku PIO w obrębie 32-pinowego okna układu za pomocą gpio_base().

  • Podpięcia się pod flagi IRQ obejmujące cały blok za pomocą irq().

Informacje o asemblowaniu programów PIO znajdziesz w rp2.asm_pio().

Konstruktory

class rp2.PIO(id: int)

Zwraca pojedynczy obiekt PIO dla bloku PIO określonego przez id. RP2040 ma dwa bloki PIO, ponumerowane 0 i 1. Zgłasza ValueError dla każdego innego id.

Metody

gpio_base(base: machine.Pin | int | None = None, /) int

Pobiera lub ustawia bazę GPIO dla tego bloku PIO.

PIO mikrokontrolera RP2040 widzi 32-pinowe okno w przestrzeni GPIO; okno może zaczynać się od GPIO0 lub GPIO16. Baza określa, które okno obowiązuje dla wszystkich maszyn stanów tego bloku PIO.

Bez argumentu zwraca bieżącą bazę (numer pinu GPIO, 0 lub 16).

Z argumentem ustawia bazę. base może być instancją machine.Pin lub całkowitym numerem pinu i musi rozwiązać się do GPIO0 lub GPIO16. Bazę należy ustawić przed dodaniem jakiegokolwiek programu lub utworzeniem maszyny stanów na tym bloku PIO.

add_program(program: Callable) None

Ładuje program do pamięci instrukcji tego bloku PIO. Wynikowy układ pamięci jest ponownie wykorzystywany przez wszystkie maszyny stanów tego bloku PIO.

Każdy blok PIO ma tylko 32 instrukcje pamięci programu współdzielone przez wszystkie programy; jeśli nowy program się nie mieści, ta metoda zgłasza OSError(ENOMEM). Ten sam program można załadować do obu instancji PIO, ale zajmują one odrębne obszary pamięci.

remove_program(program: Callable | None = None, /) None

Usuwa program z pamięci instrukcji tego bloku PIO, zwalniając miejsce na nowe programy. Jeśli program zostanie pominięty, usuwane są wszystkie programy aktualnie załadowane do tego bloku PIO.

Usunięcie programu, który nie został załadowany, nie ma żadnego efektu (bez wyjątku).

state_machine(id: int, program: Callable | None = None, *args, **kwargs) StateMachine

Zwraca jedną z czterech instancji StateMachine należących do tego bloku PIO. id to lokalny indeks maszyny stanów (03).

Jeśli podano program, maszyna stanów jest skonfigurowana do jego uruchomienia – wszystkie argumenty pozycyjne/nazwane są przekazywane do StateMachine.init().

Przykład:

>>> rp2.PIO(1).state_machine(3)
StateMachine(7)

Globalny identyfikator maszyny stanów zwracanego obiektu to pio_id * 4 + sm_id.

irq(handler: Callable[[PIO], None] | None = None, trigger: int = IRQ_SM0 | IRQ_SM1 | IRQ_SM2 | IRQ_SM3, hard: bool = False) Callable

Pobiera lub konfiguruje IRQ na poziomie bloku dla tego PIO.

handler to wywołanie zwrotne uruchamiane, gdy zatrzaśnie się którekolwiek z żądanych IRQ maszyn stanów. Funkcja obsługi otrzymuje tę instancję PIO jako swój jedyny argument; wewnątrz funkcji obsługi maszyny stanów, które wywołały zdarzenie, można zidentyfikować przez self.irq().flags() w iloczynie bitowym (AND) ze stałymi IRQ_SM*.

trigger to maska bitowa jednej lub kilku stałych IRQ_SM0 .. IRQ_SM3. Domyślnie uruchamia się dla dowolnej maszyny stanów.

hard=True rejestruje funkcję obsługi twardego przerwania (bez alokacji na stercie w wywołaniu zwrotnym).

MicroPython wiąże IRQ 0 na każdym bloku PIO; IRQ 1 jest zarezerwowane i niedostępne z poziomu Pythona.

Stałe

IN_LOW: int

Przekaż do out_init / set_init / sideset_init funkcji asm_pio(), aby pin rozpoczynał jako wejście wysterowane stanem niskim (tj. trójstan z buforem wyjściowym utrzymującym 0).

IN_HIGH: int

Przekaż do out_init / set_init / sideset_init funkcji asm_pio(), aby pin rozpoczynał jako wejście z buforem wyjściowym utrzymującym 1.

OUT_LOW: int

Przekaż do out_init / set_init / sideset_init funkcji asm_pio(), aby pin rozpoczynał jako wysterowane wyjście w stanie logicznym 0.

OUT_HIGH: int

Przekaż do out_init / set_init / sideset_init funkcji asm_pio(), aby pin rozpoczynał jako wysterowane wyjście w stanie logicznym 1.

SHIFT_LEFT: int

Przekaż do in_shiftdir / out_shiftdir funkcji asm_pio() lub StateMachine.init(), aby przesunięcia kierowały bity w stronę MSB.

SHIFT_RIGHT: int

Przekaż do in_shiftdir / out_shiftdir funkcji asm_pio() lub StateMachine.init(), aby przesunięcia kierowały bity w stronę LSB.

JOIN_NONE: int

Przekaż do fifo_join funkcji asm_pio(), aby maszyna stanów miała osobne 4-słowowe kolejki FIFO nadawczą (TX) i odbiorczą (RX) (wartość domyślna).

JOIN_TX: int

Przekaż do fifo_join funkcji asm_pio(), aby kolejka FIFO TX została podwojona do 8 słów przez wchłonięcie kolejki FIFO RX. Maszyna stanów nie może już odbierać danych.

JOIN_RX: int

Przekaż do fifo_join funkcji asm_pio(), aby kolejka FIFO RX została podwojona do 8 słów przez wchłonięcie kolejki FIFO TX. Maszyna stanów nie może już nadawać danych.

IRQ_SM0: int

Flaga trigger metody irq(): maszyna stanów 0 zgłosiła swoje IRQ.

IRQ_SM1: int

Flaga trigger metody irq(): maszyna stanów 1 zgłosiła swoje IRQ.

IRQ_SM2: int

Flaga trigger metody irq(): maszyna stanów 2 zgłosiła swoje IRQ.

IRQ_SM3: int

Flaga trigger metody irq(): maszyna stanów 3 zgłosiła swoje IRQ.