classe StateMachine – acesso à interface de I/O programável do RP2040¶
A classe StateMachine dá acesso à interface PIO (I/O programável) do RP2040.
Para montar programas PIO, consulte rp2.asm_pio().
Construtores¶
- class rp2.StateMachine(id: int, program: Callable | None = None, *args, **kwargs)¶
Obtém a máquina de estado de número id. O RP2040 tem duas instâncias de PIO idênticas, cada uma com 4 máquinas de estado: portanto, há 8 máquinas de estado no total, numeradas de 0 a 7.
Opcionalmente, inicializa-a com o programa fornecido 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 a instância da máquina de estado para executar o programa program fornecido.
O programa é adicionado à memória de instruções desta instância de PIO. Se a memória de instruções já contiver este programa, seu offset é reutilizado a fim de economizar memória de instruções.
freq é a frequência em Hz na qual executar a máquina de estado. O padrão é a frequência do clock do sistema.
O divisor de clock é calculado como
system clock frequency / freq, então pode haver pequenos erros de arredondamento.O menor divisor de clock possível é um 65536-avos do clock do sistema: portanto, na frequência padrão do clock do sistema de 125MHz, o valor mínimo de freq é
1908. Para executar máquinas de estado em frequências mais baixas, você precisará reduzir a velocidade do clock do sistema commachine.freq().in_base é o primeiro pino a usar para instruções
in().out_base é o primeiro pino a usar para instruções
out().set_base é o primeiro pino a usar para instruções
set().jmp_pin é o primeiro pino a usar para instruções
jmp(pin, ...).sideset_base é o primeiro pino a usar para side-setting.
in_shiftdir é a direção em que o ISR irá deslocar, seja
PIO.SHIFT_LEFTouPIO.SHIFT_RIGHT.out_shiftdir é a direção em que o OSR irá deslocar, seja
PIO.SHIFT_LEFTouPIO.SHIFT_RIGHT.push_thresh é o limiar em bits antes que o auto-push ou o re-push condicional seja acionado.
pull_thresh é o limiar em bits antes que o auto-pull ou o re-pull condicional seja acionado.
Nota: os pinos usados para in_base precisam ser configurados manualmente como entrada (ou de outra forma) para que o PIO possa ver o sinal desejado (eles podem ser pinos de entrada, pinos de saída ou estar conectados a um periférico diferente). O jmp_pin também pode ser configurado manualmente, mas por padrão será um pino de entrada.
- active(value: bool | int | None = None, /) bool¶
Obtém ou define se a máquina de estado está em execução no momento.
>>> sm.active() True >>> sm.active(0) False
- restart() None¶
Reinicia a máquina de estado e salta para o início do programa.
Este método limpa o estado interno da máquina de estado usando o registrador
SM_RESTARTdo RP2040. Isso inclui:os contadores de deslocamento de entrada e saída
o conteúdo do registrador de deslocamento de entrada
o contador de atraso
o estado de espera por IRQ
uma instrução travada executada usando
StateMachine.exec()
- exec(instr: str | int) None¶
Executa uma única instrução PIO.
Se instr for uma string, usa
asm_pio_encodepara codificar a instrução a partir da string fornecida.>>> sm.exec("set(0, 1)")Se instr for um inteiro, ele é tratado como uma instrução de código de máquina PIO já codificada a ser executada.
>>> sm.exec(rp2.asm_pio_encode("out(y, 8)", 0))
- get(buf: 'bytearray | array | None' = None, shift: int = 0) int¶
Obtém uma palavra da FIFO de RX da máquina de estado.
Se a FIFO estiver vazia, ela bloqueia até que dados cheguem (ou seja, até que a máquina de estado envie uma palavra).
O valor é deslocado para a direita em shift bits antes de ser retornado, ou seja, o valor de retorno é
word >> shift.
- put(value: 'int | bytes | bytearray | array', shift: int = 0) None¶
Envia palavras para a FIFO de TX da máquina de estado.
value pode ser um inteiro, um array do tipo
B,HouI, ou umbytearray.Este método irá bloquear até que todas as palavras tenham sido escritas na FIFO. Se a FIFO estiver, ou se tornar, cheia, o método irá bloquear até que a máquina de estado retire palavras suficientes para completar a escrita.
Cada palavra é primeiro deslocada para a esquerda em shift bits, ou seja, a máquina de estado recebe
word << shift.
- rx_fifo() int¶
Retorna o número de palavras na FIFO de RX da máquina de estado. Um valor de 0 indica que a FIFO está vazia.
Útil para verificar se há dados aguardando para serem lidos, antes de chamar
StateMachine.get().
- tx_fifo() int¶
Retorna o número de palavras na FIFO de TX da máquina de estado. Um valor de 0 indica que a FIFO está vazia.
Útil para verificar se há espaço para enviar outra palavra usando
StateMachine.put().
Protocolo de buffer¶
A classe StateMachine suporta o buffer protocol, permitindo acesso direto às FIFOs de transmissão e recepção de cada máquina de estado. Isso serve principalmente para permitir que objetos StateMachine sejam passados diretamente como parâmetros de leitura ou escrita ao configurar um canal rp2.DMA().