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
PIOpara o bloco PIO identificado porid. O RP2040 possui dois blocos PIO, numerados0e1. LançaValueErrorpara 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,
0ou16).Com um argumento, define a base.
basepode ser uma instância demachine.Pinou 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
programna 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
programda memória de instruções deste PIO, libertando espaço para novos programas. Seprogramfor 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
StateMachinepertencentes a este bloco PIO.idé o índice local da máquina de estado (0–3).Se
programfor fornecido, a máquina de estado é configurada para o executar – todos os argumentos posicionais/por palavra-chave são encaminhados paraStateMachine.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ânciaPIOcomo único argumento; dentro do handler, as máquinas de estado que dispararam podem ser identificadas viaself.irq().flags()em AND com as constantesIRQ_SM*.triggeré uma máscara de bits de um ou maisIRQ_SM0..IRQ_SM3. Por omissão, dispara em qualquer máquina de estado.hard=Trueregista 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_initdeasm_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_initdeasm_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_initdeasm_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_initdeasm_pio()para que o pino comece como saída a nível lógico 1.
- SHIFT_LEFT: int¶
Passe a
in_shiftdir/out_shiftdirdeasm_pio()ouStateMachine.init()para que os deslocamentos movam bits em direção ao MSB.
- SHIFT_RIGHT: int¶
Passe a
in_shiftdir/out_shiftdirdeasm_pio()ouStateMachine.init()para que os deslocamentos movam bits em direção ao LSB.
- JOIN_NONE: int¶
Passe a
fifo_joindeasm_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_joindeasm_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.