class StateMachine – acceso a la interfaz de E/S programable del RP2040

La clase StateMachine da acceso a la interfaz PIO (E/S programable) del RP2040.

Para ensamblar programas PIO, consulte rp2.asm_pio().

Constructores

class rp2.StateMachine(id: int, program: Callable | None = None, *args, **kwargs)

Obtiene la máquina de estado numerada id. El RP2040 tiene dos instancias de PIO idénticas, cada una con 4 máquinas de estado: por lo tanto, hay 8 máquinas de estado en total, numeradas de 0 a 7.

Opcionalmente, inicialícela con el programa dado program: consulte StateMachine.init.

init(program: Callable, freq: int = -1, *, in_base: machine.Pin | None = None, out_base: machine.Pin | None = None, set_base: machine.Pin | None = None, jmp_pin: machine.Pin | None = None, sideset_base: machine.Pin | None = None, in_shiftdir: int | None = None, out_shiftdir: int | None = None, push_thresh: int | None = None, pull_thresh: int | None = None) None

Configura la instancia de máquina de estado para ejecutar el programa dado program.

El programa se agrega a la memoria de instrucciones de esta instancia de PIO. Si la memoria de instrucciones ya contiene este programa, se reutiliza su desplazamiento para ahorrar memoria de instrucciones.

  • freq es la frecuencia en Hz a la que se ejecutará la máquina de estado. El valor predeterminado es la frecuencia del reloj del sistema.

    El divisor de reloj se calcula como system clock frequency / freq, por lo que puede haber ligeros errores de redondeo.

    El divisor de reloj mínimo posible es una 65536ª parte del reloj del sistema: por lo tanto, a la frecuencia predeterminada del reloj del sistema de 125 MHz, el valor mínimo de freq es 1908. Para ejecutar máquinas de estado a frecuencias más lentas, deberá reducir la velocidad del reloj del sistema con machine.freq().

  • in_base es el primer pin que se usará para las instrucciones in().

  • out_base es el primer pin que se usará para las instrucciones out().

  • set_base es el primer pin que se usará para las instrucciones set().

  • jmp_pin es el primer pin que se usará para las instrucciones jmp(pin, ...).

  • sideset_base es el primer pin que se usará para el side-set.

  • in_shiftdir es la dirección en la que desplazará el ISR, ya sea PIO.SHIFT_LEFT o PIO.SHIFT_RIGHT.

  • out_shiftdir es la dirección en la que desplazará el OSR, ya sea PIO.SHIFT_LEFT o PIO.SHIFT_RIGHT.

  • push_thresh es el umbral en bits antes de que se active el auto-push o el re-push condicional.

  • pull_thresh es el umbral en bits antes de que se active el auto-pull o el re-pull condicional.

Nota: los pines usados para in_base deben configurarse manualmente como entrada (o de otra forma) para que el PIO pueda ver la señal deseada (podrían ser pines de entrada, pines de salida o estar conectados a un periférico diferente). El jmp_pin también puede configurarse manualmente, pero de forma predeterminada será un pin de entrada.

active(value: bool | int | None = None, /) bool

Obtiene o establece si la máquina de estado se está ejecutando actualmente.

>>> sm.active()
True
>>> sm.active(0)
False
restart() None

Reinicia la máquina de estado y salta al principio del programa.

Este método borra el estado interno de la máquina de estado usando el registro SM_RESTART del RP2040. Esto incluye:

  • los contadores de desplazamiento de entrada y salida

  • el contenido del registro de desplazamiento de entrada

  • el contador de retardo

  • el estado de espera de IRQ

  • una instrucción detenida ejecutada con StateMachine.exec()

exec(instr: str | int) None

Ejecuta una sola instrucción PIO.

Si instr es una cadena, entonces usa asm_pio_encode para codificar la instrucción a partir de la cadena dada.

>>> sm.exec("set(0, 1)")

Si instr es un entero, entonces se trata como una instrucción de código máquina PIO ya codificada que se ejecutará.

>>> sm.exec(rp2.asm_pio_encode("out(y, 8)", 0))
get(buf: 'bytearray | array | None' = None, shift: int = 0) int

Extrae una palabra de la FIFO de RX de la máquina de estado.

Si la FIFO está vacía, se bloquea hasta que lleguen datos (es decir, hasta que la máquina de estado inserte una palabra).

El valor se desplaza a la derecha shift bits antes de devolverse, es decir, el valor de retorno es word >> shift.

put(value: 'int | bytes | bytearray | array', shift: int = 0) None

Inserta palabras en la FIFO de TX de la máquina de estado.

value puede ser un entero, un array de tipo B, H o I, o un bytearray.

Este método se bloqueará hasta que todas las palabras se hayan escrito en la FIFO. Si la FIFO está llena, o se llena, el método se bloqueará hasta que la máquina de estado extraiga suficientes palabras para completar la escritura.

Cada palabra se desplaza primero a la izquierda shift bits, es decir, la máquina de estado recibe word << shift.

rx_fifo() int

Devuelve el número de palabras en la FIFO de RX de la máquina de estado. Un valor de 0 indica que la FIFO está vacía.

Útil para comprobar si hay datos esperando para ser leídos, antes de llamar a StateMachine.get().

tx_fifo() int

Devuelve el número de palabras en la FIFO de TX de la máquina de estado. Un valor de 0 indica que la FIFO está vacía.

Útil para comprobar si hay espacio para insertar otra palabra usando StateMachine.put().

irq(handler: Callable[[StateMachine], None] | None = None, trigger: int = 0 | 1, hard: bool = False) Callable

Devuelve el objeto IRQ para la StateMachine dada.

Opcionalmente, la configura.

Protocolo de búfer

La clase StateMachine admite el buffer protocol, lo que permite el acceso directo a las FIFO de transmisión y recepción de cada máquina de estado. Esto es principalmente para permitir que los objetos StateMachine se pasen directamente como parámetros de lectura o escritura al configurar un canal rp2.DMA().