rp2 — funcționalități specifice pentru RP2040¶
Modulul rp2 conține funcții și clase specifice pentru RP2040, așa cum este utilizat în Raspberry Pi Pico.
Consultați fișa tehnică RP2040 Python pentru mai multe informații și pico-micropython-examples pentru cod exemplu.
Instrucțiuni în limbaj de asamblare PIO¶
Mașinile de stări PIO sunt programate într-un limbaj de asamblare personalizat cu nouă instrucțiuni de bază ale mașinii PIO. În MicroPython, rutinele de asamblare PIO sunt scrise ca o funcție Python cu decoratorul @rp2.asm_pio() și folosesc sintaxa Python. Astfel de rutine acceptă variabile și operații aritmetice standard Python, precum și următoarele funcții personalizate care codifică instrucțiunile PIO și ghidează asamblorul. Consultați secțiunea 3.4 din fișa tehnică RP2040 pentru mai multe detalii.
- wrap_target()
Specifică locația unde execuția continuă după revenirea programului (wrapping). În mod implicit, aceasta este începutul rutinei PIO.
- wrap()
Specifică locația unde programul se termină și revine la început. Dacă această directivă nu este folosită, atunci este adăugată automat la sfârșitul rutinei PIO. Revenirea (wrapping) nu costă niciun ciclu de execuție.
- label(label)
Definește o etichetă numită label la locația curentă. label poate fi un șir de caractere sau un întreg.
- word(instr, label=None)
Inserează un cuvânt arbitrar de 16 biți în ieșirea asamblată.
instr: valoarea de 16 biți
label: dacă este furnizată, caută eticheta și efectuează un sau-logic între valoarea etichetei și instr
- jmp(…)
Această instrucțiune are două forme:
- jmp(label)
label: eticheta către care se sare necondiționat
- jmp(cond, label)
cond: condiția de verificat, una dintre:
not_x,not_y: adevărat dacă registrul este zerox_dec,y_dec: adevărat dacă registrul este diferit de zero, și efectuează o decrementare ulterioarăx_not_y: adevărat dacă X nu este egal cu Ypin: adevărat dacă pinul de intrare este setatnot_osre: adevărat dacă OSR nu este gol (nu și-a atins pragul)
label: eticheta către care se sare dacă condiția este adevărată
- wait(polarity, src, index)
Blochează, așteptând un nivel înalt/jos pe un pin sau pe o linie IRQ.
polarity: 0 sau 1, dacă se așteaptă o valoare joasă sau înaltă
src: una dintre:
gpio(pin absolut),pin(pin relativ la argumentulin_baseal StateMachine),irqindex: 0-31, indicele pentru src
- in_(src, bit_count)
Deplasează datele din src către ISR.
src: una dintre:
pins,x,y,null,isr,osrbit_count: numărul de biți de deplasat înăuntru (1-32)
- out(dest, bit_count)
Deplasează datele din OSR către dest.
dest: una dintre:
pins,x,y,pindirs,pc,isr,execbit_count: numărul de biți de deplasat în afară (1-32)
- push(…)
Împinge ISR în FIFO-ul RX, apoi golește ISR la zero. Această instrucțiune are următoarele forme:
push()
push(block)
push(noblock)
push(iffull)
push(iffull, block)
push(iffull, noblock)
Dacă se folosește
block, atunci instrucțiunea se blochează dacă FIFO-ul RX este plin. Comportamentul implicit este de a se bloca. Dacă se foloseșteiffull, atunci împinge doar dacă numărul de deplasări de intrare și-a atins pragul.- pull(…)
Extrage din FIFO-ul TX în OSR. Această instrucțiune are următoarele forme:
pull()
pull(block)
pull(noblock)
pull(ifempty)
pull(ifempty, block)
pull(ifempty, noblock)
Dacă se folosește
block, atunci instrucțiunea se blochează dacă FIFO-ul TX este gol. Comportamentul implicit este de a se bloca. Dacă se foloseșteifempty, atunci extrage doar dacă numărul de deplasări de ieșire și-a atins pragul.- mov(dest, src)
Mută în dest valoarea din src.
dest: una dintre:
pins,x,y,exec,pc,isr,osrsrc: una dintre:
pins,x,y,null,status,isr,osr; acest argument poate fi modificat opțional prin încadrarea lui îninvert()saureverse()(dar nu ambele împreună)
- irq(…)
Setează sau șterge un indicator IRQ. Această instrucțiune are două forme:
- irq(index)
index: 0-7, sau de la
rel(0)larel(7)
- irq(mode, index)
mode: una dintre:
block,clearindex: 0-7, sau de la
rel(0)larel(7)
Dacă se folosește
block, atunci instrucțiunea se blochează până când indicatorul este șters de o altă entitate. Dacă se foloseșteclear, atunci indicatorul este șters în loc să fie setat. Indicii IRQ relativi adaugă ID-ul mașinii de stări la indicele IRQ printr-o adunare modulo-4. IRQ-urile 0-3 sunt vizibile din procesor, iar 4-7 sunt interne mașinilor de stări.- set(dest, data)
Setează dest cu valoarea data.
dest:
pins,x,y,pindirsdata: valoare (0-31)
- nop()
Aceasta este o pseudoinstrucțiune care se asamblează la
mov(y, y)și nu are niciun efect secundar.- .side(value)
Acesta este un modificator care poate fi aplicat oricărei instrucțiuni și este folosit pentru a controla valorile pinilor side-set.
value: valoarea (biții) de scos pe pinii side-set
- .delay(value)
Acesta este un modificator care poate fi aplicat oricărei instrucțiuni și specifică numărul de cicluri de întârziere după executarea instrucțiunii.
value: ciclurile de întârziere, 0-31 (valoarea maximă este redusă dacă se folosesc pini side-set)
- [value]
Acesta este un modificator și este echivalent cu
.delay(value).