4. 外部存储选型

做LVGL外部存储加载图片,第一步不是写代码,而是选存储介质。我见过不少项目,代码写得漂漂亮亮,结果卡在存储选型上——要么容量不够,要么速度跟不上,要么成本超预算。说白了,选错存储,后面全白干。

市面上常用的外部存储就三种:SPI Flash、SD卡、NAND Flash。它们各有脾气,咱们一个一个聊。

4.1 SPI Flash:小容量场景的稳妥之选

SPI Flash,也叫NOR Flash,通过SPI接口通信。我最早接触LVGL图片加载时用的就是它,因为简单、稳定、生态成熟。

优点

  • 接口简单:4根线(CS、SCK、MOSI、MISO),任何MCU都能接。
  • 随机读取快:支持XIP(片上执行),可以直接映射到地址空间,CPU像读内部Flash一样读它。
  • 可靠性高:坏块率极低,几乎不需要ECC校验。
  • 驱动成熟:LVGL自带SPI Flash的图片解码接口,移植工作量小。

缺点

  • 容量天花板低:市面上主流SPI Flash最大也就256Mb(32MB),存几张全屏图片就满了。
  • 写入速度慢:页编程通常需要几毫秒,擦除一个扇区更是几百毫秒起步。
  • 单位成本高:按MB算,比SD卡和NAND贵不少。

适用场景:图片总量小于16MB、对可靠性要求高、不想折腾文件系统的项目。比如智能家居面板、小尺寸穿戴设备。

我的习惯:如果图片总量在8MB以内,我首选SPI Flash。直接做内存映射,LVGL读图就像读数组一样快,省去文件系统开销。

4.2 SD卡:大容量场景的性价比之王

SD卡,大家都不陌生。我做过一个车载仪表盘项目,存了200多张导航地图切片,总容量接近2GB,用的就是SD卡。说实话,当时也想过用NAND,但考虑到开发周期,还是选了SD卡。

优点

  • 容量大:从几百MB到几十GB,随便选。
  • 成本低:单位存储成本远低于SPI Flash。
  • 可插拔:方便用户自己更新图片资源,插上电脑就能拷。
  • 文件系统友好:FAT32/exFAT原生支持,LVGL通过FatFs或LittleFS就能读写。

缺点

  • 速度不稳定:SD卡读取速度受卡本身质量、SPI模式还是SDIO模式影响很大。我遇到过劣质卡,读取一张100KB的图片要200ms,简直崩溃。
  • 可靠性一般:频繁写入容易坏,而且不支持坏块管理(除非用SDIO+高级驱动)。
  • 体积大:座子占PCB面积,不适合超薄设备。
  • 功耗高:工作电流几十mA,电池供电的设备要掂量掂量。

我曾经踩过的坑:用SPI模式驱动SD卡,时钟频率设到20MHz,结果读出来的图片花屏。后来发现是线太长信号质量不行。降频到10MHz才稳定。所以,SD卡的高速模式对硬件布局要求很高,别光看理论速度。

4.3 NAND Flash:大容量+高性能的进阶选择

NAND Flash,就是固态硬盘和U盘里用的那种颗粒。在嵌入式领域,它通常通过SPI或QSPI接口连接(比如SPI NAND)。我最近一个工业HMI项目用的就是SPI NAND,512MB容量,存了上千张图标和背景图。

优点

  • 容量大:从128MB到几GB,轻松覆盖大型图库需求。
  • 读写速度快:连续读取速度比SPI Flash快一个数量级,适合批量加载图片。
  • 单位成本低:比SPI Flash便宜,接近SD卡。
  • 体积小:芯片封装,不占空间。

缺点

  • 需要坏块管理:NAND出厂就有坏块,使用过程中还会产生新坏块。必须做坏块跳过和ECC校验。
  • 驱动复杂:需要实现磨损均衡、垃圾回收、ECC纠错。LVGL没有原生支持,得自己封装一层。
  • 不支持XIP:不能像SPI Flash那样直接映射,必须先把图片读到RAM里再解码。
  • 可靠性不如SPI Flash:数据保持能力弱,长期存储需要定期刷新。

适用场景:图片总量超过32MB、需要频繁更新图片库、对成本敏感但对开发周期不敏感的项目。比如工业HMI、医疗设备、广告机。

4.4 三者在LVGL图片加载场景下的核心对比

光看参数不够,咱们直接对比在LVGL图片加载中的实际表现。我整理了一张表,你一看就明白。

对比维度 SPI Flash SD卡 NAND Flash
典型容量 1MB ~ 32MB 128MB ~ 32GB 128MB ~ 4GB
随机读取速度 快(支持XIP) 中(受卡质量影响) 中(需先读到RAM)
连续读取速度 慢(~10MB/s) 中(~20MB/s SPI模式) 快(~40MB/s QSPI模式)
写入速度 慢(页编程几ms) 中(取决于卡) 快(页编程几百μs)
可靠性 高(无需ECC) 中(易坏) 低(需ECC+坏块管理)
驱动复杂度 低 中 高
LVGL集成难度 低(直接内存映射) 中(需文件系统) 高(需封装存储层)
单位成本 高 低 中
典型应用 小屏设备、图标库 大图库、可插拔场景 工业HMI、大容量嵌入式

4.5 选型决策流程

你可能会问:那我到底该选哪个?别急,我画了一张决策流程图,你按步骤走就行。

外部存储选型决策流程 开始选型 图片总量是否 < 32MB? (含未来扩展余量) 是 否 SPI Flash 直接内存映射 需要可插拔? 或需要文件系统? 开发周期紧? (小于2周) 是 否 SD卡 注意信号完整性 NAND Flash 做好坏块管理+ECC 提示:如果图片总量刚好在32MB边界,优先选SPI Flash + 图片压缩,实在不够再考虑SD卡或NAND

4.6 我的个人建议

做了这么多年嵌入式UI,我总结了几条经验,供你参考:

  • 图片总量 < 16MB:无脑选SPI Flash。省心、稳定、LVGL集成最简单。我习惯用W25Q系列,驱动代码网上大把,改改就能用。
  • 图片总量 16MB ~ 128MB:看需求。如果需要用户频繁更新图片(比如通过USB拷贝),选SD卡。如果不需要,选SPI NAND,成本比SD卡低,速度比SPI Flash快。
  • 图片总量 > 128MB:SD卡或NAND Flash二选一。SD卡开发快,NAND Flash更可靠。我个人偏向NAND,因为工业场景下SD卡座容易松动,接触不良会导致读图失败。

避坑指南:不管你选哪种存储,一定要在项目初期就确定好图片的存储格式和加载策略。我曾经有个项目,中途从SPI Flash换成SD卡,结果文件系统层、缓存层、解码层全都要改,折腾了两周。选型这件事,越早定下来越好。