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
PIOdla bloku PIO określonego przezid. RP2040 ma dwa bloki PIO, ponumerowane0i1. ZgłaszaValueErrordla 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,
0lub16).Z argumentem ustawia bazę.
basemoże być instancjąmachine.Pinlub 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
programdo 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
programz pamięci instrukcji tego bloku PIO, zwalniając miejsce na nowe programy. Jeśliprogramzostanie 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
StateMachinenależących do tego bloku PIO.idto lokalny indeks maszyny stanów (0–3).Jeśli podano
program, maszyna stanów jest skonfigurowana do jego uruchomienia – wszystkie argumenty pozycyjne/nazwane są przekazywane doStateMachine.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.
handlerto wywołanie zwrotne uruchamiane, gdy zatrzaśnie się którekolwiek z żądanych IRQ maszyn stanów. Funkcja obsługi otrzymuje tę instancjęPIOjako swój jedyny argument; wewnątrz funkcji obsługi maszyny stanów, które wywołały zdarzenie, można zidentyfikować przezself.irq().flags()w iloczynie bitowym (AND) ze stałymiIRQ_SM*.triggerto maska bitowa jednej lub kilku stałychIRQ_SM0..IRQ_SM3. Domyślnie uruchamia się dla dowolnej maszyny stanów.hard=Truerejestruje 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_initfunkcjiasm_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_initfunkcjiasm_pio(), aby pin rozpoczynał jako wejście z buforem wyjściowym utrzymującym 1.
- OUT_LOW: int¶
Przekaż do
out_init/set_init/sideset_initfunkcjiasm_pio(), aby pin rozpoczynał jako wysterowane wyjście w stanie logicznym 0.
- OUT_HIGH: int¶
Przekaż do
out_init/set_init/sideset_initfunkcjiasm_pio(), aby pin rozpoczynał jako wysterowane wyjście w stanie logicznym 1.
- SHIFT_LEFT: int¶
Przekaż do
in_shiftdir/out_shiftdirfunkcjiasm_pio()lubStateMachine.init(), aby przesunięcia kierowały bity w stronę MSB.
- SHIFT_RIGHT: int¶
Przekaż do
in_shiftdir/out_shiftdirfunkcjiasm_pio()lubStateMachine.init(), aby przesunięcia kierowały bity w stronę LSB.
- JOIN_NONE: int¶
Przekaż do
fifo_joinfunkcjiasm_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_joinfunkcjiasm_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.