2. 硬件环境准备:STM32F429/F746等带DMA2D的MCU选型,外部Flash/SRAM电路设计要点

做LVGL外部存储加载图片,说白了就是让MCU从外部Flash里把BMP文件读出来,再通过DMA2D转成显示屏能认的格式。这个过程中,MCU选型和外部存储电路设计是地基。地基没打好,后面软件写得再漂亮也白搭。

我这些年经手过好几个基于LVGL的项目,从智能家居面板到工业手持设备,踩过的坑不少。今天就把硬件选型和电路设计这块的经验掰开揉碎了讲给你听。

2.1 为什么必须选带DMA2D的MCU?

先回答一个常见问题:STM32F1/F4不带DMA2D的型号能不能做?能,但你会很痛苦。

LVGL在刷新屏幕时,每一帧都要把像素数据从存储格式(比如BMP的RGB565)搬运到显存里。没有DMA2D,CPU就得亲自干这个活。我测过一次,在180MHz的STM32F429上,用CPU搬运一张800×480的图片,帧率直接掉到15fps以下,界面卡得没法看。

DMA2D是ST专门为图形加速设计的2D DMA控制器。它能做三件事:

  • 内存到内存搬运:把数据从Flash搬到SRAM
  • 色彩格式转换:比如ARGB8888转RGB565,硬件自动完成
  • 像素混合:Alpha混合、颜色填充等

说白了,DMA2D就是给CPU配了个图形搬运工。CPU只需要告诉它“从哪搬、搬到哪、搬多少”,然后就可以去干别的事了。

核心结论:做LVGL图片加载,DMA2D不是可选项,是必选项。STM32F429、F746、H743这些带DMA2D的型号才是正选。

2.2 主流带DMA2D的MCU选型对比

我整理了一份选型对比表,覆盖了目前市面上最常用的几款。你选型时可以直接参考。

型号 内核 主频 DMA2D通道 内部SRAM 外部存储接口 典型应用场景
STM32F429 Cortex-M4 180MHz 1路 256KB FMC(支持NOR/NAND/SRAM) 中小尺寸屏(480×272以下)
STM32F746 Cortex-M7 216MHz 1路 320KB FMC + QuadSPI 中尺寸屏(800×480)
STM32H743 Cortex-M7 480MHz 2路 1MB FMC + OctoSPI 大尺寸屏(1024×600以上)
STM32H750 Cortex-M7 480MHz 2路 1MB FMC + OctoSPI 性价比之选,Flash稍小

我个人习惯是:预算允许就上H7系列。F429虽然便宜,但内部SRAM只有256KB,做双缓冲时捉襟见肘。F746是个折中方案,性能够用,价格也还能接受。

我的经验:F429做800×480的LVGL项目,帧率能跑到30fps左右,但前提是外部SRAM要够快。如果用的是慢速SRAM,DMA2D的带宽会被拖累,帧率直接腰斩。所以选型时别只看MCU,外部存储的速度同样关键。

2.3 外部Flash选型与电路设计

外部Flash用来存图片字库等资源。LVGL加载BMP时,数据是从Flash读到SRAM,再经DMA2D转换后送到显存。所以Flash的读取速度直接影响图片加载速度。

2.3.1 接口选型:SPI Flash vs QuadSPI Flash

市面上常见的外部Flash接口有两种:

  • 普通SPI Flash:单线传输,时钟最高约80MHz,理论带宽约10MB/s
  • QuadSPI Flash:四线传输,时钟最高约80MHz,理论带宽约40MB/s

你想想看,一张800×480的BMP图片(RGB565格式)大约768KB。用SPI Flash读,需要约75ms;用QuadSPI Flash读,只需要约19ms。这个差距在LVGL的动画场景下非常明显。

我曾经踩过的坑:第一次做项目时选了W25Q64(普通SPI Flash),结果加载图片时屏幕有明显的“撕裂感”。后来换成QuadSPI Flash,问题立刻解决。所以我的建议是:只要MCU支持QuadSPI,就别用普通SPI Flash。

2.3.2 电路设计要点

QuadSPI Flash的电路设计并不复杂,但有几个细节要注意:

  1. 信号线等长:QuadSPI的四条数据线(IO0~IO3)尽量走等长,误差控制在±5mm以内。高频信号下,不等长会导致时序偏移。
  2. 串阻匹配:每条信号线上串联22Ω~33Ω电阻,靠近MCU端放置。这个电阻能抑制信号反射,我一般选33Ω。
  3. 去耦电容:Flash的VCC引脚放一个100nF陶瓷电容,尽量靠近引脚。别小看这个电容,少了它,Flash在高频读写时容易出错。
  4. 片选信号:如果板上只有一颗Flash,片选(CS)可以直接拉低或接GPIO。如果有多个设备共用QuadSPI总线,片选必须独立控制。

