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 zerem

    • x_dec, y_dec: prawda, jeśli rejestr jest niezerowy, i wykonuje dekrementację po sprawdzeniu

    • x_not_y: prawda, jeśli X nie jest równe Y

    • pin: prawda, jeśli pin wejściowy jest ustawiony

    • not_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 argumentu in_base maszyny StateMachine), irq

  • index: 0-31, indeks dla src

in_(src, bit_count)

Przesuwa dane z src do ISR.

  • src: jeden z: pins, x, y, null, isr, osr

  • bit_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, exec

  • bit_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żyto iffull, 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żyto ifempty, 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, osr

  • src: jeden z: pins, x, y, null, status, isr, osr; argument ten można opcjonalnie zmodyfikować, owijając go w invert() lub reverse() (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) do rel(7)

irq(mode, index)
  • mode: jeden z: block, clear

  • index: 0-7, albo od rel(0) do rel(7)

Jeśli użyto block, instrukcja zatrzymuje się, dopóki flaga nie zostanie wyczyszczona przez inny podmiot. Jeśli użyto clear, 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, pindirs

  • data: 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).

Klasy