class PIO – שימוש מתקדם ב-PIO¶
המחלקה PIO עוטפת את אחד משני בלוקי ה-Programmable I/O (PIO) של ה-RP2040. כל בלוק PIO מכיל זיכרון הוראות (32 הוראות) המשותף לארבע מכונות מצב עצמאיות, בנוסף לממשק FIFO פרטי לכל מכונת מצב ובקר IRQ.
רוב הסקריפטים מתקשרים עם PIO דרך StateMachine – מחלקה זו מיועדת למקרי שימוש מתקדמים הזקוקים ל:
טעינה והסרה של תוכניות באופן מפורש באמצעות
add_program()/remove_program().הזזת בסיס ה-GPIO של ה-PIO ברחבי חלון 32 הפינים של השבב באמצעות
gpio_base().התחברות לדגלי IRQ ברמת הבלוק כולו באמצעות
irq().
להרכבת תוכניות PIO ראו rp2.asm_pio().
Constructors¶
- class rp2.PIO(id: int)¶
מחזיר את אובייקט ה-
PIOהיחיד (singleton) עבור בלוק ה-PIO המזוהה על ידיid. ל-RP2040 יש שני בלוקי PIO, ממוספרים0ו-1. מעלהValueErrorעבור כל id אחר.Methods¶
- gpio_base(base: machine.Pin | int | None = None, /) int¶
מקבל או מגדיר את בסיס ה-GPIO עבור בלוק PIO זה.
ה-PIO של ה-RP2040 רואה חלון של 32 פינים אל מרחב ה-GPIO; החלון יכול להתחיל ב-GPIO0 או ב-GPIO16. הבסיס שולט באיזה חלון פעיל עבור כל מכונות המצב על PIO זה.
ללא ארגומנט, מחזיר את הבסיס הנוכחי (מספר פין ה-GPIO,
0או16).עם ארגומנט, מגדיר את הבסיס. הערך
baseיכול להיות מופע שלmachine.Pinאו מספר פין שלם, וחייב להניב GPIO0 או GPIO16. יש להגדיר את הבסיס לפני שמוסיפים תוכנית כלשהי או בונים מכונת מצב על בלוק PIO זה.
- add_program(program: Callable) None¶
טוען את
programאל זיכרון ההוראות של PIO זה. פריסת הזיכרון המתקבלת משמשת מחדש בכל מכונות המצב על בלוק PIO זה.לכל PIO יש רק 32 הוראות של זיכרון תוכנית המשותף בין כל התוכניות; אם התוכנית החדשה אינה נכנסת, שיטה זו מעלה
OSError(ENOMEM). ניתן לטעון את אותה תוכנית על שני מופעי ה-PIO, אך הם צורכים אזורי זיכרון נפרדים.
- remove_program(program: Callable | None = None, /) None¶
מסיר את
programמזיכרון ההוראות של PIO זה, ומפנה מקום עבור תוכניות חדשות. אםprogramמושמט, כל תוכנית הטעונה כעת על PIO זה מוסרת.הסרת תוכנית שלא נטענה אינה מבצעת דבר (אין חריגה).
- state_machine(id: int, program: Callable | None = None, *args, **kwargs) StateMachine¶
מחזיר אחד מארבעת מופעי ה-
StateMachineשבבעלות בלוק PIO זה. הערךidהוא אינדקס מכונת המצב המקומי (0–3).אם
programמסופק, מכונת המצב מוגדרת להריץ אותו – כל הארגומנטים המיקומיים/בעלי המילות מפתח מועברים אלStateMachine.init().Example:
>>> rp2.PIO(1).state_machine(3) StateMachine(7)
מזהה מכונת המצב הגלובלי של האובייקט המוחזר הוא
pio_id * 4 + sm_id.
- irq(handler: Callable[[PIO], None] | None = None, trigger: int = IRQ_SM0 | IRQ_SM1 | IRQ_SM2 | IRQ_SM3, hard: bool = False) Callable¶
מקבל או מגדיר את ה-IRQ ברמת הבלוק עבור PIO זה.
הערך
handlerהוא פונקציית ה-callback שתופעל כאשר אחד מ-IRQ-ים המבוקשים של מכונת המצב ננעל. ה-handler מקבל מופעPIOזה כארגומנט היחיד שלו; בתוך ה-handler ניתן לזהות את מכונות המצב המפעילות באמצעותself.irq().flags()עם AND מול קבועיIRQ_SM*.הערך
triggerהוא מסכת ביטים של אחד או יותר מ-IRQ_SM0..IRQ_SM3. ברירת המחדל מפעילה על כל מכונת מצב.hard=Trueרושם handler של פסיקה קשיחה (ללא הקצאת heap בתוך ה-callback).MicroPython מקצה את IRQ 0 על כל בלוק PIO; IRQ 1 שמור ואינו נגיש מ-Python.
Constants¶
- IN_LOW: int¶
מועבר אל
out_init/set_init/sideset_initשלasm_pio()כך שהפין מתחיל כקלט המונע למצב נמוך (כלומר tristate כאשר חוצץ הפלט מחזיק 0).
- IN_HIGH: int¶
מועבר אל
out_init/set_init/sideset_initשלasm_pio()כך שהפין מתחיל כקלט כאשר חוצץ הפלט מחזיק 1.
- OUT_LOW: int¶
מועבר אל
out_init/set_init/sideset_initשלasm_pio()כך שהפין מתחיל כפלט מונע ברמה לוגית 0.
- OUT_HIGH: int¶
מועבר אל
out_init/set_init/sideset_initשלasm_pio()כך שהפין מתחיל כפלט מונע ברמה לוגית 1.
- SHIFT_LEFT: int¶
מועבר אל
in_shiftdir/out_shiftdirשלasm_pio()אוStateMachine.init()כך שההזזות מזיזות ביטים לכיוון ה-MSB.
- SHIFT_RIGHT: int¶
מועבר אל
in_shiftdir/out_shiftdirשלasm_pio()אוStateMachine.init()כך שההזזות מזיזות ביטים לכיוון ה-LSB.
- JOIN_NONE: int¶
מועבר אל
fifo_joinשלasm_pio()כך שלמכונת המצב יש FIFO-ים נפרדים של TX ו-RX בני 4 מילים (ברירת המחדל).
- JOIN_TX: int¶
מועבר אל
fifo_joinשלasm_pio()כך ש-FIFO ה-TX מוכפל ל-8 מילים על ידי בליעת FIFO ה-RX. מכונת המצב אינה יכולה עוד לקבל נתונים.