machine — функції, пов’язані з апаратним забезпеченням

Модуль machine містить специфічні функції для роботи з апаратним забезпеченням конкретної плати. Більшість функцій цього модуля надають прямий та необмежений доступ і керування апаратними блоками системи (ЦП, таймери, шини тощо).

Доступ до пам’яті

Модуль надає три індексовані об’єкти для прямого доступу до пам’яті. Кожен поводиться як розріджений масив, індексований байтовою адресою: value = memN[addr] читає, memN[addr] = value записує. Адреса завжди є байтовою, незалежно від ширини доступу.

machine.mem8

Індексований 8-бітний аксесор пам’яті. mem8[addr] читає int у діапазоні 0-255 з байта за адресою addr; mem8[addr] = value записує молодші 8 біт value. addr повинна бути вирівняна до 1 байта (будь-яка адреса).

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. Якщо застосунку потрібен ідентифікатор фіксованої довжини, обріжте або хешуйте повернене значення.

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). При тайм-ауті функція повертає від’ємне значення, що вказує, на якій фазі стався тайм-аут:

  • -2 – тайм-аут при очікуванні переднього фронту (вивід так і не досяг рівня pulse_level).

  • -1 – тайм-аут при очікуванні заднього фронту (імпульс тривав довше, ніж timeout_us).

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

Передає data методом програмного керування бітами на зазначений pin. Аргумент encoding визначає спосіб кодування бітів, а timing – специфікацію часових параметрів, специфічну для кодування.

Підтримувані кодування:

  • 0 для модуляції тривалості імпульсу «високий-низький». Це передає біти 0 та 1 як часові імпульси, починаючи з найбільш значущого біта. timing повинен бути чотирьох-елементним кортежем наносекунд у форматі (high_time_0, low_time_0, high_time_1, low_time_1). Наприклад, (400, 850, 800, 450) – це специфікація часових параметрів для RGB LED WS2812 на частоті 800 кГц.

Точність часових параметрів залежить від апаратного забезпечення; швидші MCU генерують тісніші імпульси (зазвичай десятки наносекунд).

Примітка

Для керування стрічками 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

Скидання спричинено спрацьовуванням сторожового таймера. Порти STM32 та mimxrt.

machine.SOFT_RESET: int

Скидання спричинено soft_reset() (інтерпретатор Python перезапустився без апаратного скидання). Порти STM32 та mimxrt.

machine.HARD_RESET: int

Скидання спричинено активацією виводу NRST (зовнішня кнопка скидання). Лише порти STM32.

machine.DEEPSLEEP_RESET: int

Скидання спричинено пробудженням з глибокого сну. Лише порти STM32.

Класи