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 conmachine.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_LEFToPIO.SHIFT_RIGHT.out_shiftdir es la dirección en la que desplazará el OSR, ya sea
PIO.SHIFT_LEFToPIO.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_RESTARTdel 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_encodepara 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,HoI, o unbytearray.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().
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().