class 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 com o número id. O RP2040 tem duas instâncias 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 program fornecido: 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 program fornecido.
O programa é adicionado à memória de instruções desta instância PIO. Se a memória de instruções já contiver este programa, o seu offset é reutilizado de forma a poupar memória de instruções.
freq é a frequência em Hz à qual a máquina de estado deve funcionar. Por omissão, corresponde à frequência do relógio do sistema.
O divisor de relógio é calculado como
system clock frequency / freq, pelo que podem ocorrer pequenos erros de arredondamento.O divisor de relógio mínimo possível é um 65536.º da frequência do relógio do sistema: assim, à frequência padrão do relógio do sistema de 125MHz, o valor mínimo de freq é
1908. Para executar máquinas de estado a frequências mais baixas, será necessário reduzir a velocidade do relógio do sistema commachine.freq().in_base é o primeiro pino a utilizar para instruções
in().out_base é o primeiro pino a utilizar para instruções
out().set_base é o primeiro pino a utilizar para instruções
set().jmp_pin é o primeiro pino a utilizar para instruções
jmp(pin, ...).sideset_base é o primeiro pino a utilizar para side-setting.
in_shiftdir é a direção de deslocamento do ISR, podendo ser
PIO.SHIFT_LEFTouPIO.SHIFT_RIGHT.out_shiftdir é a direção de deslocamento do OSR, podendo ser
PIO.SHIFT_LEFTouPIO.SHIFT_RIGHT.push_thresh é o limiar em bits antes de ser acionado o auto-push ou o re-push condicional.
pull_thresh é o limiar em bits antes de ser acionado o auto-pull ou o re-pull condicional.
Nota: os pinos utilizados para in_base precisam de ser configurados manualmente como entrada (ou de outra forma) para que o PIO possa ver o sinal pretendido (podem ser pinos de entrada, pinos de saída ou ligados a um periférico diferente). O jmp_pin também pode ser configurado manualmente, mas por omissão será um pino de entrada.
- active(value: bool | int | None = None, /) bool¶
Obtém ou define se a máquina de estado está atualmente em execução.
>>> 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 utilizando o registo
SM_RESTARTdo RP2040. Isto inclui:contadores de deslocamento de entrada e saída
o conteúdo do registo de deslocamento de entrada
o contador de atraso
o estado de espera em IRQ
uma instrução interrompida executada com
StateMachine.exec()
- exec(instr: str | int) None¶
Executa uma única instrução PIO.
Se instr for uma string, utiliza
asm_pio_encodepara codificar a instrução a partir da string fornecida.>>> sm.exec("set(0, 1)")Se instr for um inteiro, é tratado como uma instrução de código 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¶
Retira uma palavra do FIFO RX da máquina de estado.
Se o FIFO estiver vazio, bloqueia até que os dados cheguem (i.e., a máquina de estado coloca uma palavra).
O valor é deslocado para a direita shift bits antes de ser devolvido, i.e., o valor devolvido é
word >> shift.
- put(value: 'int | bytes | bytearray | array', shift: int = 0) None¶
Coloca palavras no FIFO TX da máquina de estado.
value pode ser um inteiro, um array do tipo
B,HouI, ou umbytearray.Este método bloqueia até que todas as palavras tenham sido escritas no FIFO. Se o FIFO estiver, ou ficar, cheio, o método bloqueia até que a máquina de estado retire palavras suficientes para concluir a escrita.
Cada palavra é primeiro deslocada para a esquerda shift bits, i.e., a máquina de estado recebe
word << shift.
- rx_fifo() int¶
Devolve o número de palavras no FIFO RX da máquina de estado. Um valor de 0 indica que o FIFO está vazio.
Útil para verificar se há dados à espera de serem lidos, antes de chamar
StateMachine.get().
- tx_fifo() int¶
Devolve o número de palavras no FIFO TX da máquina de estado. Um valor de 0 indica que o FIFO está vazio.
Útil para verificar se há espaço para colocar mais uma palavra usando
StateMachine.put().
Protocolo de buffer¶
A classe StateMachine suporta o protocolo de buffer, permitindo acesso direto aos FIFOs de transmissão e receção de cada máquina de estado. Isto destina-se principalmente a permitir que objetos StateMachine sejam passados diretamente como parâmetros de leitura ou escrita ao configurar um canal rp2.DMA().