คลาส 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_RIGHT

  • out_shiftdir คือทิศทางที่ OSR จะเลื่อน ไม่ว่าจะเป็น PIO.SHIFT_LEFT หรือ PIO.SHIFT_RIGHT

  • push_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() หรือไม่

irq(handler: Callable[[StateMachine], None] | None = None, trigger: int = 0 | 1, hard: bool = False) Callable

คืนค่าอ็อบเจกต์ IRQ สำหรับ StateMachine ที่ให้ไว้

สามารถกำหนดค่าได้ตามต้องการ

โปรโตคอลบัฟเฟอร์

คลาส StateMachine รองรับ buffer protocol ซึ่งช่วยให้เข้าถึง FIFO รับและส่งของแต่ละ state machine ได้โดยตรงสิ่งนี้มีไว้เพื่อให้สามารถส่งออบเจกต์ StateMachine โดยตรงเป็นพารามิเตอร์การอ่านหรือเขียนเมื่อกำหนดค่าช่อง rp2.DMA()