非易失性存储器(NVM,Non-Volatile Memory)是即使在设备重启后仍能保持数据的存储器。在 Silicon Labs 的 Microcontroller 和 Radio SoC 上,NVM 由闪存实现。由于闪存的擦除次数有限,Silicon Labs 提供了多种方法来有效降低闪存磨损速度,并保证应用数据在产品整个生命周期内的可靠存储。Documentation Index
Fetch the complete documentation index at: https://mintlify.com/dsyx/docs.silabs.com_zh/llms.txt
Use this file to discover all available pages before exploring further.
非易失性存储的挑战
闪存有一个重要特征:可以以较小的块(通常是 32-bit 字)写入,但只能以较大的块(通常是几 KB 的页)擦除。这带来了以下存储设计挑战:每页一个对象(空间浪费)
每页一个对象(空间浪费)
最简单的方案:每个数据对象存储在各自的闪存页中,每个对象可独立擦除和重写,但数据对象通常远小于页大小,造成严重的闪存空间浪费。
多对象共享一页(频繁擦除)
多对象共享一页(频繁擦除)
将多个数据对象存储在同一闪存页中可节省空间,但更新任意一个对象时,必须先擦除整页,再将所有对象重新写回,导致频繁擦除,缩短闪存寿命。
版本化写入(磨损均衡基础)
版本化写入(磨损均衡基础)
将每个对象的新版本写入到闪存页的新空位置,而非覆盖旧版本。每个版本携带 Key 标识属于哪个对象,访问时搜索最新版本。这是磨损均衡的核心思想。
断电保护:虚拟页机制
当版本化写入将页填满时,需要擦除页并重新开始。为防止断电期间数据丢失,引入第二页(虚拟页,Virtual Page):在擦除原始页之前,先将所有对象的最新版本复制到第二页,然后继续向第二页写入新数据,当第二页满时,再迁回第一页。这就是 PS Store 的工作方式。FIFO 模型
闪存数据存储可建模为 FIFO(先进先出)缓冲区:向 FIFO 输入写入新版本,当 FIFO 填满时,复制尚未被取代的对象版本,然后擦除 FIFO 末尾的旧页。 NVM3 在整个存储空间上实现为循环缓冲区,只需保留足够的已擦除页(可容纳最大对象),从而最大化可用存储比例,与使用虚拟页的实现相比显著延长了闪存寿命。三种存储方案详解
SimEEv1/v2(Simulated EEPROM)
SimEEv1/v2 可与 EmberZNet PRO 和 Silicon Labs Connect(Flex SDK)配合使用。- SimEEv1
- SimEEv2
- 使用 2 个固定虚拟页,每个虚拟页由 2 个物理闪存页组成
- 总大小:8 kB(固定)
- 最大基础存储:2 kB
- 最大对象数量:254 个
- 最大对象大小:254 字节
- 对象在编译时定义,无法在运行时创建或删除
- 支持计数器对象和 Indexed 对象
PS Store(Persistent Store)
PS Store 可与 Bluetooth 设备配合使用(EFR32 Series 2 除外)。- 持久存储大小:2048 字节
- 使用 2 个闪存页存储(共 4 kB)
- 最大对象大小:56 字节
- 支持运行时创建和删除对象
- Silicon Labs 中最小的非易失性存储选项
- 由于 Bluetooth Bonding 也存储在此区域,可用于用户数据的空间取决于当前 Bonding 数量(每个 Bonding 约 150 字节)
NVM3(Third Generation Non-Volatile Memory)
NVM3 是 SimEEv1/v2 和 PS Store 的替代品,是 Silicon Labs 推荐的现代非易失性存储方案。- 可用于 EFM32 和 EFR32 全系列设备
- 支持 EmberZNet、Connect、Z-Wave、OpenThread、Bluetooth 全协议栈
- 闪存大小可配置(最少 3 个闪存页)
- 对象大小范围:0 到 4096 字节
- 对象在运行时创建和删除
- 基于循环缓冲区的磨损均衡,闪存寿命优于虚拟页方案
- 支持多协议应用中的单一共享实例
方案比较
下表对四种主要非易失性存储实现的关键特性进行了比较,帮助开发者选择最适合的方案。
| 特性 | NVM3 | SimEEv1 | SimEEv2 | PS Store |
|---|---|---|---|---|
| 兼容设备 | EFM32, EFR32 | EFR32 Series 1 | EFR32 Series 1 | EFR32 Series 1 |
| 兼容无线协议 | EmberZNet, Connect, Z-Wave, OpenThread, Bluetooth | EmberZNet, Connect | EmberZNet, Connect | Bluetooth |
| 存储闪存用量 | 3 页或更多(可配置) | 8 KB(固定) | 36 KB(固定) | 4 KB(固定) |
| 虚拟页数量 | 不适用 | 2 | 3 | 不适用 |
| 最大基础存储 | 可变(见 AN1135) | 2 KB | 8 KB | 2 KB |
| 最大对象数量 | 受基础存储限制 | 254 | 254 | 受基础存储限制 |
| 最大对象大小(字节) | 可配置 208-4096 | 254 | 254 | 56 |
| 对象创建/删除 | 运行时 | 编译时 | 编译时 | 运行时 |
| 编译后代码大小(不含数据存储) | 9.1 KB | 3.5 KB | 5.4 KB | 1.6 KB |
| 计数器对象支持 | 是 | 是 | 是 | 否 |
| Indexed 对象支持 | 部分¹ | 是 | 是 | 否 |
| 每个对象开销(字节) | 4(≤128字节);8(>128字节) | 2 | 6 | 10 |
| 计数器对象大小含开销(字节) | 212 | 60 | 56 | 不适用 |
| 计数器递增次数(每次擦除前) | 100(Series 1);50(Series 2) | 25 | 25 | 不适用 |
闪存寿命影响因素
所有 Silicon Labs 存储实现都使用某种形式的磨损均衡延长闪存寿命。影响磨损的主要因素:存储空间大小
分配给数据存储的闪存越多,闪存寿命越长。NVM3 支持可配置的页数,其余方案使用固定大小。
每对象存储开销
较少开销的实现使数据对象在闪存中占用更少空间,提供更长寿命。SimEEv1 的每对象开销最小(2字节)。
对象大小对齐
对象以最小对象大小的倍数存储,未对齐数据会添加填充字节,增加占用空间。
基础存储后的剩余空间
对于虚拟页方案,每次切换页时需写入每个对象的一个实例,如果基础存储较大,则可用于新写入的空间减少,闪存寿命下降。
NVM3 和 SimEEv1/v2 均包含用于报告数据存储闪存页面擦除次数的函数调用,可在加速寿命测试期间读取这些擦除计数器,以验证闪存磨损速率是否在可接受范围内。
适用场景与选型建议
- EmberZNet / Connect 应用
- Bluetooth 应用
- OpenThread / Z-Wave
- 新开发(GSDK 4.0+):推荐使用 NVM3,通过 Simplicity Studio 5 的 Project Configurator 配置
- 遗留应用(EmberZNet 6.x 及更低):可使用 SimEEv1/v2,或通过升级插件迁移到 NVM3
- DMP 应用(多协议):必须使用 NVM3(唯一支持多协议共享的方案)
迁移路径
SimEEv2 迁移到 NVM3
在 AppBuilder 中切换插件
在 AppBuilder 中启用 Simulated EEPROM version 2 to NVM3 Upgrade Library 插件,该插件会:
- 将 SimEEv2 存储空间压缩至 12 kB
- 在剩余 24 kB 中创建新的 NVM3 实例
- 将 Token 数据从 SimEEv2 复制到 NVM3
- 擦除 SimEEv2 存储,并调整 NVM3 实例使用全部 36 kB 空间
PS Store 迁移到 NVM3(Bluetooth)
在 Simplicity Studio 5 中(Bluetooth SDK v3.x):- 在 Project Configurator 中安装 NVM3 Default Instance 组件,会自动卸载 PS Store 组件