rp2 — funzionalità specifiche dell’RP2040¶
Il modulo rp2 contiene funzioni e classi specifiche dell’RP2040, come utilizzato nel Raspberry Pi Pico.
Consulta il datasheet Python dell’RP2040 per maggiori informazioni e pico-micropython-examples per codice di esempio.
Istruzioni del linguaggio assembly del PIO¶
Le macchine a stati PIO vengono programmate in un linguaggio assembly personalizzato con nove istruzioni fondamentali della macchina PIO. In MicroPython, le routine assembly PIO vengono scritte come funzione Python con il decoratore @rp2.asm_pio(), e usano la sintassi Python. Tali routine supportano le variabili e l’aritmetica standard di Python, oltre alle seguenti funzioni personalizzate che codificano le istruzioni PIO e guidano l’assemblatore. Vedi la sez. 3.4 del datasheet dell’RP2040 per ulteriori dettagli.
- wrap_target()
Specifica la posizione in cui l’esecuzione continua dopo il wrapping del programma. Per impostazione predefinita questo è l’inizio della routine PIO.
- wrap()
Specifica la posizione in cui il programma termina ed esegue il wrap. Se questa direttiva non viene usata, allora viene aggiunta automaticamente alla fine della routine PIO. Il wrapping non costa alcun ciclo di esecuzione.
- label(label)
Definisce un’etichetta chiamata label nella posizione corrente. label può essere una stringa o un intero.
- word(instr, label=None)
Inserisce una parola arbitraria di 16 bit nell’output assemblato.
instr: il valore di 16 bit
label: se fornita, cerca l’etichetta ed esegue l’OR logico del valore dell’etichetta con instr
- jmp(…)
Questa istruzione ha due forme:
- jmp(label)
label: etichetta verso cui saltare incondizionatamente
- jmp(cond, label)
cond: la condizione da verificare, una tra:
not_x,not_y: vera se il registro è zerox_dec,y_dec: vera se il registro è diverso da zero, ed esegue un post-decrementox_not_y: vera se X è diverso da Ypin: vera se il pin di ingresso è impostatonot_osre: vera se l’OSR non è vuoto (non ha raggiunto la sua soglia)
label: etichetta verso cui saltare se la condizione è vera
- wait(polarity, src, index)
Blocca, in attesa di un livello alto/basso su un pin o su una linea IRQ.
polarity: 0 o 1, se attendere un valore basso o alto
src: uno tra:
gpio(pin assoluto),pin(pin relativo all’argomentoin_basedella StateMachine),irqindex: 0-31, l’indice per src
- in_(src, bit_count)
Esegue lo shift dei dati da src verso l’ISR.
src: uno tra:
pins,x,y,null,isr,osrbit_count: numero di bit di cui eseguire lo shift in ingresso (1-32)
- out(dest, bit_count)
Esegue lo shift dei dati dall’OSR verso dest.
dest: uno tra:
pins,x,y,pindirs,pc,isr,execbit_count: numero di bit di cui eseguire lo shift in uscita (1-32)
- push(…)
Esegue il push dell’ISR nella FIFO RX, poi azzera l’ISR. Questa istruzione ha le seguenti forme:
push()
push(block)
push(noblock)
push(iffull)
push(iffull, block)
push(iffull, noblock)
Se viene usato
blockallora l’istruzione si blocca se la FIFO RX è piena. Il comportamento predefinito è di bloccare. Se viene usatoiffullallora esegue il push solo se il conteggio dello shift in ingresso ha raggiunto la sua soglia.- pull(…)
Esegue il pull dalla FIFO TX verso l’OSR. Questa istruzione ha le seguenti forme:
pull()
pull(block)
pull(noblock)
pull(ifempty)
pull(ifempty, block)
pull(ifempty, noblock)
Se viene usato
blockallora l’istruzione si blocca se la FIFO TX è vuota. Il comportamento predefinito è di bloccare. Se viene usatoifemptyallora esegue il pull solo se il conteggio dello shift in uscita ha raggiunto la sua soglia.- mov(dest, src)
Sposta in dest il valore da src.
dest: uno tra:
pins,x,y,exec,pc,isr,osrsrc: uno tra:
pins,x,y,null,status,isr,osr; questo argomento può essere opzionalmente modificato racchiudendolo ininvert()oreverse()(ma non entrambi insieme)
- irq(…)
Imposta o azzera un flag IRQ. Questa istruzione ha due forme:
- irq(index)
index: 0-7, oppure da
rel(0)arel(7)
- irq(mode, index)
mode: uno tra:
block,clearindex: 0-7, oppure da
rel(0)arel(7)
Se viene usato
blockallora l’istruzione si blocca finché il flag non viene azzerato da un’altra entità. Se viene usatoclearallora il flag viene azzerato invece di essere impostato. Gli indici IRQ relativi aggiungono l’ID della macchina a stati all’indice IRQ con addizione modulo 4. Gli IRQ 0-3 sono visibili dal processore, mentre i 4-7 sono interni alle macchine a stati.- set(dest, data)
Imposta dest con il valore data.
dest:
pins,x,y,pindirsdata: valore (0-31)
- nop()
Questa è una pseudoistruzione che si assembla in
mov(y, y)e non ha alcun effetto collaterale.- .side(value)
Questo è un modificatore che può essere applicato a qualsiasi istruzione, ed è usato per controllare i valori dei pin side-set.
value: il valore (i bit) da emettere sui pin side-set
- .delay(value)
Questo è un modificatore che può essere applicato a qualsiasi istruzione, e specifica per quanti cicli ritardare dopo l’esecuzione dell’istruzione.
value: cicli di ritardo, 0-31 (il valore massimo è ridotto se vengono usati i pin side-set)
- [value]
Questo è un modificatore ed è equivalente a
.delay(value).