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 для модуляции длительности импульса по принципу «high low». Это передаёт биты 0 и 1 как тактированные импульсы, начиная со старшего значащего бита. timing должен быть кортежем из четырёх элементов в наносекундах в формате (high_time_0, low_time_0, high_time_1, low_time_1). Например, (400, 850, 800, 450) — это спецификация тайминга для RGB-светодиодов 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

Сброс, вызванный пробуждением из режима deep-sleep. Только порты STM32.

Классы