rp2 — פונקציונליות ייעודית ל-RP2040¶
המודול rp2 מכיל פונקציות ומחלקות ייעודיות ל-RP2040, כפי שהוא משמש ב-Raspberry Pi Pico.
ראו את דף הנתונים RP2040 Python למידע נוסף, ואת pico-micropython-examples לדוגמאות קוד.
הוראות בשפת אסמבלי של PIO¶
מכונות המצב של PIO מתוכנתות בשפת אסמבלי ייעודית עם תשע הוראות ליבה של מכונת PIO. ב-MicroPython, שגרות אסמבלי של PIO נכתבות כפונקציית Python עם המעטר @rp2.asm_pio(), והן משתמשות בתחביר Python. שגרות כאלה תומכות במשתני Python ובחשבון סטנדרטיים, וכן בפונקציות המותאמות הבאות שמקודדות הוראות PIO ומכוונות את המַרכֵּיב. ראו את סעיף 3.4 של דף הנתונים של RP2040 לפרטים נוספים.
- wrap_target()
ציין את המיקום שבו ההרצה ממשיכה לאחר גלישת התוכנית. כברירת מחדל זוהי תחילת שגרת ה-PIO.
- wrap()
ציין את המיקום שבו התוכנית מסתיימת וגולשת חזרה. אם הוראה זו אינה בשימוש, היא מתווספת אוטומטית בסוף שגרת ה-PIO. גלישה אינה עולה מחזורי הרצה כלשהם.
- label(label)
הגדר תווית בשם label במיקום הנוכחי. label יכול להיות מחרוזת או מספר שלם.
- word(instr, label=None)
הכנס מילה שרירותית בת 16 ביט בפלט המורכב.
instr: הערך בן 16 הביט
label: אם ניתן, חפש את התווית ובצע logical-or בין ערך התווית לבין instr
- jmp(…)
להוראה זו יש שתי צורות:
- jmp(label)
label: התווית שאליה יש לקפוץ ללא תנאי
- jmp(cond, label)
cond: התנאי שיש לבדוק, אחד מ:
not_x,not_y: אמת אם האוגר (register) שווה אפסx_dec,y_dec: אמת אם האוגר (register) שונה מאפס, ובצע הפחתה (decrement) לאחר מכןx_not_y: אמת אם X אינו שווה ל-Ypin: אמת אם פין הקלט מוגדרnot_osre: אמת אם ה-OSR אינו ריק (לא הגיע לסף שלו)
label: התווית שאליה יש לקפוץ אם התנאי אמת
- wait(polarity, src, index)
חסום, בהמתנה למצב גבוה/נמוך בפין או בקו IRQ.
polarity: 0 או 1, האם להמתין לערך נמוך או גבוה
src: אחד מ:
gpio(פין מוחלט),pin(פין יחסי לארגומנטin_baseשל ה-StateMachine),irqindex: 0-31, האינדקס עבור src
- in_(src, bit_count)
הזז נתונים פנימה מ-src אל ה-ISR.
src: אחד מ:
pins,x,y,null,isr,osrbit_count: מספר הביטים להזזה פנימה (1-32)
- out(dest, bit_count)
הזז נתונים החוצה מה-OSR אל dest.
dest: אחד מ:
pins,x,y,pindirs,pc,isr,execbit_count: מספר הביטים להזזה החוצה (1-32)
- push(…)
דחוף את ה-ISR אל RX FIFO, ולאחר מכן אפס את ה-ISR לאפס. להוראה זו יש את הצורות הבאות:
push()
push(block)
push(noblock)
push(iffull)
push(iffull, block)
push(iffull, noblock)
אם משתמשים ב-
blockההוראה נעצרת אם ה-RX FIFO מלא. ברירת המחדל היא לחסום. אם משתמשים ב-iffull, היא דוחפת רק אם מונה ההזזה של הקלט הגיע לסף שלו.- pull(…)
משוך מ-TX FIFO אל ה-OSR. להוראה זו יש את הצורות הבאות:
pull()
pull(block)
pull(noblock)
pull(ifempty)
pull(ifempty, block)
pull(ifempty, noblock)
אם משתמשים ב-
blockההוראה נעצרת אם ה-TX FIFO ריק. ברירת המחדל היא לחסום. אם משתמשים ב-ifempty, היא מושכת רק אם מונה ההזזה של הפלט הגיע לסף שלו.- mov(dest, src)
העבר אל dest את הערך מ-src.
dest: אחד מ:
pins,x,y,exec,pc,isr,osrsrc: אחד מ:
pins,x,y,null,status,isr,osr; ניתן לשנות ארגומנט זה באופן אופציונלי על ידי עטיפתו ב-invert()או ב-reverse()(אך לא בשניהם יחד)
- irq(…)
הגדר או נקה דגל IRQ. להוראה זו יש שתי צורות:
- irq(index)
index: 0-7, או
rel(0)עדrel(7)
- irq(mode, index)
mode: אחד מ:
block,clearindex: 0-7, או
rel(0)עדrel(7)
אם משתמשים ב-
blockההוראה נעצרת עד שהדגל ינוקה על ידי גורם אחר. אם משתמשים ב-clearהדגל מנוקה במקום להיות מוגדר. אינדקסי IRQ יחסיים מוסיפים את מזהה מכונת המצב לאינדקס ה-IRQ עם חיבור מודולו-4. IRQ-ים 0-3 גלויים למעבד, ו-4-7 הם פנימיים למכונות המצב.- set(dest, data)
הגדר את dest עם הערך data.
dest:
pins,x,y,pindirsdata: ערך (0-31)
- nop()
זוהי פסאודו-הוראה שמתורגמת ל-
mov(y, y)ואין לה תופעת לוואי.- .side(value)
זהו משנה שניתן להחילו על כל הוראה, והוא משמש לשליטה בערכי פיני ה-side-set.
value: הערך (הביטים) להוצאה בפיני ה-side-set
- .delay(value)
זהו משנה שניתן להחילו על כל הוראה, והוא מציין כמה מחזורים להשהות לאחר שההוראה מתבצעת.
value: מחזורים להשהיה, 0-31 (הערך המרבי מצטמצם אם נעשה שימוש בפיני side-set)
- [value]
זהו משנה והוא שקול ל-
.delay(value).