classe PIO – uso avançado de PIO

A classe PIO encapsula um dos dois blocos de I/O Programável (PIO) do RP2040. Cada bloco PIO contém uma memória de instruções (32 instruções) compartilhada por quatro máquinas de estado independentes, além de uma interface FIFO privada para cada máquina de estado e um controlador de IRQ.

A maioria dos scripts interage com o PIO através de StateMachine – esta classe é destinada a casos de uso avançados que precisam:

  • Carregar e remover programas explicitamente via add_program() / remove_program().

  • Mover a base de GPIO do PIO ao longo da janela de 32 pinos do chip via gpio_base().

  • Conectar-se a flags de IRQ de todo o bloco via irq().

Para montar programas PIO, consulte rp2.asm_pio().

Construtores

class rp2.PIO(id: int)

Retorna o objeto singleton PIO para o bloco PIO identificado por id. O RP2040 tem dois blocos PIO, numerados 0 e 1. Lança ValueError para qualquer outro id.

Métodos

gpio_base(base: machine.Pin | int | None = None, /) int

Obtém ou define a base de GPIO para este bloco PIO.

O PIO do RP2040 enxerga uma janela de 32 pinos no espaço de GPIO; a janela pode começar em GPIO0 ou GPIO16. A base controla qual janela está em vigor para todas as máquinas de estado neste PIO.

Sem argumento, retorna a base atual (o número do pino de GPIO, 0 ou 16).

Com um argumento, define a base. base pode ser uma instância de machine.Pin ou o número inteiro do pino, e deve resolver para GPIO0 ou GPIO16. A base deve ser definida antes de qualquer programa ser adicionado ou de qualquer máquina de estado ser construída neste bloco PIO.

add_program(program: Callable) None

Carrega program na memória de instruções deste PIO. O layout de memória resultante é reutilizado por todas as máquinas de estado neste bloco PIO.

Cada PIO tem apenas 32 instruções de memória de programa compartilhadas entre todos os programas; se o novo programa não couber, este método lança OSError(ENOMEM). O mesmo programa pode ser carregado em ambas as instâncias de PIO, mas elas consomem regiões de memória separadas.

remove_program(program: Callable | None = None, /) None

Remove program da memória de instruções deste PIO, liberando espaço para novos programas. Se program for omitido, todos os programas atualmente carregados neste PIO são removidos.

Remover um programa que não estava carregado é uma operação sem efeito (nenhuma exceção).

state_machine(id: int, program: Callable | None = None, *args, **kwargs) StateMachine

Retorna uma das quatro instâncias de StateMachine pertencentes a este bloco PIO. id é o índice local da máquina de estado (03).

Se program for fornecido, a máquina de estado é configurada para executá-lo – todos os argumentos posicionais/nomeados são encaminhados para StateMachine.init().

Exemplo:

>>> rp2.PIO(1).state_machine(3)
StateMachine(7)

O ID global da máquina de estado do objeto retornado é pio_id * 4 + sm_id.

irq(handler: Callable[[PIO], None] | None = None, trigger: int = IRQ_SM0 | IRQ_SM1 | IRQ_SM2 | IRQ_SM3, hard: bool = False) Callable

Obtém ou configura a IRQ em nível de bloco para este PIO.

handler é o callback a ser disparado quando qualquer uma das IRQs solicitadas das máquinas de estado for travada. O handler recebe esta instância de PIO como seu único argumento; dentro do handler, as máquinas de estado que dispararam podem ser identificadas via self.irq().flags() aplicado com AND às constantes IRQ_SM*.

trigger é uma máscara de bits de uma ou mais de IRQ_SM0 .. IRQ_SM3. O padrão dispara para qualquer máquina de estado.

hard=True registra um handler de interrupção rígida (sem alocação de heap no callback).

O MicroPython vincula a IRQ 0 em cada bloco PIO; a IRQ 1 é reservada e não acessível a partir do Python.

Constantes

IN_LOW: int

Passe para out_init / set_init / sideset_init de asm_pio() para que o pino inicie como entrada acionada em nível baixo (ou seja, em tristate com o buffer de saída mantendo um 0).

IN_HIGH: int

Passe para out_init / set_init / sideset_init de asm_pio() para que o pino inicie como entrada com o buffer de saída mantendo um 1.

OUT_LOW: int

Passe para out_init / set_init / sideset_init de asm_pio() para que o pino inicie como saída acionada em nível lógico 0.

OUT_HIGH: int

Passe para out_init / set_init / sideset_init de asm_pio() para que o pino inicie como saída acionada em nível lógico 1.

SHIFT_LEFT: int

Passe para in_shiftdir / out_shiftdir de asm_pio() ou StateMachine.init() para que os deslocamentos movam os bits em direção ao MSB.

SHIFT_RIGHT: int

Passe para in_shiftdir / out_shiftdir de asm_pio() ou StateMachine.init() para que os deslocamentos movam os bits em direção ao LSB.

JOIN_NONE: int

Passe para fifo_join de asm_pio() para que a máquina de estado tenha FIFOs de TX e RX separadas de 4 palavras (o padrão).

JOIN_TX: int

Passe para fifo_join de asm_pio() para que a FIFO de TX seja dobrada para 8 palavras absorvendo a FIFO de RX. A máquina de estado deixa de poder receber dados.

JOIN_RX: int

Passe para fifo_join de asm_pio() para que a FIFO de RX seja dobrada para 8 palavras absorvendo a FIFO de TX. A máquina de estado deixa de poder transmitir dados.

IRQ_SM0: int

Flag de trigger de irq(): a máquina de estado 0 levantou sua IRQ.

IRQ_SM1: int

Flag de trigger de irq(): a máquina de estado 1 levantou sua IRQ.

IRQ_SM2: int

Flag de trigger de irq(): a máquina de estado 2 levantou sua IRQ.

IRQ_SM3: int

Flag de trigger de irq(): a máquina de estado 3 levantou sua IRQ.