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固件、字库、小图标这类固定资源。

实战建议: 用W25Q64(8MB)存LVGL的字体文件和基础图标。我做过一个智能家居面板,所有图标压缩成RLE格式后只用了3.2MB,剩下的空间还能放两套主题。

3.3 SD卡:大容量、低成本,但小心速度陷阱

SD卡在LVGL项目里很常见,尤其是需要存大量高清图片的场景。但很多人忽略了一个问题:SD卡在SPI模式下的读取速度远低于SDIO模式。

我曾经在一个HMI项目里用SD卡存背景图,结果图片切换要1.2秒。后来发现是MCU的SPI时钟只配到了18MHz,而SD卡在SPI模式下最大也就25MHz。换成SDIO模式后,速度提升到40MB/s,切换时间降到80ms。

避坑指南: 如果必须用SD卡,优先选SDIO接口。如果MCU不支持SDIO,那就用4线SPI模式,并且把时钟配到最大。另外,SD卡的文件系统碎片会导致读取时间不稳定——我遇到过一张卡,前100张图读取均匀,第101张突然卡了300ms,就是因为FAT表碎片。

SD卡的另一个问题是可靠性。工业环境里,振动、温度变化都可能导致接触不良。所以我的建议是:消费级产品用SD卡,工业级产品慎用。

3.4 NAND Flash:大容量、高性能,但管理复杂

NAND Flash是嵌入式大容量存储的终极方案。它比SD卡快,比SPI Flash容量大,但代价是管理复杂度。

NAND Flash需要处理三件事:

  1. 坏块管理:出厂就有坏块,使用中还会产生新坏块
  2. ECC纠错:每512字节需要4~8字节的ECC校验
  3. 磨损均衡:避免某些块被频繁擦写而提前报废

这些工作如果全部自己写,至少需要2000行C代码。好在有现成的方案:

  • LittleFS + MTD:轻量级,适合裸机
  • UBIFS:Linux下首选,支持压缩
  • Raw NAND + 自定义管理:适合固定资源,不需要文件系统
我的选择逻辑: 如果图片总量超过128MB,且MCU有硬件ECC(比如STM32 FMC带NAND控制器),我会选NAND Flash。否则,老老实实用SPI Flash或SD卡。

3.5 三种方案的选型决策树

下面这张图是我自己总结的选型流程,每次做新项目都拿出来对照:

外部存储选型决策树 图片总量评估 ≤64MB → SPI Flash 64MB~1GB → SD卡 ≥1GB → NAND Flash QSPI支持?→ 选QSPI Flash 否则 → 普通SPI Flash(DMA加速) SDIO支持?→ 选SDIO模式 否则 → 4线SPI模式,时钟配到最大 硬件ECC支持?→ 选NAND Flash 否则 → 考虑SD卡或SPI Flash SPI Flash方案 SD卡方案 NAND Flash方案 选型要点总结: • 小容量(≤64MB)、高可靠 → SPI Flash(QSPI优先) • 中容量(64MB~1GB)、低成本 → SD卡(SDIO优先) • 大容量(≥1GB)、高性能 → NAND Flash(需硬件ECC) • 工业环境优先选SPI Flash或NAND,消费产品可用SD卡

3.6 实际项目中的选择案例

我整理了几个真实项目的选型,你可以参考:

项目类型 图片总量 最终选型 理由
智能手表UI 4MB SPI Flash (W25Q32) 容量小、需要快速启动、无文件系统开销
工业HMI面板 64MB SPI Flash (W25Q512) 工业环境、需要高可靠性、QSPI接口
智能家居中控 256MB SD卡 (SDIO模式) 容量适中、成本敏感、用户可更换
车载娱乐系统 2GB NAND Flash (eMMC) 大容量、需要磨损均衡、车规级要求
核心原则: 选型不是选最好的,而是选最合适的。SPI Flash适合小容量高可靠场景,SD卡适合大容量低成本场景,NAND Flash适合大容量高性能场景。三者之间没有绝对的优劣,只有场景的匹配度。

好了,这一章的内容就到这里。记住,存储选型决定了后续所有工作的基础。选对了,后面调DMA2D、配参数都顺风顺水;选错了,再好的优化技巧也救不回来。