rp2 — functionaliteit specifiek voor de RP2040

De rp2 module bevat functies en klassen die specifiek zijn voor de RP2040, zoals gebruikt in de Raspberry Pi Pico.

Zie de RP2040 Python datasheet voor meer informatie, en pico-micropython-examples voor voorbeeldcode.

PIO-assembleertaalinstructies

PIO-statemachines worden geprogrammeerd in een aangepaste assembleertaal met negen kern PIO-machine-instructies. In MicroPython worden PIO-assembleerroutines geschreven als een Python-functie met de decorator @rp2.asm_pio(), en gebruiken ze Python-syntaxis. Dergelijke routines ondersteunen standaard Python-variabelen en -rekenkunde, evenals de volgende aangepaste functies die PIO-instructies coderen en de assembler aansturen. Zie sectie 3.4 van de RP2040-datasheet voor meer details.

wrap_target()

Geef de locatie op waar de uitvoering verdergaat na programma-wrapping. Standaard is dit het begin van de PIO-routine.

wrap()

Geef de locatie op waar het programma eindigt en terugkeert (wrapt). Als deze directive niet wordt gebruikt, wordt deze automatisch toegevoegd aan het einde van de PIO-routine. Wrapping kost geen uitvoeringscycli.

label(label)

Definieer een label genaamd label op de huidige locatie. label kan een string of een integer zijn.

word(instr, label=None)

Voeg een willekeurig 16-bits woord toe in de geassembleerde uitvoer.

  • instr: de 16-bits waarde

  • label: indien opgegeven, zoek het label op en pas een logische OR toe op de waarde van het label met instr

jmp(…)

Deze instructie kent twee vormen:

jmp(label)
  • label: label om onvoorwaardelijk naartoe te springen

jmp(cond, label)
  • cond: de te controleren conditie, een van:

    • not_x, not_y: waar als het register nul is

    • x_dec, y_dec: waar als het register niet-nul is, en voer een post-decrement uit

    • x_not_y: waar als X niet gelijk is aan Y

    • pin: waar als de invoerpin is gezet

    • not_osre: waar als de OSR niet leeg is (zijn drempelwaarde niet heeft bereikt)

  • label: label om naartoe te springen als de conditie waar is

wait(polarity, src, index)

Blokkeer, wachtend op hoog/laag op een pin of IRQ-lijn.

  • polarity: 0 of 1, of er gewacht moet worden op een lage of een hoge waarde

  • src: een van: gpio (absolute pin), pin (pin relatief ten opzichte van het in_base argument van de StateMachine), irq

  • index: 0-31, de index voor src

in_(src, bit_count)

Schuif data in van src naar de ISR.

  • src: een van: pins, x, y, null, isr, osr

  • bit_count: aantal in te schuiven bits (1-32)

out(dest, bit_count)

Schuif data uit van de OSR naar dest.

  • dest: een van: pins, x, y, pindirs, pc, isr, exec

  • bit_count: aantal uit te schuiven bits (1-32)

push(…)

Push de ISR naar de RX-FIFO en wis vervolgens de ISR naar nul. Deze instructie kent de volgende vormen:

  • push()

  • push(block)

  • push(noblock)

  • push(iffull)

  • push(iffull, block)

  • push(iffull, noblock)

Als block wordt gebruikt, blijft de instructie hangen als de RX-FIFO vol is. De standaard is blokkeren. Als iffull wordt gebruikt, pusht deze alleen als de invoerschuiftelling zijn drempelwaarde heeft bereikt.

pull(…)

Pull uit de TX-FIFO naar de OSR. Deze instructie kent de volgende vormen:

  • pull()

  • pull(block)

  • pull(noblock)

  • pull(ifempty)

  • pull(ifempty, block)

  • pull(ifempty, noblock)

Als block wordt gebruikt, blijft de instructie hangen als de TX-FIFO leeg is. De standaard is blokkeren. Als ifempty wordt gebruikt, pullt deze alleen als de uitvoerschuiftelling zijn drempelwaarde heeft bereikt.

mov(dest, src)

Verplaats de waarde uit src naar dest.

  • dest: een van: pins, x, y, exec, pc, isr, osr

  • src: een van: pins, x, y, null, status, isr, osr; dit argument kan optioneel worden aangepast door het te omhullen met invert() of reverse() (maar niet beide tegelijk)

irq(…)

Zet of wis een IRQ-vlag. Deze instructie kent twee vormen:

irq(index)
  • index: 0-7, of rel(0) tot rel(7)

irq(mode, index)
  • mode: een van: block, clear

  • index: 0-7, of rel(0) tot rel(7)

Als block wordt gebruikt, blijft de instructie hangen totdat de vlag door een andere entiteit wordt gewist. Als clear wordt gebruikt, wordt de vlag gewist in plaats van gezet. Relatieve IRQ-indices voegen het state machine-ID toe aan de IRQ-index met modulo-4-optelling. IRQ’s 0-3 zijn zichtbaar voor de processor, 4-7 zijn intern voor de state machines.

set(dest, data)

Zet dest op de waarde data.

  • dest: pins, x, y, pindirs

  • data: waarde (0-31)

nop()

Dit is een pseudo-instructie die assembleert tot mov(y, y) en geen neveneffect heeft.

.side(value)

Dit is een modifier die op elke instructie kan worden toegepast en wordt gebruikt om de waarden van side-set-pinnen te besturen.

  • value: de waarde (bits) die op de side-set-pinnen moet worden uitgevoerd

.delay(value)

Dit is een modifier die op elke instructie kan worden toegepast en geeft aan hoeveel cycli er gewacht moet worden nadat de instructie is uitgevoerd.

  • value: aantal cycli vertraging, 0-31 (maximale waarde gereduceerd als er side-set-pinnen worden gebruikt)

[value]

Dit is een modifier en is equivalent aan .delay(value).

Klassen