class Flash —— 访问内置闪存存储

Flash 类允许直接访问基于 STM32 的 OpenMV Cam 上的主闪存设备。

在大多数情况下,要在设备上存储持久化数据,你会希望使用更高级的抽象,例如通过 Python 标准文件 API 使用文件系统,但此接口在 自定义文件系统配置 或为你的应用实现底层存储系统时很有用。

备注

OpenMV Cam H7 PlusPure ThermalN6 使用外部 SPI/QSPI/XSPI 闪存芯片作为主存储;其他基于 STM32 的 OpenMV Cam 使用 MCU 内部的闪存。两种情况下的 Python 接口完全相同。

构造函数

class pyb.Flash
class pyb.Flash(*, start: int = -1, len: int = -1)

为板载闪存构造一个与 vfs.AbstractBlockDev 兼容的块设备。存在两种形式:

  • Flash()(无参数):返回旧式的单例对象,它暴露整个闪存并在前面附加了一个虚拟分区表。实际的闪存数据从块 0x100 开始。此形式已弃用,将在未来的 MicroPython 版本中移除。

  • Flash(start=..., len=...):返回一个新的块设备,它从字节偏移 start(默认 0)开始访问闪存,长度为 len 字节(默认:设备的剩余部分)。两个值都必须是底层块大小的整数倍(内部闪存通常为 512 字节;外部 SPI/QSPI/XSPI 部件使用更大的擦除扇区大小)。

方法

readblocks(block_num: int, buf: bytearray) None
readblocks(block_num: int, buf: bytearray, offset: int) None

从闪存读取字节到 buf。两个重载分别暴露简单接口和扩展接口:

简单形式readblocks(block_num, buf)):从块索引 block_num 开始读取整块。len(buf) 必须是闪存块大小的整数倍。

扩展形式readblocks(block_num, buf, offset)):从块 block_num 内的字节 offset 开始读取 len(buf) 字节 —— 不一定是整块的数量。len(buf) 没有对齐约束。仅在使用显式 start / len 参数创建的对象上受支持,已弃用的单例不支持。

writeblocks(block_num: int, buf: bytes | bytearray) None
writeblocks(block_num: int, buf: bytes | bytearray, offset: int) None

buf 中的字节写入闪存。两个重载分别暴露简单接口和扩展接口:

简单形式writeblocks(block_num, buf)):从块索引 block_num 开始写入整块。len(buf) 必须是闪存块大小的整数倍。每个受影响的块在写入前会被自动擦除。

扩展形式writeblocks(block_num, buf, offset)):从块 block_num 内的字节 offset 开始写入 len(buf) 字节 —— 不一定是整块的数量。len(buf) 没有对齐约束,并且不会执行隐式擦除 —— 调用者必须确保受影响的块已通过先前的 ioctl(6, block_num) 调用被擦除。仅在使用显式 start / len 参数创建的对象上受支持。

ioctl(cmd: int, arg: int) int | None

标准的 vfs.AbstractBlockDev ioctl 入口点。cmd 取值的完整列表见 vfs.AbstractBlockDev.ioctl()cmd=5 返回以字节为单位的闪存块大小;cmd=6 擦除索引为 arg 的块。