class PIO – uso avanzado de PIO¶
La clase PIO envuelve uno de los dos bloques de E/S programable (PIO) del RP2040. Cada bloque PIO contiene una memoria de instrucciones (32 instrucciones) compartida por cuatro máquinas de estado independientes, además de una interfaz FIFO privada para cada máquina de estado y un controlador de IRQ.
La mayoría de los scripts interactúan con PIO a través de StateMachine – esta clase es para casos de uso avanzados que necesitan:
Cargar y eliminar programas explícitamente mediante
add_program()/remove_program().Mover la base de GPIO del PIO a lo largo de la ventana de 32 pines del chip mediante
gpio_base().Engancharse a los indicadores de IRQ de todo el bloque mediante
irq().
Para ensamblar programas PIO, consulte rp2.asm_pio().
Constructores¶
- class rp2.PIO(id: int)¶
Devuelve el objeto singleton
PIOcorrespondiente al bloque PIO identificado porid. El RP2040 tiene dos bloques PIO, numerados0y1. LanzaValueErrorpara cualquier otro id.Métodos¶
- gpio_base(base: machine.Pin | int | None = None, /) int¶
Obtiene o establece la base de GPIO para este bloque PIO.
El PIO del RP2040 ve una ventana de 32 pines dentro del espacio de GPIO; la ventana puede comenzar en GPIO0 o GPIO16. La base controla qué ventana está en efecto para todas las máquinas de estado de este PIO.
Sin argumento, devuelve la base actual (el número de pin GPIO,
0o16).Con un argumento, establece la base.
basepuede ser una instancia demachine.Pino el número entero del pin, y debe resolverse a GPIO0 o GPIO16. La base debe establecerse antes de que se agregue cualquier programa o se construya cualquier máquina de estado en este bloque PIO.
- add_program(program: Callable) None¶
Carga
programen la memoria de instrucciones de este PIO. La disposición de memoria resultante se reutiliza en todas las máquinas de estado de este bloque PIO.Cada PIO tiene solo 32 instrucciones de memoria de programa compartidas entre todos los programas; si el nuevo programa no cabe, este método lanza
OSError(ENOMEM). El mismo programa puede cargarse en ambas instancias de PIO, pero consumen regiones de memoria separadas.
- remove_program(program: Callable | None = None, /) None¶
Elimina
programde la memoria de instrucciones de este PIO, liberando espacio para nuevos programas. Si se omiteprogram, se eliminan todos los programas actualmente cargados en este PIO.Eliminar un programa que no estaba cargado no tiene ningún efecto (no genera excepción).
- state_machine(id: int, program: Callable | None = None, *args, **kwargs) StateMachine¶
Devuelve una de las cuatro instancias de
StateMachineque pertenecen a este bloque PIO.ides el índice local de la máquina de estado (0–3).Si se proporciona
program, la máquina de estado se configura para ejecutarlo – todos los argumentos posicionales/de palabra clave se reenvían aStateMachine.init().Ejemplo:
>>> rp2.PIO(1).state_machine(3) StateMachine(7)
El ID global de máquina de estado del objeto devuelto es
pio_id * 4 + sm_id.
- irq(handler: Callable[[PIO], None] | None = None, trigger: int = IRQ_SM0 | IRQ_SM1 | IRQ_SM2 | IRQ_SM3, hard: bool = False) Callable¶
Obtiene o configura la IRQ a nivel de bloque para este PIO.
handleres la función de retorno (callback) que se activa cuando se enclava cualquiera de las IRQ de máquina de estado solicitadas. El manejador recibe esta instancia dePIOcomo su único argumento; dentro del manejador, las máquinas de estado que se dispararon pueden identificarse medianteself.irq().flags()aplicando AND con las constantesIRQ_SM*.triggeres una máscara de bits de uno o más deIRQ_SM0..IRQ_SM3. El valor predeterminado se dispara con cualquier máquina de estado.hard=Trueregistra un manejador de interrupción dura (sin asignación de heap en la función de retorno).MicroPython vincula la IRQ 0 de cada bloque PIO; la IRQ 1 está reservada y no es accesible desde Python.
Constantes¶
- IN_LOW: int¶
Se pasa a
out_init/set_init/sideset_initdeasm_pio()para que el pin comience como una entrada controlada a nivel bajo (es decir, en triestado con el búfer de salida manteniendo un 0).
- IN_HIGH: int¶
Se pasa a
out_init/set_init/sideset_initdeasm_pio()para que el pin comience como una entrada con el búfer de salida manteniendo un 1.
- OUT_LOW: int¶
Se pasa a
out_init/set_init/sideset_initdeasm_pio()para que el pin comience como una salida controlada en lógica 0.
- OUT_HIGH: int¶
Se pasa a
out_init/set_init/sideset_initdeasm_pio()para que el pin comience como una salida controlada en lógica 1.
- SHIFT_LEFT: int¶
Se pasa a
in_shiftdir/out_shiftdirdeasm_pio()oStateMachine.init()para que los desplazamientos muevan los bits hacia el MSB.
- SHIFT_RIGHT: int¶
Se pasa a
in_shiftdir/out_shiftdirdeasm_pio()oStateMachine.init()para que los desplazamientos muevan los bits hacia el LSB.
- JOIN_NONE: int¶
Se pasa a
fifo_joindeasm_pio()para que la máquina de estado tenga FIFO de TX y RX separadas de 4 palabras (el valor predeterminado).
- JOIN_TX: int¶
Se pasa a
fifo_joindeasm_pio()para que la FIFO de TX se duplique a 8 palabras absorbiendo la FIFO de RX. La máquina de estado ya no puede recibir datos.