rp2 — funcionalidad específica del RP2040¶
El módulo rp2 contiene funciones y clases específicas del RP2040, tal como se utiliza en la Raspberry Pi Pico.
Consulte la hoja de datos de Python para el RP2040 para obtener más información, y pico-micropython-examples para ver código de ejemplo.
Instrucciones del lenguaje ensamblador PIO¶
Las máquinas de estados PIO se programan en un lenguaje ensamblador personalizado con nueve instrucciones básicas de la máquina PIO. En MicroPython, las rutinas en ensamblador PIO se escriben como una función de Python con el decorador @rp2.asm_pio(), y usan la sintaxis de Python. Dichas rutinas admiten variables y operaciones aritméticas estándar de Python, así como las siguientes funciones personalizadas que codifican las instrucciones PIO y dirigen el ensamblador. Consulte la sección 3.4 de la hoja de datos del RP2040 para obtener más detalles.
- wrap_target()
Especifica la ubicación donde continúa la ejecución tras el ajuste (wrap) del programa. De forma predeterminada, es el inicio de la rutina PIO.
- wrap()
Especifica la ubicación donde el programa termina y se ajusta (wrap). Si no se usa esta directiva, se añade automáticamente al final de la rutina PIO. El ajuste no consume ningún ciclo de ejecución.
- label(label)
Define una etiqueta llamada label en la ubicación actual. label puede ser una cadena o un entero.
- word(instr, label=None)
Inserta una palabra arbitraria de 16 bits en la salida ensamblada.
instr: el valor de 16 bits
label: si se proporciona, busca la etiqueta y aplica un OR lógico entre el valor de la etiqueta e instr
- jmp(…)
Esta instrucción admite dos formas:
- jmp(label)
label: etiqueta a la que saltar incondicionalmente
- jmp(cond, label)
cond: la condición a comprobar, una de:
not_x,not_y: verdadero si el registro es cerox_dec,y_dec: verdadero si el registro es distinto de cero, y realiza un decremento posteriorx_not_y: verdadero si X no es igual a Ypin: verdadero si el pin de entrada está activadonot_osre: verdadero si el OSR no está vacío (no ha alcanzado su umbral)
label: etiqueta a la que saltar si la condición es verdadera
- wait(polarity, src, index)
Se bloquea, esperando un nivel alto/bajo en un pin o una línea IRQ.
polarity: 0 o 1, indica si se espera un valor bajo o alto
src: uno de:
gpio(pin absoluto),pin(pin relativo al argumentoin_basede la StateMachine),irqindex: 0-31, el índice para src
- in_(src, bit_count)
Desplaza datos hacia dentro desde src al ISR.
src: uno de:
pins,x,y,null,isr,osrbit_count: número de bits a desplazar hacia dentro (1-32)
- out(dest, bit_count)
Desplaza datos hacia fuera desde el OSR a dest.
dest: uno de:
pins,x,y,pindirs,pc,isr,execbit_count: número de bits a desplazar hacia fuera (1-32)
- push(…)
Empuja el ISR a la FIFO de RX y luego pone el ISR a cero. Esta instrucción admite las siguientes formas:
push()
push(block)
push(noblock)
push(iffull)
push(iffull, block)
push(iffull, noblock)
Si se usa
block, la instrucción se detiene si la FIFO de RX está llena. El comportamiento predeterminado es bloquear. Si se usaiffull, solo se empuja si el contador de desplazamiento de entrada ha alcanzado su umbral.- pull(…)
Extrae de la FIFO de TX hacia el OSR. Esta instrucción admite las siguientes formas:
pull()
pull(block)
pull(noblock)
pull(ifempty)
pull(ifempty, block)
pull(ifempty, noblock)
Si se usa
block, la instrucción se detiene si la FIFO de TX está vacía. El comportamiento predeterminado es bloquear. Si se usaifempty, solo se extrae si el contador de desplazamiento de salida ha alcanzado su umbral.- mov(dest, src)
Mueve a dest el valor de src.
dest: uno de:
pins,x,y,exec,pc,isr,osrsrc: uno de:
pins,x,y,null,status,isr,osr; este argumento puede modificarse opcionalmente envolviéndolo eninvert()oreverse()(pero no ambos a la vez)
- irq(…)
Establece o borra una bandera IRQ. Esta instrucción admite dos formas:
- irq(index)
index: 0-7, o de
rel(0)arel(7)
- irq(mode, index)
mode: uno de:
block,clearindex: 0-7, o de
rel(0)arel(7)
Si se usa
block, la instrucción se detiene hasta que otra entidad borre la bandera. Si se usaclear, la bandera se borra en lugar de establecerse. Los índices IRQ relativos suman el ID de la máquina de estados al índice IRQ con suma módulo 4. Las IRQ 0-3 son visibles para el procesador, y las 4-7 son internas de las máquinas de estados.- set(dest, data)
Establece dest con el valor data.
dest:
pins,x,y,pindirsdata: valor (0-31)
- nop()
Esta es una pseudoinstrucción que se ensambla como
mov(y, y)y no tiene ningún efecto secundario.- .side(value)
Este es un modificador que puede aplicarse a cualquier instrucción y se usa para controlar los valores de los pines side-set.
value: el valor (bits) a emitir en los pines side-set
- .delay(value)
Este es un modificador que puede aplicarse a cualquier instrucción y especifica cuántos ciclos retrasar tras la ejecución de la instrucción.
value: ciclos a retrasar, 0-31 (el valor máximo se reduce si se usan pines side-set)
- [value]
Este es un modificador y es equivalente a
.delay(value).