machine --- 与硬件相关的函数

machine 模块包含与特定开发板上的硬件相关的特定函数。该模块中的大多数函数允许直接、不受限制地访问和控制系统上的硬件模块(如 CPU、定时器、总线等)。

内存访问

该模块暴露了三个可下标的对象,用于原始内存访问。每个对象的行为类似于按字节地址索引的稀疏数组:value = memN[addr] 读取,memN[addr] = value 写入。无论访问宽度如何,地址始终是字节地址。

machine.mem8

可下标的 8 位内存访问器。mem8[addr]addr 处的字节读取一个 0-255 范围内的 intmem8[addr] = value 写入 value 的低 8 位。addr 必须按 1 字节对齐(任意地址)。

machine.mem16

可下标的 16 位(半字)内存访问器。mem16[addr] 读取一个 0-65535 范围内的 intmem16[addr] = value 写入低 16 位。addr 必须按 2 字节对齐。

machine.mem32

可下标的 32 位(字)内存访问器。mem32[addr] 读取一个 0-0xFFFFFFFF 范围内的 intmem32[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 系列——STM32 上为 12 字节,mimxrt 和 alif 移植版本上为 8 字节。如果你的应用程序需要固定长度的 ID,请对返回值进行切片或哈希处理。

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

通过对指定的 pin 进行位拼接(bit-banging)来发送 dataencoding 参数指定如何对位进行编码,而 timing 是特定于编码的时序规范。

支持的编码有:

  • 0 表示“高低”脉冲持续时间调制。这将把 0 和 1 位作为定时脉冲发送,从最高有效位开始。timing 必须是一个以纳秒为单位、格式为 (high_time_0, low_time_0, high_time_1, low_time_1) 的四元组。例如,(400, 850, 800, 450) 是 WS2812 RGB LED 在 800kHz 下的时序规范。

时序精度取决于硬件;更快的 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 移植版本。