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 אינו שווה ל-Y

    • pin: אמת אם פין הקלט מוגדר

    • not_osre: אמת אם ה-OSR אינו ריק (לא הגיע לסף שלו)

  • label: התווית שאליה יש לקפוץ אם התנאי אמת

wait(polarity, src, index)

חסום, בהמתנה למצב גבוה/נמוך בפין או בקו IRQ.

  • polarity: 0 או 1, האם להמתין לערך נמוך או גבוה

  • src: אחד מ: gpio (פין מוחלט), pin (פין יחסי לארגומנט in_base של ה-StateMachine), irq

  • index: 0-31, האינדקס עבור src

in_(src, bit_count)

הזז נתונים פנימה מ-src אל ה-ISR.

  • src: אחד מ: pins, x, y, null, isr, osr

  • bit_count: מספר הביטים להזזה פנימה (1-32)

out(dest, bit_count)

הזז נתונים החוצה מה-OSR אל dest.

  • dest: אחד מ: pins, x, y, pindirs, pc, isr, exec

  • bit_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, osr

  • src: אחד מ: 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, clear

  • index: 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, pindirs

  • data: ערך (0-31)

nop()

זוהי פסאודו-הוראה שמתורגמת ל-mov(y, y) ואין לה תופעת לוואי.

.side(value)

זהו משנה שניתן להחילו על כל הוראה, והוא משמש לשליטה בערכי פיני ה-side-set.

  • value: הערך (הביטים) להוצאה בפיני ה-side-set

.delay(value)

זהו משנה שניתן להחילו על כל הוראה, והוא מציין כמה מחזורים להשהות לאחר שההוראה מתבצעת.

  • value: מחזורים להשהיה, 0-31 (הערך המרבי מצטמצם אם נעשה שימוש בפיני side-set)

[value]

זהו משנה והוא שקול ל-.delay(value).

מחלקות