machine — 与硬件相关的函数

machine 模块包含特定于某个板上的与硬件相关的特定函数。该模块中的大多数函数允许直接和无限制地访问和控制系统上的硬件模块(如 CPU、定时器、总线等)。如果使用不当,这可能导致板的故障、死机、崩溃,甚至在极端情况下可能造成硬件损坏。

machine 模块的函数和类方法使用的回调注意事项:所有这些回调应被视为在中断上下文中执行。这对于具有 ID >= 0 的物理设备和具有负 ID(如 -1)的“虚拟”设备都是正确的(这些“虚拟”设备仍然是真实硬件和真实硬件中断之上的薄垫片)。参见 编写中断处理程序

内存访问

此模块公开了三个用于原始内存访问的对象。

machine.mem8

读/写内存的8位。

machine.mem16

读/写内存的16位。

machine.mem32

读/写内存的32位。

使用下标符号 [...] 来使用感兴趣的地址索引这些对象。请注意,无论所访问的内存大小如何,地址都是字节地址。

使用示例(寄存器特定于stm32微控制器):

import machine
from micropython import const

GPIOA = const(0x48000000)
GPIO_BSRR = const(0x18)
GPIO_IDR = const(0x10)

# set PA2 high
machine.mem32[GPIOA + GPIO_BSRR] = 1 << 2

# read PA3
value = (machine.mem32[GPIOA + GPIO_IDR] >> 3) & 1

杂项函数

machine.unique_id()

返回一个板/SoC 的唯一标识符的字节串。如果底层硬件允许,它将从一个板/SoC 实例变化到另一个实例。硬件的长度可能会有所不同(因此如果您期望一个短 ID,使用完整值的子串)。在某些 MicroPython 移植版本中,ID 对应于网络 MAC 地址。

machine.time_pulse_us(pin, pulse_level, timeout_us=1000000, /)

计时给定 pin 上的脉冲,并以微秒为单位返回脉冲持续时间。pulse_level 参数应为 0 以计时低脉冲,或为 1 以计时高脉冲。

如果引脚的当前输入值与 pulse_level 不同,函数首先(*)等待引脚输入变为等于 pulse_level,然后(**)计时引脚等于 pulse_level 的持续时间。如果引脚已经等于 pulse_level,则计时立即开始。

如果在等待上述条件(*)时超时,函数将返回 -2;如果在主要测量(**)期间超时,函数将返回 -1。超时对于两种情况是相同的,由 timeout_us 给出(以微秒为单位)。

machine.bitstream(pin, encoding, timing, data, /)

通过对指定的 pin 进行比特振荡来传输 dataencoding 参数指定了位的编码方式,timing 是一个特定于编码的时间规范。

支持的编码有:

  • 0 用于 “高低” 脉冲持续时间调制。这将以定时脉冲的方式传输 0 和 1 位,从最高有效位开始。timing 必须是一个四元组,以纳秒格式表示 (高时间_0, 低时间_0, 高时间_1, 低时间_1)。例如,(400, 850, 800, 450) 是用于 WS2812 RGB LED 的 800kHz 的时序规范。

时间的准确性因移植版本而异。在 Cortex M0 上,时钟为 48MHz,最好的情况下为 +/- 120ns;然而,在更快的 MCU(ESP8266、ESP32、STM32、Pyboard)上,它将更接近于 +/-30ns。

备注

用于控制 WS2812 / NeoPixel 条,请参阅 neopixel 模块以获得更高级的 API。

常量

machine.IDLE
machine.SLEEP
machine.DEEPSLEEP

IRQ唤醒值。

machine.PWRON_RESET
machine.HARD_RESET
machine.WDT_RESET
machine.DEEPSLEEP_RESET
machine.SOFT_RESET

重置原因。

machine.WLAN_WAKE
machine.PIN_WAKE
machine.RTC_WAKE

唤醒原因。