3. 存储介质选型:Flash、EEPROM、SD卡、NAND Flash 对比

做运动控制固件,存储选型是个绕不开的坎儿。

我见过不少项目,前期随便选了个存储芯片,结果量产时发现擦写寿命不够,或者掉电丢数据,改都来不及。说白了,存储介质选错了,整个固件升级方案就是空中楼阁。

今天咱们就把四种常见的存储介质掰开揉碎聊一聊。Flash、EEPROM、SD卡、NAND Flash,它们各自适合什么场景?坑在哪里?我用自己的项目经验给你讲透。

3.1 四种存储介质的核心差异

先看一张对比表,心里有个底。

特性 EEPROM NOR Flash NAND Flash SD卡(NAND+控制器)
存储容量 几KB~几MB 几MB~几十MB 几百MB~几TB 几GB~几TB
擦写寿命 100万次以上 10万次左右 1万~10万次 取决于内部NAND
读写速度 慢(字节级) 中(随机读快) 快(页级读写) 快(带缓存)
擦除方式 字节擦除 扇区擦除 块擦除 块擦除(内部管理)
坏块管理 需要软件处理 内置控制器处理
接口 I2C/SPI SPI/Parallel SPI/Parallel SDIO/SPI
典型成本 高(每KB) 低(每MB) 低(每GB)
固件升级适用性 ❌ 不适合 ✅ 适合小固件 ✅ 适合大固件 ✅ 适合超大固件

这张表我建议你收藏。每次选型前拿出来对照一下,能省不少弯路。

3.2 EEPROM:小数据存储的可靠选择

EEPROM 这东西,我最早接触是在做工业传感器的时候。当时需要存储校准参数和设备序列号,数据量不大,但要求掉电不丢。

EEPROM 最大的优点是字节级擦写。你改一个字节,就只擦一个字节,不像 Flash 那样要擦整个扇区。而且它的擦写寿命高达 100 万次以上,适合频繁修改的小数据。

适用场景:
  • 设备配置参数(PID、IP地址、校准值)
  • 运行日志(少量、频繁写入)
  • 固件版本号、升级标志位
注意:EEPROM 容量普遍偏小,最大也就几 MB。千万别用它存固件镜像,那会把你逼疯的。我曾经见过有人用 256KB 的 EEPROM 存 500KB 的固件,结果只能分片存,升级逻辑写得跟迷宫一样。

3.3 NOR Flash:代码就地执行(XIP)的利器

NOR Flash 有个独门绝技——XIP(Execute In Place)。说白了,就是 CPU 可以直接从 NOR Flash 里读指令执行,不用先把代码搬到 RAM 里。

这个特性在运动控制里特别有用。比如你做一个伺服驱动器,启动时要求毫秒级响应,没时间等代码从外部存储搬运到 RAM。NOR Flash 直接映射到地址空间,上电就能跑。

我的经验:NOR Flash 的随机读取速度非常快,适合存放 Bootloader。我习惯把 Bootloader 放在 NOR Flash 里,应用程序放在 NAND 或 SD 卡上。这样 Bootloader 启动快,升级时也安全——万一应用程序升级失败,Bootloader 还在,不会变砖。

但 NOR Flash 也有短板。容量做不大,成本高。你想存个 100MB 的固件?NOR Flash 的价格会让你怀疑人生。

3.4 NAND Flash:大容量固件的首选

NAND Flash 是目前嵌入式设备里最主流的固件存储介质。容量大、价格低,几百 MB 到几 TB 随便选。

但 NAND Flash 有个让人头疼的问题——坏块。出厂时就可能有坏块,使用过程中还会产生新的坏块。你想想看,如果固件刚好写在坏块上,升级到一半系统就挂了。

NAND Flash 使用要点:
  • 必须做坏块管理(BBM),跳过坏块
  • 需要 ECC 校验,纠正位翻转错误
  • 擦除以块为单位(通常 128KB 或 256KB)
  • 写入以页为单位(通常 2KB 或 4KB)

我在做一款工业相机时,就吃过 NAND Flash 的亏。当时没做坏块管理,结果生产了 1000 台设备,有 30 台升级失败。后来老老实实加了坏块表和 ECC,问题才解决。

避坑指南:NAND Flash 的擦写次数只有 1 万到 10 万次。如果你频繁升级固件(比如每天一次),几年后 Flash 就可能报废。我建议做磨损均衡(Wear Leveling),把擦写操作分散到不同块上。

3.5 SD 卡:大容量 + 即插即用

SD 卡本质上就是 NAND Flash 加了一个控制器。坏块管理、ECC、磨损均衡,控制器都帮你做了。你只需要通过 SDIO 或 SPI 接口读写文件就行。

SD 卡最大的优势是容量大、可插拔。比如你做一个人机界面,需要存几百张图片和字库文件,SD 卡是最省事的方案。

我的习惯:在运动控制器上,我会把 SD 卡作为固件升级的载体。用户把升级文件拷到 SD 卡里,插到设备上,系统检测到后自动升级。这样既不用联网,也不用串口线,现场维护非常方便。

但 SD 卡也有坑。它的文件系统(FAT32/exFAT)在掉电时容易损坏。我曾经遇到过客户插拔 SD 卡时正好在写数据,结果文件系统崩溃,卡里的固件全丢了。后来我加了掉电检测和文件系统日志,才算稳住。

3.6 选型决策树

说了这么多,到底怎么选?我画了一张决策图,你照着走就行。

存储介质选型 数据量 < 1MB? 数据量 1~100MB? 数据量 > 100MB? 频繁修改?→ EEPROM 需要XIP?→ NOR Flash 可插拔?→ SD卡 不频繁改?→ NOR Flash 低成本?→ NAND Flash 固定安装?→ NAND Flash EEPROM + NOR NOR + NAND SD卡 + NAND 注:实际项目中常采用组合方案,如 NOR Flash 存 Bootloader + NAND Flash 存应用程序

3.7 我的推荐组合方案

做了这么多年运动控制固件,我总结了一套比较稳的存储方案,分享给你参考。

推荐组合:
  1. Bootloader → 存放在 NOR Flash(2MB 足够)
  2. 应用程序固件 → 存放在 NAND Flash(根据大小选 128MB~1GB)
  3. 配置参数 → 存放在 EEPROM(64KB 足够)
  4. 升级文件缓存 → 存放在 SD 卡(可选,用于离线升级)

这个方案的好处是各司其职。Bootloader 在 NOR Flash 里,启动快、安全。应用程序在 NAND Flash 里,容量大、成本低。参数在 EEPROM 里,随便改不怕坏。SD 卡作为升级媒介,现场维护方便。

小技巧:如果你用的 MCU 内部有足够大的 Flash,也可以把 Bootloader 和参数都放在内部 Flash 里,外部只挂一个 NAND Flash 存固件。这样成本更低,电路也更简单。

嗯,存储介质选型就聊到这儿。记住一句话:没有最好的存储介质,只有最适合你项目的方案。选型时多想想你的固件有多大、升级频率多高、现场维护方不方便,答案自然就有了。


公众号:蓝海资料掘金营,微信deep3321