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().
Buffer protocol¶
המחלקה StateMachine תומכת ב-buffer protocol, ומאפשרת גישה ישירה ל-FIFO-ים של השידור והקבלה עבור כל מכונת מצב. זאת בעיקר כדי לאפשר העברת אובייקטי StateMachine ישירות כפרמטרי הקריאה או הכתיבה בעת הגדרת ערוץ rp2.DMA().