rp2 — funcionalidades específicas do RP2040

O módulo rp2 contém funções e classes específicas do RP2040, conforme usado no Raspberry Pi Pico.

Consulte o datasheet de Python do RP2040 para mais informações, e pico-micropython-examples para código de exemplo.

Instruções da linguagem de montagem PIO

As máquinas de estado PIO são programadas em uma linguagem de montagem personalizada com nove instruções principais da máquina PIO. No MicroPython, as rotinas de montagem PIO são escritas como uma função Python com o decorador @rp2.asm_pio(), e usam a sintaxe do Python. Tais rotinas oferecem suporte a variáveis e operações aritméticas padrão do Python, bem como às funções personalizadas a seguir, que codificam instruções PIO e orientam o montador. Consulte a seção 3.4 do datasheet do RP2040 para mais detalhes.

wrap_target()

Especifica o local onde a execução continua após o wrapping do programa. Por padrão, este é o início da rotina PIO.

wrap()

Especifica o local onde o programa termina e faz o wrap. Se esta diretiva não for usada, ela é adicionada automaticamente ao final da rotina PIO. O wrapping não custa nenhum ciclo de execução.

label(label)

Define um rótulo chamado label no local atual. label pode ser uma string ou um inteiro.

word(instr, label=None)

Insere uma palavra arbitrária de 16 bits na saída montada.

  • instr: o valor de 16 bits

  • label: se fornecido, procura o rótulo e faz um OR lógico do valor do rótulo com instr

jmp(…)

Esta instrução assume duas formas:

jmp(label)
  • label: rótulo para o qual saltar incondicionalmente

jmp(cond, label)
  • cond: a condição a verificar, sendo uma de:

    • not_x, not_y: verdadeiro se o registrador for zero

    • x_dec, y_dec: verdadeiro se o registrador for diferente de zero, e faz pós-decremento

    • x_not_y: verdadeiro se X for diferente de Y

    • pin: verdadeiro se o pino de entrada estiver setado

    • not_osre: verdadeiro se o OSR não estiver vazio (não atingiu seu limiar)

  • label: rótulo para o qual saltar se a condição for verdadeira

wait(polarity, src, index)

Bloqueia, aguardando nível alto/baixo em um pino ou em uma linha de IRQ.

  • polarity: 0 ou 1, indicando se deve aguardar um valor baixo ou alto

  • src: um de: gpio (pino absoluto), pin (pino relativo ao argumento in_base da StateMachine), irq

  • index: 0-31, o índice para src

in_(src, bit_count)

Desloca dados de src para o ISR.

  • src: um de: pins, x, y, null, isr, osr

  • bit_count: número de bits a deslocar para dentro (1-32)

out(dest, bit_count)

Desloca dados do OSR para dest.

  • dest: um de: pins, x, y, pindirs, pc, isr, exec

  • bit_count: número de bits a deslocar para fora (1-32)

push(…)

Faz o push do ISR para o FIFO de RX e, em seguida, zera o ISR. Esta instrução assume as seguintes formas:

  • push()

  • push(block)

  • push(noblock)

  • push(iffull)

  • push(iffull, block)

  • push(iffull, noblock)

Se block for usado, a instrução fica em stall se o FIFO de RX estiver cheio. O padrão é bloquear. Se iffull for usado, ela só faz o push se a contagem de deslocamento de entrada tiver atingido seu limiar.

pull(…)

Faz o pull do FIFO de TX para o OSR. Esta instrução assume as seguintes formas:

  • pull()

  • pull(block)

  • pull(noblock)

  • pull(ifempty)

  • pull(ifempty, block)

  • pull(ifempty, noblock)

Se block for usado, a instrução fica em stall se o FIFO de TX estiver vazio. O padrão é bloquear. Se ifempty for usado, ela só faz o pull se a contagem de deslocamento de saída tiver atingido seu limiar.

mov(dest, src)

Move para dest o valor de src.

  • dest: um de: pins, x, y, exec, pc, isr, osr

  • src: um de: pins, x, y, null, status, isr, osr; este argumento pode ser opcionalmente modificado ao envolvê-lo em invert() ou reverse() (mas não ambos juntos)

irq(…)

Seta ou limpa uma flag de IRQ. Esta instrução assume duas formas:

irq(index)
  • index: 0-7, ou rel(0) a rel(7)

irq(mode, index)
  • mode: um de: block, clear

  • index: 0-7, ou rel(0) a rel(7)

Se block for usado, a instrução fica em stall até que a flag seja limpa por outra entidade. Se clear for usado, a flag é limpa em vez de ser setada. Índices de IRQ relativos somam o ID da máquina de estado ao índice da IRQ com adição módulo-4. As IRQs 0-3 são visíveis ao processador, e as 4-7 são internas às máquinas de estado.

set(dest, data)

Seta dest com o valor data.

  • dest: pins, x, y, pindirs

  • data: valor (0-31)

nop()

Esta é uma pseudoinstrução que é montada como mov(y, y) e não tem efeito colateral.

.side(value)

Este é um modificador que pode ser aplicado a qualquer instrução, e é usado para controlar os valores dos pinos de side-set.

  • value: o valor (bits) a ser enviado para os pinos de side-set

.delay(value)

Este é um modificador que pode ser aplicado a qualquer instrução, e especifica quantos ciclos atrasar após a instrução ser executada.

  • value: ciclos de atraso, 0-31 (valor máximo reduzido se forem usados pinos de side-set)

[value]

Este é um modificador e é equivalente a .delay(value).

Classes