rp2 — funkcje specyficzne dla RP2040¶
Moduł rp2 zawiera funkcje i klasy specyficzne dla RP2040, używanego w Raspberry Pi Pico.
Więcej informacji znajdziesz w dokumentacji RP2040 Python, a przykładowy kod w pico-micropython-examples.
Instrukcje języka asemblera PIO¶
Maszyny stanów PIO są programowane w niestandardowym języku asemblera z dziewięcioma podstawowymi instrukcjami maszyny PIO. W MicroPython procedury asemblera PIO zapisuje się jako funkcję Python z dekoratorem @rp2.asm_pio() i używają one składni Python. Takie procedury obsługują standardowe zmienne i arytmetykę Python, a także poniższe niestandardowe funkcje, które kodują instrukcje PIO i sterują asemblerem. Więcej szczegółów znajdziesz w sekcji 3.4 dokumentacji RP2040.
- wrap_target()
Określa miejsce, w którym wykonanie jest kontynuowane po zawinięciu programu. Domyślnie jest to początek procedury PIO.
- wrap()
Określa miejsce, w którym program się kończy i zawija. Jeśli ta dyrektywa nie zostanie użyta, jest dodawana automatycznie na końcu procedury PIO. Zawijanie nie kosztuje żadnych cykli wykonania.
- label(label)
Definiuje etykietę o nazwie label w bieżącym miejscu. label może być ciągiem znaków lub liczbą całkowitą.
- word(instr, label=None)
Wstawia dowolne 16-bitowe słowo w wyjściu asemblacji.
instr: wartość 16-bitowa
label: jeśli podane, wyszukuje etykietę i wykonuje logiczne lub na wartości etykiety z instr
- jmp(…)
Ta instrukcja przyjmuje dwie formy:
- jmp(label)
label: etykieta, do której nastąpi bezwarunkowy skok
- jmp(cond, label)
cond: warunek do sprawdzenia, jeden z:
not_x,not_y: prawda, jeśli rejestr jest zeremx_dec,y_dec: prawda, jeśli rejestr jest niezerowy, i wykonuje dekrementację po sprawdzeniux_not_y: prawda, jeśli X nie jest równe Ypin: prawda, jeśli pin wejściowy jest ustawionynot_osre: prawda, jeśli OSR nie jest pusty (nie osiągnął swojego progu)
label: etykieta, do której nastąpi skok, jeśli warunek jest prawdziwy
- wait(polarity, src, index)
Blokuje, czekając na stan wysoki/niski na pinie lub linii IRQ.
polarity: 0 lub 1, czy czekać na wartość niską czy wysoką
src: jeden z:
gpio(pin bezwzględny),pin(pin względem argumentuin_basemaszyny StateMachine),irqindex: 0-31, indeks dla src
- in_(src, bit_count)
Przesuwa dane z src do ISR.
src: jeden z:
pins,x,y,null,isr,osrbit_count: liczba bitów do przesunięcia (1-32)
- out(dest, bit_count)
Przesuwa dane z OSR do dest.
dest: jeden z:
pins,x,y,pindirs,pc,isr,execbit_count: liczba bitów do przesunięcia (1-32)
- push(…)
Wypycha ISR do kolejki FIFO RX, a następnie zeruje ISR. Ta instrukcja przyjmuje następujące formy:
push()
push(block)
push(noblock)
push(iffull)
push(iffull, block)
push(iffull, noblock)
Jeśli użyto
block, instrukcja zatrzymuje się, gdy kolejka FIFO RX jest pełna. Domyślnie jest to blokowanie. Jeśli użytoiffull, wypycha tylko wtedy, gdy licznik przesunięć wejściowych osiągnął swój próg.- pull(…)
Pobiera z kolejki FIFO TX do OSR. Ta instrukcja przyjmuje następujące formy:
pull()
pull(block)
pull(noblock)
pull(ifempty)
pull(ifempty, block)
pull(ifempty, noblock)
Jeśli użyto
block, instrukcja zatrzymuje się, gdy kolejka FIFO TX jest pusta. Domyślnie jest to blokowanie. Jeśli użytoifempty, pobiera tylko wtedy, gdy licznik przesunięć wyjściowych osiągnął swój próg.- mov(dest, src)
Przenosi do dest wartość z src.
dest: jeden z:
pins,x,y,exec,pc,isr,osrsrc: jeden z:
pins,x,y,null,status,isr,osr; argument ten można opcjonalnie zmodyfikować, owijając go winvert()lubreverse()(ale nie oba naraz)
- irq(…)
Ustawia lub czyści flagę IRQ. Ta instrukcja przyjmuje dwie formy:
- irq(index)
index: 0-7, albo od
rel(0)dorel(7)
- irq(mode, index)
mode: jeden z:
block,clearindex: 0-7, albo od
rel(0)dorel(7)
Jeśli użyto
block, instrukcja zatrzymuje się, dopóki flaga nie zostanie wyczyszczona przez inny podmiot. Jeśli użytoclear, flaga jest czyszczona zamiast ustawiana. Względne indeksy IRQ dodają identyfikator maszyny stanów do indeksu IRQ z dodawaniem modulo-4. IRQ 0-3 są widoczne dla procesora, a 4-7 są wewnętrzne dla maszyn stanów.- set(dest, data)
Ustawia dest wartością data.
dest:
pins,x,y,pindirsdata: wartość (0-31)
- nop()
Jest to pseudoinstrukcja, która asembluje się do
mov(y, y)i nie ma żadnego efektu ubocznego.- .side(value)
Jest to modyfikator, który można zastosować do dowolnej instrukcji i służy do kontrolowania wartości pinów side-set.
value: wartość (bity) do wystawienia na pinach side-set
- .delay(value)
Jest to modyfikator, który można zastosować do dowolnej instrukcji i określa, ile cykli opóźnienia ma nastąpić po wykonaniu instrukcji.
value: cykle opóźnienia, 0-31 (wartość maksymalna jest zmniejszona, jeśli używane są piny side-set)
- [value]
Jest to modyfikator równoważny
.delay(value).