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 בלבד.

מחלקות