คลาส PIO -- การใช้งาน PIO ขั้นสูง¶
คลาส PIO ห่อหุ้มหนึ่งในสองบล็อก Programmable I/O (PIO) ของ RP2040 แต่ละบล็อก PIO ประกอบด้วยหน่วยความจำคำสั่ง (32 คำสั่ง) ที่ใช้ร่วมกันโดยสเตทแมชชีนอิสระสี่ตัว พร้อมด้วยอินเทอร์เฟซ FIFO ส่วนตัวไปยังแต่ละสเตทแมชชีนและตัวควบคุม IRQ
สคริปต์ส่วนใหญ่โต้ตอบกับ PIO ผ่าน StateMachine -- คลาสนี้สำหรับกรณีการใช้งานขั้นสูงที่ต้องการ:
โหลดและลบโปรแกรมอย่างชัดเจนผ่าน
add_program()/remove_program()ย้ายฐาน GPIO ของ PIO ข้ามหน้าต่าง 32 พินของชิปผ่าน
gpio_base()เชื่อมต่อกับแฟล็ก IRQ ระดับบล็อกผ่าน
irq()
สำหรับการแอสเซมเบิลโปรแกรม PIO ดูที่ rp2.asm_pio()
ตัวสร้าง¶
- class rp2.PIO(id: int)¶
คืนค่าอ็อบเจกต์
PIOแบบซิงเกิลตันสำหรับบล็อก PIO ที่ระบุโดยidRP2040 มีสองบล็อก PIO หมายเลข0และ1ยกValueErrorสำหรับ id อื่นใดเมธอด¶
- gpio_base(base: machine.Pin | int | None = None, /) int¶
รับหรือตั้งค่าฐาน GPIO สำหรับบล็อก PIO นี้
RP2040 PIO มองเห็นหน้าต่าง 32 พินในพื้นที่ GPIO หน้าต่างสามารถเริ่มต้นที่ GPIO0 หรือ GPIO16 ฐานควบคุมว่าหน้าต่างใดมีผลสำหรับสเตทแมชชีนทั้งหมดบน PIO นี้
หากไม่มีอาร์กิวเมนต์ คืนค่าฐานปัจจุบัน (หมายเลขพิน GPIO
0หรือ16)หากมีอาร์กิวเมนต์ ตั้งค่าฐาน
baseอาจเป็นอินสแตนซ์machine.Pinหรือหมายเลขพินจำนวนเต็ม และต้องแก้ไขเป็น GPIO0 หรือ GPIO16 ต้องตั้งค่าฐาน ก่อน ที่จะเพิ่มโปรแกรมหรือสร้างสเตทแมชชีนบนบล็อก PIO นี้
- add_program(program: Callable) None¶
โหลด
programเข้าสู่หน่วยความจำคำสั่งของ PIO นี้ เลย์เอาต์หน่วยความจำที่ได้จะถูกนำกลับมาใช้ใหม่ในสเตทแมชชีนทั้งหมดบนบล็อก PIO นี้PIO แต่ละตัวมีหน่วยความจำโปรแกรมเพียง 32 คำสั่งที่ใช้ร่วมกันทั่วทุกโปรแกรม หากโปรแกรมใหม่ไม่พอดี เมธอดนี้จะยก
OSError(ENOMEM)โปรแกรมเดียวกันสามารถโหลดลงบน PIO ทั้งสองอินสแตนซ์ได้ แต่จะใช้บริเวณหน่วยความจำแยกกัน
- remove_program(program: Callable | None = None, /) None¶
ลบ
programออกจากหน่วยความจำคำสั่งของ PIO นี้ เพื่อเพิ่มพื้นที่สำหรับโปรแกรมใหม่ หากละเว้นprogramจะลบทุกโปรแกรมที่โหลดอยู่บน PIO นี้การลบโปรแกรมที่ไม่ได้โหลดจะไม่มีผล (ไม่มีข้อยกเว้น)
- state_machine(id: int, program: Callable | None = None, *args, **kwargs) StateMachine¶
คืนค่าหนึ่งในสี่อินสแตนซ์
StateMachineที่เป็นของบล็อก PIO นี้idคือดัชนีสเตทแมชชีนท้องถิ่น (0--3)หากให้
programสเตทแมชชีนจะถูกกำหนดค่าให้รันโปรแกรมนั้น -- อาร์กิวเมนต์แบบตำแหน่ง/คีย์เวิร์ดทั้งหมดจะถูกส่งต่อไปยังStateMachine.init()ตัวอย่าง:
>>> rp2.PIO(1).state_machine(3) StateMachine(7)
ID สเตทแมชชีนส่วนกลางของอ็อบเจกต์ที่คืนค่าคือ
pio_id * 4 + sm_id
- irq(handler: Callable[[PIO], None] | None = None, trigger: int = IRQ_SM0 | IRQ_SM1 | IRQ_SM2 | IRQ_SM3, hard: bool = False) Callable¶
รับหรือกำหนดค่า IRQ ระดับบล็อกสำหรับ PIO นี้
handlerคือคอลแบ็กที่จะเรียกใช้เมื่อ IRQ ของสเตทแมชชีนที่ร้องขอใดๆ ลัตช์ ตัวจัดการรับอินสแตนซ์PIOนี้เป็นอาร์กิวเมนต์เดียว ภายในตัวจัดการสเตทแมชชีนที่เริ่มทำงานสามารถระบุได้ผ่านself.irq().flags()AND กับค่าคงที่IRQ_SM*triggerคือบิตมาสก์ของหนึ่งหรือมากกว่าIRQ_SM0..IRQ_SM3ค่าเริ่มต้นจะเรียกใช้กับสเตทแมชชีนใดก็ได้hard=Trueลงทะเบียนตัวจัดการอินเทอร์รัปต์แบบฮาร์ด (ไม่มีการจัดสรรฮีปในคอลแบ็ก)MicroPython ผูก IRQ 0 บนแต่ละบล็อก PIO IRQ 1 สงวนไว้และไม่สามารถเข้าถึงได้จาก Python
ค่าคงที่¶
- IN_LOW: int¶
ส่งไปยัง
out_init/set_init/sideset_initของasm_pio()เพื่อให้พินเริ่มเป็นอินพุตที่ขับค่าต่ำ (เช่น tristate โดยบัฟเฟอร์เอาต์พุตถือ 0)
- IN_HIGH: int¶
ส่งไปยัง
out_init/set_init/sideset_initของasm_pio()เพื่อให้พินเริ่มเป็นอินพุตโดยบัฟเฟอร์เอาต์พุตถือ 1
- OUT_LOW: int¶
ส่งไปยัง
out_init/set_init/sideset_initของasm_pio()เพื่อให้พินเริ่มเป็นเอาต์พุตที่ขับที่ลอจิก 0
- OUT_HIGH: int¶
ส่งไปยัง
out_init/set_init/sideset_initของasm_pio()เพื่อให้พินเริ่มเป็นเอาต์พุตที่ขับที่ลอจิก 1
- SHIFT_LEFT: int¶
ส่งไปยัง
in_shiftdir/out_shiftdirของasm_pio()หรือStateMachine.init()เพื่อให้การเลื่อนบิตเคลื่อนที่ไปทาง MSB
- SHIFT_RIGHT: int¶
ส่งไปยัง
in_shiftdir/out_shiftdirของasm_pio()หรือStateMachine.init()เพื่อให้การเลื่อนบิตเคลื่อนที่ไปทาง LSB
- JOIN_NONE: int¶
ส่งไปยัง
fifo_joinของasm_pio()เพื่อให้สเตทแมชชีนมี TX FIFO และ RX FIFO ขนาด 4 คำแยกกัน (ค่าเริ่มต้น)
- JOIN_TX: int¶
ส่งไปยัง
fifo_joinของasm_pio()เพื่อให้ TX FIFO ขยายเป็น 8 คำโดยดูดซับ RX FIFO สเตทแมชชีนจะไม่สามารถรับข้อมูลได้อีกต่อไป