rp2 --- ฟังก์ชันเฉพาะสำหรับ RP2040¶
โมดูล rp2 ประกอบด้วยฟังก์ชันและคลาสที่ใช้เฉพาะกับ RP2040 ตามที่ใช้ใน Raspberry Pi Pico
ดูข้อมูลเพิ่มเติมได้ที่ RP2040 Python datasheet และดูโค้ดตัวอย่างได้ที่ pico-micropython-examples
คำสั่งภาษาแอสเซมบลี PIO¶
PIO state machine ถูกเขียนโปรแกรมด้วยภาษาแอสเซมบลีเฉพาะที่มีคำสั่งหลักเก้าคำสั่งสำหรับ PIO machine ใน MicroPython รูทีนแอสเซมบลี PIO จะเขียนเป็นฟังก์ชัน Python ที่มีตัวตกแต่ง @rp2.asm_pio() และใช้ไวยากรณ์ Python รูทีนเหล่านี้รองรับตัวแปรและการคำนวณ Python มาตรฐาน รวมถึงฟังก์ชันพิเศษต่อไปนี้ที่เข้ารหัสคำสั่ง PIO และควบคุมแอสเซมเบลอร์ ดูรายละเอียดเพิ่มเติมได้ในส่วนที่ 3.4 ของ RP2040 datasheet
- wrap_target()
ระบุตำแหน่งที่การทำงานจะต่อเนื่องหลังจากการ wrap ของโปรแกรม ค่าเริ่มต้นคือจุดเริ่มต้นของรูทีน PIO
- wrap()
ระบุตำแหน่งที่โปรแกรมสิ้นสุดและวน wrap กลับ หากไม่ได้ใช้คำสั่งนี้ จะถูกเพิ่มโดยอัตโนมัติที่ท้ายรูทีน PIO การ wrap ไม่ใช้รอบการทำงานใดๆ
- label(label)
กำหนด label ชื่อ label ที่ตำแหน่งปัจจุบัน label สามารถเป็น string หรือ integer
- word(instr, label=None)
แทรก 16-bit word ตามต้องการในเอาต์พุตที่แอสเซมบลีแล้ว
instr: ค่า 16 บิต
label: หากระบุ จะค้นหา label แล้วนำค่าของ label มา OR แบบตรรกะกับ instr
- jmp(...)
คำสั่งนี้มีสองรูปแบบ:
- jmp(label)
label: label ที่จะกระโดดไปโดยไม่มีเงื่อนไข
- jmp(cond, label)
cond: เงื่อนไขที่จะตรวจสอบ ได้แก่:
not_x,not_y: เป็นจริงหาก register เป็นศูนย์x_dec,y_dec: เป็นจริงหาก register ไม่ใช่ศูนย์ และทำการ post decrementx_not_y: เป็นจริงหาก X ไม่เท่ากับ Ypin: เป็นจริงหากพินอินพุตถูกตั้งค่าnot_osre: เป็นจริงหาก OSR ไม่ว่าง (ยังไม่ถึงค่าขีดแบ่ง)
label: label ที่จะกระโดดไปหากเงื่อนไขเป็นจริง
- wait(polarity, src, index)
หยุดรอ high/low บนพินหรือสาย IRQ
polarity: 0 หรือ 1 เพื่อระบุว่าจะรอค่า low หรือ high
src: หนึ่งใน:
gpio(พินแบบ absolute),pin(พินเทียบกับ argumentin_baseของ StateMachine),irqindex: 0-31 คือดัชนีสำหรับ src
- in_(src, bit_count)
เลื่อนข้อมูลเข้าจาก src ไปยัง ISR
src: หนึ่งใน:
pins,x,y,null,isr,osrbit_count: จำนวนบิตที่จะเลื่อนเข้า (1-32)
- out(dest, bit_count)
เลื่อนข้อมูลออกจาก OSR ไปยัง dest
dest: หนึ่งใน:
pins,x,y,pindirs,pc,isr,execbit_count: จำนวนบิตที่จะเลื่อนออก (1-32)
- push(...)
ส่ง ISR ไปยัง RX FIFO จากนั้นล้าง ISR เป็นศูนย์ คำสั่งนี้มีรูปแบบดังนี้:
push()
push(block)
push(noblock)
push(iffull)
push(iffull, block)
push(iffull, noblock)
หาก
blockถูกใช้ คำสั่งจะหยุดรอหาก RX FIFO เต็ม ค่าเริ่มต้นคือ block หากiffullถูกใช้ จะส่งข้อมูลเฉพาะเมื่อจำนวนบิตที่เลื่อนเข้าถึงค่าขีดแบ่งแล้ว- pull(...)
ดึงข้อมูลจาก TX FIFO เข้าสู่ OSR คำสั่งนี้มีรูปแบบดังนี้:
pull()
pull(block)
pull(noblock)
pull(ifempty)
pull(ifempty, block)
pull(ifempty, noblock)
หาก
blockถูกใช้ คำสั่งจะหยุดรอหาก TX FIFO ว่าง ค่าเริ่มต้นคือ block หากifemptyถูกใช้ จะดึงข้อมูลเฉพาะเมื่อจำนวนบิตที่เลื่อนออกถึงค่าขีดแบ่งแล้ว- mov(dest, src)
ย้ายค่าจาก src ไปยัง dest
dest: หนึ่งใน:
pins,x,y,exec,pc,isr,osrsrc: หนึ่งใน:
pins,x,y,null,status,isr,osr; argument นี้สามารถปรับแต่งได้โดยครอบด้วยinvert()หรือreverse()(แต่ไม่ใช้ทั้งสองพร้อมกัน)
- irq(...)
ตั้งค่าหรือล้างแฟล็ก IRQ คำสั่งนี้มีสองรูปแบบ:
- irq(index)
index: 0-7 หรือ
rel(0)ถึงrel(7)
- irq(mode, index)
mode: หนึ่งใน:
block,clearindex: 0-7 หรือ
rel(0)ถึงrel(7)
หาก
blockถูกใช้ คำสั่งจะหยุดรอจนกว่าแฟล็กจะถูกล้างโดย entity อื่น หากclearถูกใช้ แฟล็กจะถูกล้างแทนที่จะถูกตั้ง ดัชนี IRQ แบบสัมพัทธ์จะบวก ID ของ state machine เข้ากับดัชนี IRQ ด้วยการบวกแบบ modulo-4 IRQ 0-3 มองเห็นได้จากโปรเซสเซอร์ ส่วน 4-7 เป็น internal ของ state machine- set(dest, data)
ตั้งค่า dest ด้วยค่า data
dest:
pins,x,y,pindirsdata: ค่า (0-31)
- nop()
นี่คือ pseudoinstruction ที่แอสเซมบลีเป็น
mov(y, y)และไม่มีผลข้างเคียง- .side(value)
นี่คือตัวปรับแต่งที่สามารถใช้กับคำสั่งใดก็ได้ และใช้เพื่อควบคุมค่าพิน side-set
value: ค่า (บิต) ที่จะส่งออกบนพิน side-set
- .delay(value)
นี่คือตัวปรับแต่งที่สามารถใช้กับคำสั่งใดก็ได้ และระบุจำนวนรอบที่จะหน่วงเวลาหลังจากคำสั่งทำงาน
value: รอบที่จะหน่วงเวลา 0-31 (ค่าสูงสุดจะลดลงหากมีการใช้พิน side-set)
- [value]
นี่คือตัวปรับแต่งที่เทียบเท่ากับ
.delay(value)