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 PIO correspondiente al bloque PIO identificado por id. El RP2040 tiene dos bloques PIO, numerados 0 y 1. Lanza ValueError para 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, 0 o 16).

Con un argumento, establece la base. base puede ser una instancia de machine.Pin o 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 program en 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 program de la memoria de instrucciones de este PIO, liberando espacio para nuevos programas. Si se omite program, 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 StateMachine que pertenecen a este bloque PIO. id es el índice local de la máquina de estado (03).

Si se proporciona program, la máquina de estado se configura para ejecutarlo – todos los argumentos posicionales/de palabra clave se reenvían a StateMachine.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.

handler es 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 de PIO como su único argumento; dentro del manejador, las máquinas de estado que se dispararon pueden identificarse mediante self.irq().flags() aplicando AND con las constantes IRQ_SM*.

trigger es una máscara de bits de uno o más de IRQ_SM0 .. IRQ_SM3. El valor predeterminado se dispara con cualquier máquina de estado.

hard=True registra 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_init de asm_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_init de asm_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_init de asm_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_init de asm_pio() para que el pin comience como una salida controlada en lógica 1.

SHIFT_LEFT: int

Se pasa a in_shiftdir / out_shiftdir de asm_pio() o StateMachine.init() para que los desplazamientos muevan los bits hacia el MSB.

SHIFT_RIGHT: int

Se pasa a in_shiftdir / out_shiftdir de asm_pio() o StateMachine.init() para que los desplazamientos muevan los bits hacia el LSB.

JOIN_NONE: int

Se pasa a fifo_join de asm_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_join de asm_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.

JOIN_RX: int

Se pasa a fifo_join de asm_pio() para que la FIFO de RX se duplique a 8 palabras absorbiendo la FIFO de TX. La máquina de estado ya no puede transmitir datos.

IRQ_SM0: int

Indicador trigger de irq(): la máquina de estado 0 elevó su IRQ.

IRQ_SM1: int

Indicador trigger de irq(): la máquina de estado 1 elevó su IRQ.

IRQ_SM2: int

Indicador trigger de irq(): la máquina de estado 2 elevó su IRQ.

IRQ_SM3: int

Indicador trigger de irq(): la máquina de estado 3 elevó su IRQ.