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 zerox_dec,y_dec: verdadeiro se o registo for diferente de zero, e efetua pós-decrementox_not_y: verdadeiro se X não for igual a Ypin: verdadeiro se o pino de entrada estiver definidonot_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 argumentoin_baseda StateMachine),irqindex: 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,osrbit_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,execbit_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
blockfor utilizado, a instrução fica em espera se o FIFO RX estiver cheio. O padrão é bloquear. Seiffullfor 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
blockfor utilizado, a instrução fica em espera se o FIFO TX estiver vazio. O padrão é bloquear. Seifemptyfor 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,osrsrc: um de:
pins,x,y,null,status,isr,osr; este argumento pode ser opcionalmente modificado envolvendo-o eminvert()oureverse()(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)arel(7)
- irq(mode, index)
mode: um de:
block,clearindex: 0-7, ou
rel(0)arel(7)
Se
blockfor utilizado, a instrução fica em espera até que o sinalizador seja limpo por outra entidade. Seclearfor 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,pindirsdata: 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).