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 com machine.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_LEFT ou PIO.SHIFT_RIGHT.

  • out_shiftdir é a direção de deslocamento do OSR, podendo ser PIO.SHIFT_LEFT ou PIO.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_RESTART do 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_encode para 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, H ou I, ou um bytearray.

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().

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

Devolve o objeto IRQ para a StateMachine indicada.

Opcionalmente, configura-o.

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().