站内搜索
发作品签到
SPI屏幕刷新之DMA

分类

技术干货

SPI屏幕刷新之DMA

原创
68
0
0
1

简介

现在移植LVGL比较多,涉及到屏幕的刷新,网上的例程刷TFT屏幕基本上用普通的SPI比较多,刷屏都比较慢,能肉眼看到卷屏,但DMA刷屏就非常快,这里用例程比较下2者的速度。

简介:现在移植LVGL比较多,涉及到屏幕的刷新,网上的例程刷TFT屏幕基本上用普通的SPI比较多,刷屏都比较慢,能肉眼看到卷屏,但DMA刷屏就非常快,这里用例程比较下2者的速度。
更新时间:2026-05-07 14:39:10

🚀 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 模式在实际应用中又分为两种:

  1. 阻塞式 DMA
    单次刷屏时,CPU 必须死等 SPI + DMA 传输完成才能进入下一步。这种方式下,CPU 计算渲染 与 SPI 数据传输 无法并行处理,效率依然受限。

  2. 非阻塞式 DMA(本文采用的方式)
    在 DMA 中设置静态标志变量,将数据丢给 DMA 后,CPU 立刻返回去处理 LVGL 的下一帧渲染或其他核心逻辑。当 DMA 硬件发送完毕后触发中断,自动修改标志位。
    优势:每次准备发送下一次 DMA 前,只需判断上次 DMA 是否发送完毕即可。CPU 渲染与 DMA 传输完美并行,极大压榨了 MCU 性能!

 

🛠️ 3. 驱动代码优化与配置

3.1 切换 DMA 模式

在项目驱动包 gd32e231_lcd_eval.c 文件中,我们通过宏开关来控制发送模式。只需将相关的宏注释掉即可无缝切换为 DMA 方式:

codeC
 
// 在 gd32e231_lcd_eval.c 中
// 注释掉以下宏定义,程序自动切换为 非阻塞式 DMA 发送模式
// #define DMA_TX

3.2 兼容 ILI9341 与 ILI9342C 横屏版

本项目默认使用 ILI9341 的横屏衍生版本 ILI9342C。如果您手头的屏幕是标准的 ILI9341,只需修改初始化代码中的 0x36(显存数据访问控制)寄存器参数:

codeC
 
// 发送 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 界面。

添加到专辑
0
0
分享
侵权投诉

附件

序号文件名称下载次数
1
GD32E230_dma_spi.rar
0
2
CW32F030C8T6_ili9342C_DMA.rar
0

评论

全部评论(1
按时间排序|按热度排序

底部导航