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 dekrementacix_not_y: pravda, pokud se X nerovná Ypin: pravda, pokud je vstupní pin nastavennot_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 argumentuin_baseStateMachine),irqindex: 0-31, index pro src
- in_(src, bit_count)
Posune data ze src do ISR.
src: jedna z:
pins,x,y,null,isr,osrbit_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,execbit_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žitoiffull, 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žitoifempty, 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,osrsrc: jedna z:
pins,x,y,null,status,isr,osr; tento argument lze volitelně upravit jeho obalením doinvert()neboreverse()(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)ažrel(7)
- irq(mode, index)
mode: jeden z:
block,clearindex: 0-7, nebo
rel(0)ažrel(7)
Pokud je použito
block, instrukce se zastaví, dokud není příznak vymazán jinou entitou. Pokud je použitoclear, 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,pindirsdata: 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).