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().