推荐型号:W25Q64JV(8MB,QuadSPI)、W25Q128JV(16MB,QuadSPI)。这两颗芯片性价比高,货源稳定,我几乎所有项目都在用。

2.4 外部SRAM选型与电路设计

外部SRAM的作用是给LVGL做显存和帧缓冲。LVGL的刷新机制需要至少两个缓冲区:一个用于显示,一个用于后台绘制。如果内部SRAM不够,就必须外扩。

2.4.1 SRAM vs SDRAM

很多人会纠结用SRAM还是SDRAM。我直接说结论:

类型 速度 容量 接口复杂度 成本 推荐场景
PSRAM 中(约80MHz) 小(8MB以下) 简单(SPI/QuadSPI) 低 小尺寸屏,资源紧张
SDRAM 高(约168MHz) 大(64MB以上) 复杂(需FMC+SDRAM控制器) 中 大尺寸屏,高性能需求
SRAM(并行) 高(约100MHz) 小(1MB以下) 中等(FMC接口) 高 对延迟敏感的场景

我个人习惯是:能用SDRAM就用SDRAM。虽然SDRAM的初始化时序比SRAM复杂,但容量大、成本低,而且STM32的FMC控制器已经封装好了SDRAM的驱动,你只需要配几个寄存器就行。

2.4.2 SDRAM电路设计要点

SDRAM是高速器件,布线时马虎不得。我总结了几条硬性规则:

  • 数据线分组等长:SDRAM的数据线(D0~D15)分为两组,每组内部等长,误差控制在±10mil以内。组间误差可以放宽到±50mil。
  • 地址线等长:地址线(A0~A12)与时钟线(CLK)等长,误差控制在±20mil以内。
  • 时钟线优先:CLK信号要走在内层,两侧包地,远离其他高速信号。时钟是SDRAM的命脉,一点干扰都不能有。
  • 去耦电容阵列:SDRAM的VDD和VDDQ引脚各放一个100nF电容,另外在PCB背面放一个10μF钽电容做储能。
  • 终端电阻:数据线和地址线在远端加33Ω~47Ω上拉电阻到VDDQ,抑制信号反射。这个电阻不能省,否则SDRAM在高频下会随机出错。

我曾经犯过的错:有一次画SDRAM电路时偷懒,没加终端电阻。结果板子回来,SDRAM在168MHz下读写数据偶尔出错,排查了三天才找到原因。从那以后,我画SDRAM电路必加终端电阻,再也不敢省了。

2.5 整体硬件架构图

下面这张图展示了整个硬件系统的数据流。你看一眼就能明白:BMP图片从QuadSPI Flash读出,经过DMA2D色彩格式转换,最终写入SDRAM显存,由LTDC控制器送到屏幕。

LVGL外部存储加载图片硬件架构图 QuadSPI Flash 存储BMP图片文件 DMA2D 色彩格式转换 + 像素搬运 SDRAM 显存 + 帧缓冲 LTDC 液晶显示控制器 CPU (Cortex-M7) LVGL主控 + 任务调度 LCD显示屏 RGB接口 / MIPI接口 QuadSPI读取 DMA2D写入 LTDC读取 配置DMA2D 像素时钟输出 数据流说明 BMP → QuadSPI Flash → DMA2D转换 → SDRAM → LTDC → LCD

2.6 硬件选型清单总结

最后,我列一份完整的硬件选型清单。你照着这个清单去选型,基本不会出大问题。

组件 推荐型号 关键参数 注意事项
MCU STM32F746 / STM32H743 带DMA2D、FMC、QuadSPI F429慎用,SRAM太小
外部Flash W25Q128JV 16MB,QuadSPI接口 信号线加33Ω串阻
外部SDRAM IS42S16400J / W9825G6KH 64Mb~256Mb,168MHz 必须加终端电阻
电源 AMS1117-3.3 / MP2359 3.3V输出,纹波<50mV SDRAM和Flash分开供电
晶振 25MHz有源晶振 频率稳定度±25ppm 靠近MCU放置

我的建议:第一次做硬件设计时,先画原理图,再画PCB。原理图阶段就把每个引脚的电气特性确认清楚,比如Flash的IO引脚是否支持5V耐压、SDRAM的VREF电压是多少。这些细节在原理图阶段解决,比在PCB打样后返工要省事得多。