class StateMachine – גישה לממשק ה-I/O הניתן לתכנות של ה-RP2040

המחלקה StateMachine מספקת גישה לממשק ה-PIO (programmable I/O) של ה-RP2040.

להרכבת תוכניות PIO, ראו rp2.asm_pio().

Constructors

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 או דחיפה חוזרת מותנית.

  • pull_thresh הוא הסף בביטים לפני שמופעל auto-pull או משיכה חוזרת מותנית.

הערה: פינים המשמשים עבור in_base צריכים להיות מוגדרים ידנית לקלט (או אחרת) כך שה-PIO יוכל לראות את האות הרצוי (הם יכולים להיות פיני קלט, פיני פלט, או מחוברים להתקן היקפי אחר). ניתן להגדיר גם את jmp_pin ידנית, אך כברירת מחדל הוא יהיה פין קלט.

active(value: bool | int | None = None, /) bool

מקבל או מגדיר האם מכונת המצב פועלת כעת.

>>> sm.active()
True
>>> sm.active(0)
False
restart() None

מאתחל מחדש את מכונת המצב וקופץ לתחילת התוכנית.

שיטה זו מנקה את המצב הפנימי של מכונת המצב באמצעות האוגר (register) 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

מושך מילה מ-FIFO ה-RX של מכונת המצב.

אם ה-FIFO ריק, הוא חוסם עד שנתונים מגיעים (כלומר מכונת המצב דוחפת מילה).

הערך מוזז ימינה ב-shift ביטים לפני ההחזרה, כלומר הערך המוחזר הוא word >> shift.

put(value: 'int | bytes | bytearray | array', shift: int = 0) None

דוחף מילים אל FIFO ה-TX של מכונת המצב.

value יכול להיות מספר שלם, מערך מסוג B, H או I, או bytearray.

שיטה זו תחסום עד שכל המילים נכתבו אל ה-FIFO. אם ה-FIFO מלא, או הופך למלא, השיטה תחסום עד שמכונת המצב מושכת מספיק מילים כדי להשלים את הכתיבה.

כל מילה מוזזת תחילה שמאלה ב-shift ביטים, כלומר מכונת המצב מקבלת word << shift.

rx_fifo() int

מחזיר את מספר המילים ב-FIFO ה-RX של מכונת המצב. ערך 0 מציין שה-FIFO ריק.

שימושי לבדיקה אם נתונים ממתינים לקריאה, לפני קריאה ל-StateMachine.get().

tx_fifo() int

מחזיר את מספר המילים ב-FIFO ה-TX של מכונת המצב. ערך 0 מציין שה-FIFO ריק.

שימושי לבדיקה אם יש מקום לדחוף מילה נוספת באמצעות StateMachine.put().

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

מחזיר את אובייקט ה-IRQ עבור ה-StateMachine הנתון.

אפשרות להגדיר אותו.

Buffer protocol

המחלקה StateMachine תומכת ב-buffer protocol, ומאפשרת גישה ישירה ל-FIFO-ים של השידור והקבלה עבור כל מכונת מצב. זאת בעיקר כדי לאפשר העברת אובייקטי StateMachine ישירות כפרמטרי הקריאה או הכתיבה בעת הגדרת ערוץ rp2.DMA().