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
PIOpara o bloco PIO identificado porid. O RP2040 tem 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 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,
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 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
programda memória de instruções deste PIO, liberando espaço para novos programas. Seprogramfor 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
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 executá-lo – todos os argumentos posicionais/nomeados são encaminhados paraStateMachine.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 dePIOcomo seu único argumento; dentro do handler, as máquinas de estado que dispararam podem ser identificadas viaself.irq().flags()aplicado com AND às constantesIRQ_SM*.triggeré uma máscara de bits de uma ou mais deIRQ_SM0..IRQ_SM3. O padrão dispara para qualquer máquina de estado.hard=Trueregistra 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_initdeasm_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_initdeasm_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_initdeasm_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_initdeasm_pio()para que o pino inicie como saída acionada em nível lógico 1.
- SHIFT_LEFT: int¶
Passe para
in_shiftdir/out_shiftdirdeasm_pio()ouStateMachine.init()para que os deslocamentos movam os bits em direção ao MSB.
- SHIFT_RIGHT: int¶
Passe para
in_shiftdir/out_shiftdirdeasm_pio()ouStateMachine.init()para que os deslocamentos movam os bits em direção ao LSB.
- JOIN_NONE: int¶
Passe para
fifo_joindeasm_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_joindeasm_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.