
分类
技术干货
SPI屏幕刷新之DMA
简介
现在移植LVGL比较多,涉及到屏幕的刷新,网上的例程刷TFT屏幕基本上用普通的SPI比较多,刷屏都比较慢,能肉眼看到卷屏,但DMA刷屏就非常快,这里用例程比较下2者的速度。
简介:现在移植LVGL比较多,涉及到屏幕的刷新,网上的例程刷TFT屏幕基本上用普通的SPI比较多,刷屏都比较慢,能肉眼看到卷屏,但DMA刷屏就非常快,这里用例程比较下2者的速度。🚀 GD32E230 驱动 LCD 刷屏优化:SPI DMA 方案实现 10 倍性能提升
在嵌入式 GUI(如 LVGL)开发中,屏幕刷新率是决定系统流畅度的关键。本文以官方的 GD32E230 例程为基础,深度对比了 普通 SPI 与 SPI + DMA 方式在 LCD 刷屏时的性能差异,并分享了相关的屏幕驱动芯片超频经验。
硬件背景:
GD32E230 主频为 72MHz,其 SPI 最大速度设置为2分频,即 36MHz。(GD32的2条AHB都是满速总线(72M),DMA效率很高,单色刷屏都刷得屏幕撕裂了)。后面还加了一元包邮的CW32F030的DMA 刷屏,CW32的固件比起GD库有点乱, CW32的SPI 32M,GD的DMA更高效点,刷屏35ms,CW要51ms
📊 1. 核心数据:普通 SPI vs DMA 性能对比
经过实测,在相同的 18MHz SPI 速率下,普通模式与 DMA 模式的刷新耗时有着天壤之别,DMA 方式整体性能提升了 7 ~ 10 倍!
| 测试项目 | 普通 SPI 耗时 (原例程) | SPI + DMA 耗时 (优化后) | 性能提升倍数 |
| 单色全屏刷新 | 207 ms | 35 ms | **~ 6 倍** |
| 16 号字体长字符串 | 762 ms | 60 ms | **~ 12 倍** |
| 16 号单个字符 | 20 ms | 1 ms | 20 倍 |
| 24 号单个字符 | 45 ms | 3 ms | 15 倍 |
⚡ 2. LVGL 移植强烈建议:使用“非阻塞式” DMA
要在微控制器上流畅运行 LVGL 等 GUI 框架,强烈建议使用 DMA 模式。而 DMA 模式在实际应用中又分为两种:
-
阻塞式 DMA:
单次刷屏时,CPU 必须死等 SPI + DMA 传输完成才能进入下一步。这种方式下,CPU 计算渲染 与 SPI 数据传输 无法并行处理,效率依然受限。 -
非阻塞式 DMA(本文采用的方式):
在 DMA 中设置静态标志变量,将数据丢给 DMA 后,CPU 立刻返回去处理 LVGL 的下一帧渲染或其他核心逻辑。当 DMA 硬件发送完毕后触发中断,自动修改标志位。
优势:每次准备发送下一次 DMA 前,只需判断上次 DMA 是否发送完毕即可。CPU 渲染与 DMA 传输完美并行,极大压榨了 MCU 性能!
🛠️ 3. 驱动代码优化与配置
3.1 切换 DMA 模式
在项目驱动包 gd32e231_lcd_eval.c 文件中,我们通过宏开关来控制发送模式。只需将相关的宏注释掉即可无缝切换为 DMA 方式:
// 在 gd32e231_lcd_eval.c 中
// 注释掉以下宏定义,程序自动切换为 非阻塞式 DMA 发送模式
// #define DMA_TX
3.2 兼容 ILI9341 与 ILI9342C 横屏版
本项目默认使用 ILI9341 的横屏衍生版本 ILI9342C。如果您手头的屏幕是标准的 ILI9341,只需修改初始化代码中的 0x36(显存数据访问控制)寄存器参数:
// 发送 0x36 寄存器指令
lcd_write_index(0x36);
#ifdef H_VIEW
// 如果是标准 ILI9341 需要横屏,将 0xA8 改成 0xE8 即可
lcd_write_data(0xE8);
// lcd_write_data(0xA8); // ILI9342C 默认配置
#else
// 竖屏模式配置
lcd_write_data(0x48); // 或 0xC8
#endif
📈 4. 常见 LCD 驱动芯片极限速率测试分享
在优化软件 DMA 之外,硬件 SPI 速率也是关键。根据实测经验,不同屏幕驱动IC的“体质”有所不同:
-
📉 ILI9341:官方手册标称 SPI 极限为 40MHz。实测可以超频跑到 64MHz 左右,但当 SPI 时钟超过 80MHz 时,屏幕会出现严重的“花屏”或画面撕裂。
-
📈 ST7789:抗超频能力更优,实测在 80MHz 的 SPI 时钟下依然能稳定工作。
-
🤝 国产 NV 系列:目前市面上的国产 NV 芯片基本做到与 ST7789 完美兼容,仅在初始化序列上存在微小差异,SPI 高速稳定性同样表现出色。
总结:通过启用非阻塞式 DMA 与合理的屏幕驱动寄存器调优,即便是主频仅为 72MHz 的入门级 MCU(GD32E230),依然能够流畅驱动彩色液晶屏并跑起顺滑的 GUI 界面。







评论