machine --- 与硬件相关的函数¶
machine 模块包含与特定开发板上的硬件相关的特定函数。该模块中的大多数函数允许直接、不受限制地访问和控制系统上的硬件模块(如 CPU、定时器、总线等)。
内存访问¶
该模块暴露了三个可下标的对象,用于原始内存访问。每个对象的行为类似于按字节地址索引的稀疏数组:value = memN[addr] 读取,memN[addr] = value 写入。无论访问宽度如何,地址始终是字节地址。
- machine.mem8¶
可下标的 8 位内存访问器。
mem8[addr]从addr处的字节读取一个 0-255 范围内的int;mem8[addr] = value写入value的低 8 位。addr必须按 1 字节对齐(任意地址)。
- machine.mem16¶
可下标的 16 位(半字)内存访问器。
mem16[addr]读取一个 0-65535 范围内的int;mem16[addr] = value写入低 16 位。addr必须按 2 字节对齐。
- machine.mem32¶
可下标的 32 位(字)内存访问器。
mem32[addr]读取一个 0-0xFFFFFFFF 范围内的int;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 系列——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)来发送 data。encoding 参数指定如何对位进行编码,而 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.SOFT_RESET: int¶
由
soft_reset()引起的复位(Python 解释器在没有硬件复位的情况下重启)。STM32 和 mimxrt 移植版本。
类¶
- class Pin -- 控制 I/O 引脚
- class Signal -- 控制和感测外部 I/O 设备
- class LED -- 可移植的板载 LED 控制
- class ADC -- 模数转换
- class PWM -- 脉冲宽度调制
- class UART -- 双工串行通信总线
- class SPI -- 串行外设接口总线协议(控制器端)
- class SoftSPI -- 软件模拟的 SPI 总线
- class I2C —— 一种双线串行协议
- class SoftI2C —— 软件模拟的 I2C 总线
- class I2CTarget —— 一个 I2C 目标设备
- class I2S -- Inter-IC Sound 总线协议
- class CAN -- 控制器局域网(CAN)协议
- class RTC -- 实时时钟
- class Timer -- 虚拟周期/单次定时器
- class WDT -- 看门狗定时器
- class SDCard -- SD / MMC 卡驱动
- class Counter -- 脉冲计数器
- class Encoder -- 正交解码器