3、外部存储选型:SPI Flash、SD卡、NAND Flash对比与选择
做LVGL图片加载,第一步不是写代码,而是选存储。我见过不少项目,代码调通了,结果发现存储带宽不够,画面卡成PPT。说白了,选错存储芯片,后面全白干。
这一章我们就把三种主流方案掰开揉碎,看看它们各自适合什么场景。
3.1 三种存储的核心差异
先看一张对比表,心里有个底:
| 参数 | SPI Flash | SD卡(SPI模式) | NAND Flash |
|---|---|---|---|
| 接口速率 | ~80 MB/s(QSPI) | ~12.5 MB/s(SPI) | ~50 MB/s(并行) |
| 典型容量 | 2MB ~ 256MB | 1GB ~ 32GB | 128MB ~ 8GB |
| 随机读取延迟 | ~50ns | ~1ms(块寻址) | ~25μs |
| 擦写寿命 | 10万次 | 10万次(MLC) | 1万~10万次 |
| 坏块管理 | 不需要 | 内部处理 | 必须软件处理 |
| 文件系统 | LittleFS / 裸地址 | FAT32 / exFAT | UBIFS / YAFFS2 |
| 引脚数 | 6~8 | 6(SPI模式) | 24~48 |
| 成本(每MB) | 高 | 极低 | 低 |
嗯,这里要注意:表格里的速率是理论峰值。实际项目中,SPI Flash用QSPI模式能跑到80MB/s,但很多MCU的QSPI控制器只支持单线模式,实际只有20MB/s。我踩过这个坑,后来老老实实看了数据手册的时序图才找到原因。
3.2 SPI Flash:小容量、高可靠的首选
我个人习惯,如果图片总量不超过64MB,优先选SPI Flash。为什么?
- 接口简单:6根线搞定,PCB布局省心
- 无需坏块管理:NOR Flash天生没有坏块,擦写均匀
- XIP执行:支持就地执行,代码可以直接跑在Flash上
但SPI Flash有个致命弱点:容量越大,成本越贵。256MB的SPI Flash价格能买一张32GB的SD卡。所以它只适合存UI固件、字库、小图标这类固定资源。
3.3 SD卡:大容量、低成本,但小心速度陷阱
SD卡在LVGL项目里很常见,尤其是需要存大量高清图片的场景。但很多人忽略了一个问题:SD卡在SPI模式下的读取速度远低于SDIO模式。
我曾经在一个HMI项目里用SD卡存背景图,结果图片切换要1.2秒。后来发现是MCU的SPI时钟只配到了18MHz,而SD卡在SPI模式下最大也就25MHz。换成SDIO模式后,速度提升到40MB/s,切换时间降到80ms。
SD卡的另一个问题是可靠性。工业环境里,振动、温度变化都可能导致接触不良。所以我的建议是:消费级产品用SD卡,工业级产品慎用。
3.4 NAND Flash:大容量、高性能,但管理复杂
NAND Flash是嵌入式大容量存储的终极方案。它比SD卡快,比SPI Flash容量大,但代价是管理复杂度。
NAND Flash需要处理三件事:
- 坏块管理:出厂就有坏块,使用中还会产生新坏块
- ECC纠错:每512字节需要4~8字节的ECC校验
- 磨损均衡:避免某些块被频繁擦写而提前报废
这些工作如果全部自己写,至少需要2000行C代码。好在有现成的方案:
- LittleFS + MTD:轻量级,适合裸机
- UBIFS:Linux下首选,支持压缩
- Raw NAND + 自定义管理:适合固定资源,不需要文件系统
3.5 三种方案的选型决策树
下面这张图是我自己总结的选型流程,每次做新项目都拿出来对照:
3.6 实际项目中的选择案例
我整理了几个真实项目的选型,你可以参考:
| 项目类型 | 图片总量 | 最终选型 | 理由 |
|---|---|---|---|
| 智能手表UI | 4MB | SPI Flash (W25Q32) | 容量小、需要快速启动、无文件系统开销 |
| 工业HMI面板 | 64MB | SPI Flash (W25Q512) | 工业环境、需要高可靠性、QSPI接口 |
| 智能家居中控 | 256MB | SD卡 (SDIO模式) | 容量适中、成本敏感、用户可更换 |
| 车载娱乐系统 | 2GB | NAND Flash (eMMC) | 大容量、需要磨损均衡、车规级要求 |
好了,这一章的内容就到这里。记住,存储选型决定了后续所有工作的基础。选对了,后面调DMA2D、配参数都顺风顺水;选错了,再好的优化技巧也救不回来。