rp2 --- fungsionalitas khusus untuk RP2040¶
Modul rp2 berisi fungsi dan kelas yang khusus untuk RP2040, sebagaimana digunakan pada Raspberry Pi Pico.
Lihat RP2040 Python datasheet untuk informasi lebih lanjut, dan pico-micropython-examples untuk contoh kode.
Instruksi bahasa rakitan PIO¶
State machine PIO diprogram dalam bahasa rakitan khusus dengan sembilan instruksi mesin PIO inti. Dalam MicroPython, rutin rakitan PIO ditulis sebagai fungsi Python dengan dekorator @rp2.asm_pio(), dan menggunakan sintaks Python. Rutin tersebut mendukung variabel dan aritmatika Python standar, serta fungsi khusus berikut yang mengenkode instruksi PIO dan mengarahkan assembler. Lihat bagian 3.4 dari datasheet RP2040 untuk detail lebih lanjut.
- wrap_target()
Tentukan lokasi di mana eksekusi dilanjutkan setelah program wrapping. Secara default ini adalah awal dari rutin PIO.
- wrap()
Tentukan lokasi di mana program selesai dan melingkari kembali. Jika direktif ini tidak digunakan maka akan ditambahkan secara otomatis di akhir rutin PIO. Wrapping tidak memerlukan siklus eksekusi apa pun.
- label(label)
Definisikan label bernama label di lokasi saat ini. label dapat berupa string atau integer.
- word(instr, label=None)
Sisipkan word 16-bit sembarang dalam output yang dirakit.
instr: nilai 16-bit
label: jika diberikan, cari label dan lakukan logical-or nilai label dengan instr
- jmp(...)
Instruksi ini mengambil dua bentuk:
- jmp(label)
label: label untuk melompat tanpa syarat
- jmp(cond, label)
cond: kondisi yang akan diperiksa, salah satu dari:
not_x,not_y: benar jika register bernilai nolx_dec,y_dec: benar jika register bukan nol, dan lakukan post decrementx_not_y: benar jika X tidak sama dengan Ypin: benar jika pin input disetnot_osre: benar jika OSR tidak kosong (belum mencapai ambang batasnya)
label: label untuk melompat jika kondisi benar
- wait(polarity, src, index)
Blokir, menunggu tinggi/rendah pada pin atau jalur IRQ.
polarity: 0 atau 1, apakah menunggu nilai rendah atau tinggi
src: salah satu dari:
gpio(pin absolut),pin(pin relatif terhadap argumenin_baseStateMachine),irqindex: 0-31, indeks untuk src
- in_(src, bit_count)
Geser data masuk dari src ke ISR.
src: salah satu dari:
pins,x,y,null,isr,osrbit_count: jumlah bit yang digeser masuk (1-32)
- out(dest, bit_count)
Geser data keluar dari OSR ke dest.
dest: salah satu dari:
pins,x,y,pindirs,pc,isr,execbit_count: jumlah bit yang digeser keluar (1-32)
- push(...)
Push ISR ke RX FIFO, lalu bersihkan ISR ke nol. Instruksi ini mengambil bentuk-bentuk berikut:
push()
push(block)
push(noblock)
push(iffull)
push(iffull, block)
push(iffull, noblock)
Jika
blockdigunakan maka instruksi berhenti jika RX FIFO penuh. Defaultnya adalah memblokir. Jikaiffulldigunakan maka instruksi hanya push jika jumlah input shift telah mencapai ambang batasnya.- pull(...)
Pull dari TX FIFO ke OSR. Instruksi ini mengambil bentuk-bentuk berikut:
pull()
pull(block)
pull(noblock)
pull(ifempty)
pull(ifempty, block)
pull(ifempty, noblock)
Jika
blockdigunakan maka instruksi berhenti jika TX FIFO kosong. Defaultnya adalah memblokir. Jikaifemptydigunakan maka instruksi hanya pull jika jumlah output shift telah mencapai ambang batasnya.- mov(dest, src)
Pindahkan nilai dari src ke dest.
dest: salah satu dari:
pins,x,y,exec,pc,isr,osrsrc: salah satu dari:
pins,x,y,null,status,isr,osr; argumen ini dapat dimodifikasi secara opsional dengan membungkusnya dalaminvert()ataureverse()(tetapi tidak keduanya sekaligus)
- irq(...)
Set atau bersihkan flag IRQ. Instruksi ini mengambil dua bentuk:
- irq(index)
index: 0-7, atau
rel(0)hinggarel(7)
- irq(mode, index)
mode: salah satu dari:
block,clearindex: 0-7, atau
rel(0)hinggarel(7)
Jika
blockdigunakan maka instruksi berhenti sampai flag dibersihkan oleh entitas lain. Jikacleardigunakan maka flag dibersihkan alih-alih diset. Indeks IRQ relatif menambahkan ID state machine ke indeks IRQ dengan penambahan modulo-4. IRQ 0-3 terlihat dari prosesor, 4-7 bersifat internal untuk state machine.- set(dest, data)
Set dest dengan nilai data.
dest:
pins,x,y,pindirsdata: nilai (0-31)
- nop()
Ini adalah pseudoinstruksi yang dirakit menjadi
mov(y, y)dan tidak memiliki efek samping.- .side(value)
Ini adalah modifier yang dapat diterapkan pada instruksi apa pun, dan digunakan untuk mengontrol nilai pin side-set.
value: nilai (bit) yang akan dikeluarkan pada pin side-set
- .delay(value)
Ini adalah modifier yang dapat diterapkan pada instruksi apa pun, dan menentukan berapa banyak siklus yang harus ditunda setelah instruksi dieksekusi.
value: siklus untuk ditunda, 0-31 (nilai maksimum berkurang jika pin side-set digunakan)
- [value]
Ini adalah modifier dan setara dengan
.delay(value).