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 decrement

    • x_not_y: เป็นจริงหาก X ไม่เท่ากับ Y

    • pin: เป็นจริงหากพินอินพุตถูกตั้งค่า

    • not_osre: เป็นจริงหาก OSR ไม่ว่าง (ยังไม่ถึงค่าขีดแบ่ง)

  • label: label ที่จะกระโดดไปหากเงื่อนไขเป็นจริง

wait(polarity, src, index)

หยุดรอ high/low บนพินหรือสาย IRQ

  • polarity: 0 หรือ 1 เพื่อระบุว่าจะรอค่า low หรือ high

  • src: หนึ่งใน: gpio (พินแบบ absolute), pin (พินเทียบกับ argument in_base ของ StateMachine), irq

  • index: 0-31 คือดัชนีสำหรับ src

in_(src, bit_count)

เลื่อนข้อมูลเข้าจาก src ไปยัง ISR

  • src: หนึ่งใน: pins, x, y, null, isr, osr

  • bit_count: จำนวนบิตที่จะเลื่อนเข้า (1-32)

out(dest, bit_count)

เลื่อนข้อมูลออกจาก OSR ไปยัง dest

  • dest: หนึ่งใน: pins, x, y, pindirs, pc, isr, exec

  • bit_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, osr

  • src: หนึ่งใน: 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, clear

  • index: 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, pindirs

  • data: ค่า (0-31)

nop()

นี่คือ pseudoinstruction ที่แอสเซมบลีเป็น mov(y, y) และไม่มีผลข้างเคียง

.side(value)

นี่คือตัวปรับแต่งที่สามารถใช้กับคำสั่งใดก็ได้ และใช้เพื่อควบคุมค่าพิน side-set

  • value: ค่า (บิต) ที่จะส่งออกบนพิน side-set

.delay(value)

นี่คือตัวปรับแต่งที่สามารถใช้กับคำสั่งใดก็ได้ และระบุจำนวนรอบที่จะหน่วงเวลาหลังจากคำสั่งทำงาน

  • value: รอบที่จะหน่วงเวลา 0-31 (ค่าสูงสุดจะลดลงหากมีการใช้พิน side-set)

[value]

นี่คือตัวปรับแต่งที่เทียบเท่ากับ .delay(value)

คลาส