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).