คลาส StateMachine -- การเข้าถึงอินเทอร์เฟซ I/O แบบโปรแกรมได้ของ RP2040¶
คลาส StateMachine ให้การเข้าถึงอินเทอร์เฟซ PIO (programmable I/O) ของ RP2040
สำหรับการแอสเซมเบิลโปรแกรม PIO ดูที่ rp2.asm_pio()
ตัวสร้าง¶
- class rp2.StateMachine(id: int, program: Callable | None = None, *args, **kwargs)¶
รับสเตทแมชชีนหมายเลข id RP2040 มีสอง PIO อินสแตนซ์ที่เหมือนกัน แต่ละตัวมีสเตทแมชชีน 4 ตัว: ดังนั้นจึงมีสเตทแมชชีนทั้งหมด 8 ตัว หมายเลข 0 ถึง 7
สามารถเลือกเริ่มต้นด้วยโปรแกรม program ที่ให้ไว้ได้: ดู
StateMachine.init- init(program: Callable, freq: int = -1, *, in_base: machine.Pin | None = None, out_base: machine.Pin | None = None, set_base: machine.Pin | None = None, jmp_pin: machine.Pin | None = None, sideset_base: machine.Pin | None = None, in_shiftdir: int | None = None, out_shiftdir: int | None = None, push_thresh: int | None = None, pull_thresh: int | None = None) None¶
กำหนดค่าอินสแตนซ์สเตทแมชชีนให้รันโปรแกรม program ที่ให้ไว้
โปรแกรมจะถูกเพิ่มเข้าสู่หน่วยความจำคำสั่งของ PIO อินสแตนซ์นี้ หากหน่วยความจำคำสั่งมีโปรแกรมนี้อยู่แล้ว ออฟเซ็ตของมันจะถูกนำกลับมาใช้เพื่อประหยัดหน่วยความจำคำสั่ง
freq คือความถี่ในหน่วย Hz ที่จะรันสเตทแมชชีน ค่าเริ่มต้นคือความถี่นาฬิการะบบ
ตัวหารนาฬิกาคำนวณเป็น
system clock frequency / freqดังนั้นอาจมีข้อผิดพลาดการปัดเศษเล็กน้อยตัวหารนาฬิกาขั้นต่ำที่เป็นไปได้คือหนึ่งส่วน 65536 ของนาฬิการะบบ: ดังนั้นที่ความถี่นาฬิการะบบเริ่มต้น 125MHz ค่าต่ำสุดของ freq คือ
1908เพื่อรันสเตทแมชชีนที่ความถี่ต่ำกว่า คุณต้องลดความเร็วนาฬิการะบบด้วยmachine.freq()in_base คือพินแรกที่จะใช้สำหรับคำสั่ง
in()out_base คือพินแรกที่จะใช้สำหรับคำสั่ง
out()set_base คือพินแรกที่จะใช้สำหรับคำสั่ง
set()jmp_pin คือพินแรกที่จะใช้สำหรับคำสั่ง
jmp(pin, ...)sideset_base คือพินแรกที่จะใช้สำหรับ side-setting
in_shiftdir คือทิศทางที่ ISR จะเลื่อน ไม่ว่าจะเป็น
PIO.SHIFT_LEFTหรือPIO.SHIFT_RIGHTout_shiftdir คือทิศทางที่ OSR จะเลื่อน ไม่ว่าจะเป็น
PIO.SHIFT_LEFTหรือPIO.SHIFT_RIGHTpush_thresh คือค่าขีดแบ่งในหน่วยบิตก่อนที่ auto-push หรือการ re-pushing แบบมีเงื่อนไขจะถูกเรียกใช้
pull_thresh คือค่าขีดแบ่งในหน่วยบิตก่อนที่ auto-pull หรือการ re-pulling แบบมีเงื่อนไขจะถูกเรียกใช้
หมายเหตุ: พินที่ใช้สำหรับ in_base ต้องได้รับการกำหนดค่าด้วยตนเองสำหรับอินพุต (หรืออื่นๆ) เพื่อให้ PIO สามารถมองเห็นสัญญาณที่ต้องการได้ (อาจเป็นพินอินพุต พินเอาต์พุต หรือเชื่อมต่อกับอุปกรณ์ต่อพ่วงอื่น) jmp_pin ก็สามารถกำหนดค่าด้วยตนเองได้เช่นกัน แต่โดยค่าเริ่มต้นจะเป็นพินอินพุต
- active(value: bool | int | None = None, /) bool¶
รับหรือตั้งค่าว่าสเตทแมชชีนกำลังทำงานอยู่หรือไม่
>>> sm.active() True >>> sm.active(0) False
- restart() None¶
รีสตาร์ทสเตทแมชชีนและกลับไปยังจุดเริ่มต้นของโปรแกรม
เมธอดนี้ล้างสถานะภายในของสเตทแมชชีนโดยใช้รีจิสเตอร์
SM_RESTARTของ RP2040 ซึ่งรวมถึง:ตัวนับการเลื่อนอินพุตและเอาต์พุต
เนื้อหาของรีจิสเตอร์เลื่อนอินพุต
ตัวนับดีเลย์
สถานะการรอ-IRQ
คำสั่งที่หยุดชะงักขณะรันโดยใช้
StateMachine.exec()
- exec(instr: str | int) None¶
รันคำสั่ง PIO เดียว
หาก instr เป็นสตริง จะใช้
asm_pio_encodeเพื่อเข้ารหัสคำสั่งจากสตริงที่ให้ไว้>>> sm.exec("set(0, 1)")หาก instr เป็นจำนวนเต็ม จะถูกถือว่าเป็นคำสั่งโค้ดเครื่อง PIO ที่เข้ารหัสแล้วเพื่อรัน
>>> sm.exec(rp2.asm_pio_encode("out(y, 8)", 0))
- get(buf: 'bytearray | array | None' = None, shift: int = 0) int¶
ดึงคำออกจาก RX FIFO ของสเตทแมชชีน
หาก FIFO ว่าง จะบล็อกจนกว่าข้อมูลจะมาถึง (เช่น สเตทแมชชีนส่งคำ)
ค่าจะถูกเลื่อนขวาด้วย shift บิตก่อนส่งคืน กล่าวคือค่าที่ส่งคืนคือ
word >> shift
- put(value: 'int | bytes | bytearray | array', shift: int = 0) None¶
ส่งคำไปยัง TX FIFO ของสเตทแมชชีน
value สามารถเป็นจำนวนเต็ม อาร์เรย์ประเภท
B,HหรือIหรือbytearrayเมธอดนี้จะบล็อกจนกว่าคำทั้งหมดจะถูกเขียนลงใน FIFO หาก FIFO เต็มหรือกลายเป็นเต็ม เมธอดจะบล็อกจนกว่าสเตทแมชชีนจะดึงคำมากพอเพื่อให้การเขียนสมบูรณ์
แต่ละคำจะถูกเลื่อนซ้ายด้วย shift บิตก่อน กล่าวคือสเตทแมชชีนรับ
word << shift
- rx_fifo() int¶
คืนค่าจำนวนคำใน RX FIFO ของสเตทแมชชีน ค่า 0 หมายความว่า FIFO ว่าง
มีประโยชน์สำหรับการตรวจสอบว่ามีข้อมูลรอการอ่านหรือไม่ ก่อนเรียก
StateMachine.get()
- tx_fifo() int¶
คืนค่าจำนวนคำใน TX FIFO ของสเตทแมชชีน ค่า 0 หมายความว่า FIFO ว่าง
มีประโยชน์สำหรับการตรวจสอบว่ามีพื้นที่สำหรับส่งคำอื่นโดยใช้
StateMachine.put()หรือไม่
โปรโตคอลบัฟเฟอร์¶
คลาส StateMachine รองรับ buffer protocol ซึ่งช่วยให้เข้าถึง FIFO รับและส่งของแต่ละ state machine ได้โดยตรงสิ่งนี้มีไว้เพื่อให้สามารถส่งออบเจกต์ StateMachine โดยตรงเป็นพารามิเตอร์การอ่านหรือเขียนเมื่อกำหนดค่าช่อง rp2.DMA()