class PIO – utilização avançada 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) partilhada por quatro máquinas de estado independentes, mais 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 destina-se a casos de uso avançados que precisem de:

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

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

  • Ligar a flags IRQ de âmbito de bloco via irq().

Para montar programas PIO consulte rp2.asm_pio().

Construtores

class rp2.PIO(id: int)

Devolve o objeto singleton PIO para o bloco PIO identificado por id. O RP2040 possui 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 GPIO para este bloco PIO.

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

Sem argumento, devolve a base atual (o número do pino 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 esquema 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 partilhadas por 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 PIO, mas consomem regiões de memória separadas.

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

Remove program da memória de instruções deste PIO, libertando 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 foi carregado não tem qualquer efeito (sem exceção).

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

Devolve uma das quatro instâncias 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 o executar – todos os argumentos posicionais/por palavra-chave 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 devolvido é 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 o IRQ de âmbito de bloco para este PIO.

handler é o callback a disparar quando qualquer um dos IRQs de máquina de estado solicitados é ativado. O handler recebe esta instância PIO como único argumento; dentro do handler, as máquinas de estado que dispararam podem ser identificadas via self.irq().flags() em AND com as constantes IRQ_SM*.

trigger é uma máscara de bits de um ou mais IRQ_SM0 .. IRQ_SM3. Por omissão, dispara em qualquer máquina de estado.

hard=True regista um handler de interrupção hardware (sem alocação de heap no callback).

O MicroPython liga o IRQ 0 em cada bloco PIO; o IRQ 1 é reservado e não está acessível a partir de Python.

Constantes

IN_LOW: int

Passe a out_init / set_init / sideset_init de asm_pio() para que o pino comece como entrada com nível baixo (i.e., tristate com o buffer de saída a manter 0).

IN_HIGH: int

Passe a out_init / set_init / sideset_init de asm_pio() para que o pino comece como entrada com o buffer de saída a manter 1.

OUT_LOW: int

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

OUT_HIGH: int

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

SHIFT_LEFT: int

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

SHIFT_RIGHT: int

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

JOIN_NONE: int

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

JOIN_TX: int

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

JOIN_RX: int

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

IRQ_SM0: int

Flag trigger de irq(): a máquina de estado 0 ativou o seu IRQ.

IRQ_SM1: int

Flag trigger de irq(): a máquina de estado 1 ativou o seu IRQ.

IRQ_SM2: int

Flag trigger de irq(): a máquina de estado 2 ativou o seu IRQ.

IRQ_SM3: int

Flag trigger de irq(): a máquina de estado 3 ativou o seu IRQ.