rp2 — funcionalidades específicas do RP2040

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

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

Instruções da linguagem assembly PIO

As máquinas de estado PIO são programadas numa linguagem assembly personalizada com nove instruções PIO-machine fundamentais. No MicroPython, as rotinas assembly PIO são escritas como uma função Python com o decorador @rp2.asm_pio(), e utilizam sintaxe Python. Essas rotinas suportam variáveis e aritmética Python padrão, bem como as seguintes funções personalizadas que codificam instruções PIO e dirigem o assembler. Consulte a secção 3.4 do datasheet do RP2040 para mais detalhes.

wrap_target()

Especifica a localização onde a execução continua após o programa fazer wrap. Por predefinição, este é o início da rotina PIO.

wrap()

Especifica a localização onde o programa termina e faz wrap. Se esta diretiva não for utilizada, é adicionada automaticamente no final da rotina PIO. O wrap não consome ciclos de execução.

label(label)

Define uma etiqueta chamada label na localização atual. label pode ser uma string ou um inteiro.

word(instr, label=None)

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

  • instr: o valor de 16 bits

  • label: se fornecido, procura a etiqueta e efetua um OR lógico do valor da etiqueta com instr

jmp(…)

Esta instrução assume duas formas:

jmp(label)
  • label: etiqueta para salto incondicional

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

    • not_x, not_y: verdadeiro se o registo for zero

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

    • x_not_y: verdadeiro se X não for igual a Y

    • pin: verdadeiro se o pino de entrada estiver definido

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

  • label: etiqueta para salto se a condição for verdadeira

wait(polarity, src, index)

Bloqueia, aguardando nível alto/baixo num pino ou linha IRQ.

  • polarity: 0 ou 1, 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 (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 (1-32)

push(…)

Envia o ISR para o FIFO RX e, em seguida, limpa o ISR para zero. Esta instrução assume as seguintes formas:

  • push()

  • push(block)

  • push(noblock)

  • push(iffull)

  • push(iffull, block)

  • push(iffull, noblock)

Se block for utilizado, a instrução fica em espera se o FIFO RX estiver cheio. O padrão é bloquear. Se iffull for utilizado, apenas envia se a contagem de deslocamento de entrada tiver atingido o seu limiar.

pull(…)

Retira do FIFO 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 utilizado, a instrução fica em espera se o FIFO TX estiver vazio. O padrão é bloquear. Se ifempty for utilizado, apenas retira se a contagem de deslocamento de saída tiver atingido o 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 envolvendo-o em invert() ou reverse() (mas não ambos simultaneamente)

irq(…)

Define ou limpa um sinalizador 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 utilizado, a instrução fica em espera até que o sinalizador seja limpo por outra entidade. Se clear for utilizado, o sinalizador é limpo em vez de ser definido. Os índices IRQ relativos adicionam o ID da máquina de estado ao índice IRQ com adição módulo-4. Os IRQs 0-3 são visíveis para o processador; os 4-7 são internos às máquinas de estado.

set(dest, data)

Define dest com o valor data.

  • dest: pins, x, y, pindirs

  • data: valor (0-31)

nop()

Esta é uma pseudo-instrução que assembla para mov(y, y) e não tem efeito secundário.

.side(value)

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

  • value: o valor (bits) a colocar nos pinos side-set

.delay(value)

Este é um modificador que pode ser aplicado a qualquer instrução e especifica quantos ciclos aguardar após a execução da instrução.

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

[value]

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

Classes