rp2 — RP2040-spezifische Funktionalität¶
Das rp2-Modul enthält Funktionen und Klassen, die spezifisch für den RP2040 sind, wie er im Raspberry Pi Pico verwendet wird.
Weitere Informationen finden Sie im RP2040 Python datasheet und Beispielcode unter pico-micropython-examples.
PIO-Assemblersprache-Instruktionen¶
PIO-State-Machines werden in einer benutzerdefinierten Assemblersprache mit neun zentralen PIO-Maschineninstruktionen programmiert. In MicroPython werden PIO-Assembler-Routinen als Python-Funktion mit dem Dekorator @rp2.asm_pio() geschrieben und verwenden Python-Syntax. Solche Routinen unterstützen Standard-Python-Variablen und -Arithmetik sowie die folgenden benutzerdefinierten Funktionen, die PIO-Instruktionen codieren und den Assembler steuern. Weitere Details finden Sie in Abschnitt 3.4 des RP2040-Datenblatts.
- wrap_target()
Gibt den Ort an, an dem die Ausführung nach dem Programm-Wrapping fortgesetzt wird. Standardmäßig ist dies der Anfang der PIO-Routine.
- wrap()
Gibt den Ort an, an dem das Programm endet und umbricht. Wenn diese Direktive nicht verwendet wird, wird sie automatisch am Ende der PIO-Routine hinzugefügt. Das Wrapping kostet keine Ausführungszyklen.
- label(label)
Definiert ein Label namens label an der aktuellen Position. label kann eine Zeichenkette oder eine Ganzzahl sein.
- word(instr, label=None)
Fügt ein beliebiges 16-Bit-Wort in die assemblierte Ausgabe ein.
instr: der 16-Bit-Wert
label: falls angegeben, wird das Label nachgeschlagen und der Wert des Labels logisch mit instr per ODER verknüpft
- jmp(…)
Diese Instruktion hat zwei Formen:
- jmp(label)
label: Label, zu dem unbedingt gesprungen wird
- jmp(cond, label)
cond: die zu prüfende Bedingung, eine von:
not_x,not_y: wahr, wenn das Register null istx_dec,y_dec: wahr, wenn das Register ungleich null ist, und führt eine Post-Dekrementierung durchx_not_y: wahr, wenn X ungleich Y istpin: wahr, wenn der Eingangs-Pin gesetzt istnot_osre: wahr, wenn das OSR nicht leer ist (seinen Schwellenwert nicht erreicht hat)
label: Label, zu dem gesprungen wird, falls die Bedingung wahr ist
- wait(polarity, src, index)
Blockiert und wartet auf High/Low an einem Pin oder einer IRQ-Leitung.
polarity: 0 oder 1, ob auf einen Low- oder High-Wert gewartet wird
src: einer von:
gpio(absoluter Pin),pin(Pin relativ zumin_base-Argument der StateMachine),irqindex: 0-31, der Index für src
- in_(src, bit_count)
Schiebt Daten von src in das ISR.
src: einer von:
pins,x,y,null,isr,osrbit_count: Anzahl der einzuschiebenden Bits (1-32)
- out(dest, bit_count)
Schiebt Daten vom OSR nach dest hinaus.
dest: einer von:
pins,x,y,pindirs,pc,isr,execbit_count: Anzahl der hinauszuschiebenden Bits (1-32)
- push(…)
Schiebt das ISR in das RX-FIFO und setzt dann das ISR auf null zurück. Diese Instruktion hat die folgenden Formen:
push()
push(block)
push(noblock)
push(iffull)
push(iffull, block)
push(iffull, noblock)
Wenn
blockverwendet wird, blockiert die Instruktion, falls das RX-FIFO voll ist. Standardmäßig wird blockiert. Wenniffullverwendet wird, wird nur dann gepusht, wenn der Eingangs-Schiebezähler seinen Schwellenwert erreicht hat.- pull(…)
Holt Daten aus dem TX-FIFO in das OSR. Diese Instruktion hat die folgenden Formen:
pull()
pull(block)
pull(noblock)
pull(ifempty)
pull(ifempty, block)
pull(ifempty, noblock)
Wenn
blockverwendet wird, blockiert die Instruktion, falls das TX-FIFO leer ist. Standardmäßig wird blockiert. Wennifemptyverwendet wird, wird nur dann gepullt, wenn der Ausgangs-Schiebezähler seinen Schwellenwert erreicht hat.- mov(dest, src)
Verschiebt den Wert von src nach dest.
dest: einer von:
pins,x,y,exec,pc,isr,osrsrc: einer von:
pins,x,y,null,status,isr,osr; dieses Argument kann optional modifiziert werden, indem es ininvert()oderreverse()eingeschlossen wird (aber nicht beide zusammen)
- irq(…)
Setzt oder löscht ein IRQ-Flag. Diese Instruktion hat zwei Formen:
- irq(index)
index: 0-7, oder
rel(0)bisrel(7)
- irq(mode, index)
mode: einer von:
block,clearindex: 0-7, oder
rel(0)bisrel(7)
Wenn
blockverwendet wird, blockiert die Instruktion, bis das Flag von einer anderen Entität gelöscht wird. Wennclearverwendet wird, wird das Flag gelöscht, anstatt gesetzt zu werden. Relative IRQ-Indizes addieren die State-Machine-ID per Modulo-4-Addition zum IRQ-Index. Die IRQs 0-3 sind vom Prozessor aus sichtbar, 4-7 sind intern für die State-Machines.- set(dest, data)
Setzt dest auf den Wert data.
dest:
pins,x,y,pindirsdata: Wert (0-31)
- nop()
Dies ist eine Pseudoinstruktion, die zu
mov(y, y)assembliert wird und keine Nebenwirkung hat.- .side(value)
Dies ist ein Modifikator, der auf jede Instruktion angewendet werden kann und zur Steuerung der Side-Set-Pin-Werte verwendet wird.
value: der auf den Side-Set-Pins auszugebende Wert (Bits)
- .delay(value)
Dies ist ein Modifikator, der auf jede Instruktion angewendet werden kann und angibt, wie viele Zyklen nach der Ausführung der Instruktion verzögert werden soll.
value: zu verzögernde Zyklen, 0-31 (Maximalwert reduziert, wenn Side-Set-Pins verwendet werden)
- [value]
Dies ist ein Modifikator und entspricht
.delay(value).