rp2 — funkcionalnost specifična za RP2040¶
Modul rp2 sadrži funkcije i klase specifične za RP2040, kakav se koristi u Raspberry Pi Pico.
Više informacija potražite u dokumentu RP2040 Python datasheet, a primjere koda u pico-micropython-examples.
Instrukcije PIO asemblerskog jezika¶
PIO stroja stanja programiraju se prilagođenim asemblerskim jezikom s devet osnovnih PIO instrukcija. U MicroPythonu, PIO asemblerske rutine pišu se kao Python funkcija s dekoratorom @rp2.asm_pio() i koriste Python sintaksu. Takve rutine podržavaju standardne Python varijable i aritmetiku, kao i sljedeće prilagođene funkcije koje kodiraju PIO instrukcije i upravljaju asemblerom. Za dodatne pojedinosti pogledajte odjeljak 3.4 RP2040 datasheeta.
- wrap_target()
Određuje lokaciju na kojoj se izvršavanje nastavlja nakon omatanja programa. Prema zadanim postavkama to je početak PIO rutine.
- wrap()
Određuje lokaciju na kojoj program završava i omata se. Ako se ova direktiva ne koristi, automatski se dodaje na kraju PIO rutine. Omatanje ne troši nijedan ciklus izvršavanja.
- label(label)
Definira oznaku pod imenom label na trenutnoj lokaciji. label može biti string ili cijeli broj.
- word(instr, label=None)
Umeće proizvoljnu 16-bitnu riječ u asemblirani izlaz.
instr: 16-bitna vrijednost
label: ako je navedeno, traži oznaku i logički-ili (OR) vrijednost oznake s instr
- jmp(…)
Ova instrukcija ima dva oblika:
- jmp(label)
label: oznaka na koju se bezuvjetno skače
- jmp(cond, label)
cond: uvjet za provjeru, jedan od:
not_x,not_y: istinito ako je registar nulax_dec,y_dec: istinito ako je registar različit od nule, te izvodi naknadno dekrementiranjex_not_y: istinito ako X nije jednak Ypin: istinito ako je ulazni pin postavljennot_osre: istinito ako OSR nije prazan (nije dosegnuo svoj prag)
label: oznaka na koju se skače ako je uvjet istinit
- wait(polarity, src, index)
Blokira, čekajući visoku/nisku razinu na pinu ili IRQ liniji.
polarity: 0 ili 1, treba li čekati nisku ili visoku vrijednost
src: jedan od:
gpio(apsolutni pin),pin(pin relativan nain_baseargument StateMachinea),irqindex: 0-31, indeks za src
- in_(src, bit_count)
Posmiče podatke iz src u ISR.
src: jedan od:
pins,x,y,null,isr,osrbit_count: broj bitova za posmicanje unutra (1-32)
- out(dest, bit_count)
Posmiče podatke iz OSR u dest.
dest: jedan od:
pins,x,y,pindirs,pc,isr,execbit_count: broj bitova za posmicanje van (1-32)
- push(…)
Gura ISR u RX FIFO, zatim postavlja ISR na nulu. Ova instrukcija ima sljedeće oblike:
push()
push(block)
push(noblock)
push(iffull)
push(iffull, block)
push(iffull, noblock)
Ako se koristi
block, instrukcija zastaje ako je RX FIFO pun. Zadano je blokiranje. Ako se koristiiffull, gura samo ako je broj posmaknutih ulaznih bitova dosegnuo svoj prag.- pull(…)
Povlači iz TX FIFO-a u OSR. Ova instrukcija ima sljedeće oblike:
pull()
pull(block)
pull(noblock)
pull(ifempty)
pull(ifempty, block)
pull(ifempty, noblock)
Ako se koristi
block, instrukcija zastaje ako je TX FIFO prazan. Zadano je blokiranje. Ako se koristiifempty, povlači samo ako je broj posmaknutih izlaznih bitova dosegnuo svoj prag.- mov(dest, src)
Premješta u dest vrijednost iz src.
dest: jedan od:
pins,x,y,exec,pc,isr,osrsrc: jedan od:
pins,x,y,null,status,isr,osr; ovaj argument se može opcionalno modificirati omatanjem uinvert()ilireverse()(ali ne oboje zajedno)
- irq(…)
Postavlja ili briše IRQ zastavicu. Ova instrukcija ima dva oblika:
- irq(index)
index: 0-7, ili
rel(0)dorel(7)
- irq(mode, index)
mode: jedan od:
block,clearindex: 0-7, ili
rel(0)dorel(7)
Ako se koristi
block, instrukcija zastaje sve dok drugi entitet ne obriše zastavicu. Ako se koristiclear, zastavica se briše umjesto da se postavlja. Relativni IRQ indeksi dodaju ID stroja stanja IRQ indeksu pomoću zbrajanja modulo-4. IRQ-ovi 0-3 vidljivi su procesoru, dok su 4-7 interni za strojeve stanja.- set(dest, data)
Postavlja dest na vrijednost data.
dest:
pins,x,y,pindirsdata: vrijednost (0-31)
- nop()
Ovo je pseudoinstrukcija koja se asemblira u
mov(y, y)i nema nuspojava.- .side(value)
Ovo je modifikator koji se može primijeniti na bilo koju instrukciju, a koristi se za upravljanje vrijednostima side-set pinova.
value: vrijednost (bitovi) za izlaz na side-set pinovima
- .delay(value)
Ovo je modifikator koji se može primijeniti na bilo koju instrukciju, a određuje koliko ciklusa treba odgoditi nakon izvršavanja instrukcije.
value: ciklusi za odgodu, 0-31 (maksimalna vrijednost se smanjuje ako se koriste side-set pinovi)
- [value]
Ovo je modifikator i ekvivalentan je
.delay(value).