คลาส 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()หรือไม่
โปรโตคอลบัฟเฟอร์¶
The StateMachine class supports the buffer protocol, allowing direct access to the transmit
and receive FIFOs for each state machine. This is primarily in order to allow StateMachine
objects to be passed directly as the read or write parameters when configuring a rp2.DMA()
channel.