machine — פונקציות הקשורות לחומרה#

המודול machine מכיל פונקציות ספציפיות הקשורות לחומרה שעל לוח מסוים. רוב הפונקציות במודול זה מאפשרות להשיג גישה ובקרה ישירות ובלתי מוגבלות על בלוקים חומרתיים במערכת (כמו CPU, טיימרים, אפיקים וכו«).

גישה לזיכרון#

המודול חושף שלושה אובייקטים הניתנים לאינדוקס, המשמשים לגישה גולמית לזיכרון. כל אחד מתנהג כמערך דליל המאונדקס לפי כתובת בייט: value = memN[addr] קורא, memN[addr] = value כותב. הכתובת היא תמיד כתובת בייט, ללא תלות ברוחב הגישה.

machine.mem8#

אובייקט גישה לזיכרון 8 ביטים הניתן לאינדוקס. mem8[addr] קורא int בטווח 0-255 מהבייט בכתובת addr; mem8[addr] = value כותב את 8 הביטים התחתונים של value. addr חייבת להיות מיושרת לבייט אחד (כל כתובת).

machine.mem16#

אובייקט גישה לזיכרון 16 ביטים (חצי-מילה) הניתן לאינדוקס. mem16[addr] קורא int בטווח 0-65535; mem16[addr] = value כותב את 16 הביטים התחתונים. addr חייבת להיות מיושרת ל-2 בייטים.

machine.mem32#

אובייקט גישה לזיכרון 32 ביטים (מילה) הניתן לאינדוקס. mem32[addr] קורא int בטווח 0-0xFFFFFFFF; mem32[addr] = value כותב את 32 הביטים התחתונים. addr חייבת להיות מיושרת ל-4 בייטים.

דוגמת שימוש (האוגרים ספציפיים למיקרו-בקר STM32H7 – ב-OpenMV Cam H7 / H7 Plus / Pure Thermal פין הכותרת P0 מחווט ל-PB15):

import machine
from micropython import const

GPIOB = const(0x58020400)
GPIO_BSRR = const(0x18)
GPIO_IDR = const(0x10)

# set P0 (PB15) high via the GPIOB bit-set/reset register
machine.mem32[GPIOB + GPIO_BSRR] = 1 << 15

# read P0 (PB15) directly out of the GPIOB input-data register
value = (machine.mem32[GPIOB + GPIO_IDR] >> 15) & 1

פונקציות שונות#

machine.unique_id() bytes#

מחזיר אובייקט bytes המכיל מזהה ייחודי ללוח זה. הערך נקרא מחומרת ה-MCU (בדרך כלל המספר הסידורי של ההתקן המתוכנת במפעל), כך שהוא יציב בין אתחולים ושונה מלוח אחד למשנהו.

האורך תלוי במשפחת ה-MCU – 12 בייטים ב-STM32, 8 בייטים בפורטי mimxrt ו-alif. אם היישום שלך זקוק ל-ID באורך קבוע, חתוך או גבב (hash) את הערך המוחזר.

machine.time_pulse_us(pin: Pin, pulse_level: int, timeout_us: int = 1000000, /) int#

מדידת רוחב פולס בודד על pin והחזרת משכו במיקרו-שניות.

pin חייב להיות מוגדר כקלט דיגיטלי.

pulse_level הוא הקוטביות של הפולס שיש לתזמן: 1 לפולס גבוה, 0 לפולס נמוך.

הפונקציה פועלת בשני שלבים. ראשית, אם הפין אינו כבר ב-pulse_level, היא ממתינה שהפין יעבור ל-pulse_level (תחילת הפולס). לאחר מכן היא מודדת את הזמן שהפין נשאר ב-pulse_level לפני שהוא חוזר (סוף הפולס). הזמן הנמדד מוחזר במיקרו-שניות.

timeout_us תוחם כל שלב באופן עצמאי (כך שקריאה במקרה הגרוע ביותר נמשכת עד 2 * timeout_us). בעת timeout הפונקציה מחזירה ערך שלילי המזהה איזה שלב חרג מהזמן:

  • -2 – חריגת זמן בהמתנה לקצה המוביל (הפין מעולם לא הגיע ל-pulse_level).

  • -1 – חריגת זמן בהמתנה לקצה הנגרר (הפולס היה ארוך יותר מ-timeout_us).

machine.bitstream(pin: Pin, encoding: int, timing: tuple, data: bytes, /) None#

משדר data באמצעות bit-banging של ה-pin המצוין. הארגומנט encoding מציין כיצד הביטים מקודדים, ו-timing הוא מפרט תזמון ספציפי לקידוד.

הקידודים הנתמכים הם:

  • 0 עבור מודולציית משך פולס ”high low“. זה ישדר ביטים 0 ו-1 כפולסים מתוזמנים, החל מהביט המשמעותי ביותר. ה-timing חייב להיות four-tuple של ננו-שניות בפורמט (high_time_0, low_time_0, high_time_1, low_time_1). לדוגמה, (400, 850, 800, 450) הוא מפרט התזמון עבור נוריות WS2812 RGB ב-800kHz.

דיוק התזמון תלוי בחומרה; מיקרו-בקרים מהירים יותר מייצרים פולסים מהודקים יותר (בדרך כלל עשרות ננו-שניות).

הערה

לשליטה ברצועות WS2812 / NeoPixel, ראה את המודול neopixel לקבלת API ברמה גבוהה יותר.

קבועים#

הקבועים שלהלן מוחזרים על ידי reset_cause() ומזהים מדוע ה-MCU אופס לאחרונה. זמין בפורטי STM32 ו-mimxrt; פורט alif (OpenMV Cam AE3) אינו חושף כעת קבועי סיבת איפוס וה-reset_cause() שלו תמיד מחזיר 0.

machine.PWRON_RESET: int#

איפוס שנגרם מהפעלת חשמל אל השבב. פורטי STM32 ו-mimxrt.

machine.WDT_RESET: int#

איפוס שנגרם מפקיעת הטיימר watchdog. פורטי STM32 ו-mimxrt.

machine.SOFT_RESET: int#

איפוס שנגרם מ-soft_reset() (מפרש ה-Python הופעל מחדש ללא איפוס חומרתי). פורטי STM32 ו-mimxrt.

machine.HARD_RESET: int#

איפוס שנגרם מהפעלת פין ה-NRST (כפתור איפוס חיצוני). פורטי STM32 בלבד.

machine.DEEPSLEEP_RESET: int#

איפוס שנגרם מהתעוררות מ-deep-sleep. פורטי STM32 בלבד.

מחלקות#