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的电路设计并不复杂,但有几个细节要注意:
- 信号线等长:QuadSPI的四条数据线(IO0~IO3)尽量走等长,误差控制在±5mm以内。高频信号下,不等长会导致时序偏移。
- 串阻匹配:每条信号线上串联22Ω~33Ω电阻,靠近MCU端放置。这个电阻能抑制信号反射,我一般选33Ω。
- 去耦电容:Flash的VCC引脚放一个100nF陶瓷电容,尽量靠近引脚。别小看这个电容,少了它,Flash在高频读写时容易出错。
- 片选信号:如果板上只有一颗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控制器送到屏幕。
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打样后返工要省事得多。