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

  • out_shiftdir é a direção em que o OSR irá deslocar, seja PIO.SHIFT_LEFT ou PIO.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_RESTART do 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_encode para 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, H ou I, ou um bytearray.

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

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

Retorna o objeto IRQ para a StateMachine fornecida.

Opcionalmente, configura-o.

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