rp2 — funkce specifické pro RP2040

Modul rp2 obsahuje funkce a třídy specifické pro RP2040, jak jsou použity v Raspberry Pi Pico.

Více informací naleznete v RP2040 Python datasheet a ukázkový kód v pico-micropython-examples.

Instrukce assembleru jazyka PIO

PIO stavové automaty se programují ve vlastním assembleru s devíti základními instrukcemi PIO automatu. V MicroPythonu se PIO assemblerové rutiny zapisují jako Python funkce s dekorátorem @rp2.asm_pio() a používají syntaxi Pythonu. Takové rutiny podporují standardní proměnné a aritmetiku Pythonu, jakož i následující vlastní funkce, které kódují PIO instrukce a řídí assembler. Další podrobnosti naleznete v sekci 3.4 datasheetu RP2040.

wrap_target()

Určuje místo, kde vykonávání pokračuje po zabalení programu (program wrapping). Ve výchozím nastavení je to začátek PIO rutiny.

wrap()

Určuje místo, kde program končí a zabaluje se. Pokud tato direktiva není použita, je automaticky přidána na konec PIO rutiny. Zabalení nestojí žádné vykonávací cykly.

label(label)

Definuje návěští s názvem label na aktuálním místě. label může být řetězec nebo celé číslo.

word(instr, label=None)

Vloží libovolné 16bitové slovo do sestaveného výstupu.

  • instr: 16bitová hodnota

  • label: je-li uvedeno, vyhledá návěští a provede logický součin (OR) hodnoty návěští s instr

jmp(…)

Tato instrukce má dvě podoby:

jmp(label)
  • label: návěští, na které se má bezpodmínečně skočit

jmp(cond, label)
  • cond: podmínka ke kontrole, jedna z:

    • not_x, not_y: pravda, pokud je registr nulový

    • x_dec, y_dec: pravda, pokud je registr nenulový, a provede dodatečnou dekrementaci

    • x_not_y: pravda, pokud se X nerovná Y

    • pin: pravda, pokud je vstupní pin nastaven

    • not_osre: pravda, pokud OSR není prázdný (nedosáhl svého prahu)

  • label: návěští, na které se má skočit, je-li podmínka pravdivá

wait(polarity, src, index)

Blokuje a čeká na vysokou/nízkou úroveň na pinu nebo na IRQ lince.

  • polarity: 0 nebo 1, zda čekat na nízkou nebo vysokou hodnotu

  • src: jedna z: gpio (absolutní pin), pin (pin relativní k argumentu in_base StateMachine), irq

  • index: 0-31, index pro src

in_(src, bit_count)

Posune data ze src do ISR.

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

  • bit_count: počet bitů k posunutí dovnitř (1-32)

out(dest, bit_count)

Posune data z OSR do dest.

  • dest: jedna z: pins, x, y, pindirs, pc, isr, exec

  • bit_count: počet bitů k posunutí ven (1-32)

push(…)

Pushne ISR do RX FIFO, poté vynuluje ISR. Tato instrukce má následující podoby:

  • push()

  • push(block)

  • push(noblock)

  • push(iffull)

  • push(iffull, block)

  • push(iffull, noblock)

Pokud je použito block, instrukce se zastaví, pokud je RX FIFO plné. Výchozí chování je blokovat. Pokud je použito iffull, pushne pouze tehdy, když počet vstupních posunů dosáhl svého prahu.

pull(…)

Pullne z TX FIFO do OSR. Tato instrukce má následující podoby:

  • pull()

  • pull(block)

  • pull(noblock)

  • pull(ifempty)

  • pull(ifempty, block)

  • pull(ifempty, noblock)

Pokud je použito block, instrukce se zastaví, pokud je TX FIFO prázdné. Výchozí chování je blokovat. Pokud je použito ifempty, pullne pouze tehdy, když počet výstupních posunů dosáhl svého prahu.

mov(dest, src)

Přesune do dest hodnotu ze src.

  • dest: jedna z: pins, x, y, exec, pc, isr, osr

  • src: jedna z: pins, x, y, null, status, isr, osr; tento argument lze volitelně upravit jeho obalením do invert() nebo reverse() (ale ne obojí současně)

irq(…)

Nastaví nebo vymaže IRQ příznak. Tato instrukce má dvě podoby:

irq(index)
  • index: 0-7, nebo rel(0)rel(7)

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

  • index: 0-7, nebo rel(0)rel(7)

Pokud je použito block, instrukce se zastaví, dokud není příznak vymazán jinou entitou. Pokud je použito clear, příznak je vymazán namísto nastavení. Relativní IRQ indexy přičítají ID stavového automatu k IRQ indexu pomocí sčítání modulo 4. IRQ 0-3 jsou viditelné z procesoru, 4-7 jsou interní pro stavové automaty.

set(dest, data)

Nastaví dest na hodnotu data.

  • dest: pins, x, y, pindirs

  • data: hodnota (0-31)

nop()

Toto je pseudoinstrukce, která se sestaví jako mov(y, y) a nemá žádný vedlejší účinek.

.side(value)

Toto je modifikátor, který lze aplikovat na jakoukoli instrukci, a používá se k řízení hodnot side-set pinů.

  • value: hodnota (bity) k výstupu na side-set piny

.delay(value)

Toto je modifikátor, který lze aplikovat na jakoukoli instrukci, a určuje, o kolik cyklů se má pozdržet po vykonání instrukce.

  • value: cykly ke zpoždění, 0-31 (maximální hodnota je snížena, pokud se používají side-set piny)

[value]

Toto je modifikátor a je ekvivalentní k .delay(value).

Třídy