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 isx_dec,y_dec: waar als het register niet-nul is, en voer een post-decrement uitx_not_y: waar als X niet gelijk is aan Ypin: waar als de invoerpin is gezetnot_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 hetin_baseargument van de StateMachine),irqindex: 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,osrbit_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,execbit_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
blockwordt gebruikt, blijft de instructie hangen als de RX-FIFO vol is. De standaard is blokkeren. Alsiffullwordt 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
blockwordt gebruikt, blijft de instructie hangen als de TX-FIFO leeg is. De standaard is blokkeren. Alsifemptywordt 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,osrsrc: een van:
pins,x,y,null,status,isr,osr; dit argument kan optioneel worden aangepast door het te omhullen metinvert()ofreverse()(maar niet beide tegelijk)
- irq(…)
Zet of wis een IRQ-vlag. Deze instructie kent twee vormen:
- irq(index)
index: 0-7, of
rel(0)totrel(7)
- irq(mode, index)
mode: een van:
block,clearindex: 0-7, of
rel(0)totrel(7)
Als
blockwordt gebruikt, blijft de instructie hangen totdat de vlag door een andere entiteit wordt gewist. Alsclearwordt 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,pindirsdata: 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).