硬汉嵌入式论坛

 找回密码
 立即注册
查看: 959|回复: 12
收起左侧

STM32F429 + 16位SDRAM + LTDC 驱动 800x480 RGB565 屏幕,LVGL 局部刷新 + 硬件双缓冲时显示异常

  [复制链接]

2

主题

1

回帖

7

积分

新手上路

积分
7
发表于 2026-3-24 22:36:39 | 显示全部楼层 |阅读模式
背景
       我用的野火挑战者开发核心板V1,STM32F429,我正在使用 STM32F429 外挂 16 位 SDRAM(IS42S16400J-7TLI容量 8MB,FMC 接口),
通过 LTDC 驱动 800×480 RGB565 屏幕。
软件使用 LVGL v9,用的STM32F4标准库,希望通过 LTDC 硬件双缓冲(两个完整的帧缓冲区位于 SDRAM)实现无撕裂显示。
我单片机内部RAM空间有限,只能采用LVGL局部缓冲区方式,通过DMA2D将缓冲区搬运到LTDC显示缓冲区显示(显示异常)
问题现象
  • 屏幕会出现花屏小点。
  • 降低 LTDC 像素时钟后现象依然存在。

硬件平台
  • MCU:STM32F429IGT6
  • SDRAM:16位数据宽度,时钟 90MHz
  • 屏幕:800×480 RGB565,LTDC 像素时钟约 25MHz。
  • 总线:LTDC 和 CPU/DMA2D 都访问 SDRAM,存在竞争。

我的困惑
  • 在 16 位 SDRAM 带宽有限的情况下,如何正确实现硬件双缓冲 + LVGL 局部刷新,避免画面回退又不至于整帧复制?
  • 是否有现成的开源工程(STM32F429 + 16位 SDRAM + LTDC + LVGL)可以参考?
  • 是否存在更优的架构(如利用 LTDC 多层、使用 DMA2D 的特定模式)来避免整帧复制?

希望有经验的朋友指点迷津,提供代码示例或思路,感谢!









LVGL更新脏矩阵有白点

LVGL更新脏矩阵有白点

滑动条显示异常白条

滑动条显示异常白条
IMG_20260324_205547.jpg
回复

使用道具 举报

2

主题

1

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2026-3-24 22:41:26 | 显示全部楼层

STM32F429 + 16位SDRAM + LTDC 驱动 800x480 RGB565 屏幕,LVGL 局部刷新 + 硬件双缓冲时显示异常

背景
       我用的野火挑战者开发核心板V1,STM32F429,我正在使用 STM32F429 外挂 16 位 SDRAM(IS42S16400J-7TLI容量 8MB,FMC 接口),
通过 LTDC 驱动 800×480 RGB565 屏幕。
软件使用 LVGL v9,用的STM32F4标准库,希望通过 LTDC 硬件双缓冲(两个完整的帧缓冲区位于 SDRAM)实现无撕裂显示。
我单片机内部RAM空间有限,只能采用LVGL局部缓冲区方式,通过DMA2D将缓冲区搬运到LTDC显示缓冲区显示(显示异常)
问题现象
  • 屏幕会出现花屏小点。
  • 降低 LTDC 像素时钟后现象依然存在。

硬件平台
我的困惑
  • 在 16 位 SDRAM 带宽有限的情况下,如何正确实现硬件双缓冲 + LVGL 局部刷新,避免画面回退又不至于整帧复制?
  • 是否有现成的开源工程(STM32F429 + 16位 SDRAM + LTDC + LVGL)可以参考?
  • 是否存在更优的架构(如利用 LTDC 多层、使用 DMA2D 的特定模式)来避免整帧复制?

希望有经验的朋友指点迷津,提供代码示例或思路,感谢!

有白点

有白点

有白点

有白点

脏矩阵区域白点

脏矩阵区域白点

F429_767_挑战者V1核心板-原理图.pdf

163.48 KB, 下载次数: 3

回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
122716
QQ
发表于 2026-3-25 09:21:18 | 显示全部楼层
有个问题,就是普通的单缓冲和双缓冲是不是正常。
回复

使用道具 举报

6

主题

158

回帖

176

积分

初级会员

积分
176
发表于 2026-3-25 09:34:36 | 显示全部楼层
你说的 硬件双缓冲 + LVGL 局部刷新 在lvgl9 里面应该就是 lv_display_set_buffers(disp, buf_3_1, buf_3_2, sizeof(buf_3_1), LV_DISPLAY_RENDER_MODE_DIRECT); 里面两个缓冲区同步时就只复制和重绘改变的区域
disp_flush 里面只要切换ltdc的缓冲区地址
回复

使用道具 举报

2

主题

1

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2026-3-25 16:51:54 | 显示全部楼层
我找到原因了,
首先我的FMC配置是突发长度是8

我的图像出现小白点是因为出现了总线竞争。
LTDC会按照固定周期占用STM32F429的FMC总线获取SDRAM图像数据,
而我在lvgl中通过DMA2D将lvgl缓冲区数据搬运到LVGL缓冲区,也会占用FMC总线。
在DMA2D与LTDC同时占用FMC总线,LTDC要显示图像,由于DMA占用总线突发长度8,导致这部分读出来会显示小白点。
我将突发长度改为1就避免了总线竞争问题,但降低了SDRAM带宽利用率下降。
我后面采用在LTDC垂直消影期间进行DMA2D搬运,让他们交替占用总线,将突发长度改为4也能完美运行。

评分

参与人数 1金币 +2 收起 理由
eastonye + 2 赞一个!

查看全部评分

回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
122716
QQ
发表于 2026-3-26 07:44:06 | 显示全部楼层
sfhd 发表于 2026-3-25 16:51
我找到原因了,
首先我的FMC配置是突发长度是8

谢谢告知最终原因
回复

使用道具 举报

0

主题

40

回帖

40

积分

新手上路

积分
40
发表于 2026-3-27 10:33:36 | 显示全部楼层
难得见到提出问题,解决后能告知问题是如何解决的,赞一个。
回复

使用道具 举报

734

主题

3876

回帖

6103

积分

论坛元老

自定义头衔

积分
6103
发表于 2026-4-23 15:16:04 | 显示全部楼层
sfhd 发表于 2026-3-25 16:51
我找到原因了,
首先我的FMC配置是突发长度是8


有提供解决好后的驱动吗 ?
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
122716
QQ
发表于 2026-4-24 08:14:53 | 显示全部楼层
hpdell 发表于 2026-4-23 15:16
有提供解决好后的驱动吗 ?

这个就可以的。

基于V5,V6和V7的LVGL模板,驱动支持单缓冲,双缓冲和配合硬件消隐的双缓冲,以及电容和电阻触摸全支持(2023-07-19)
https://forum.anfulai.cn/forum.p ... 0161&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

734

主题

3876

回帖

6103

积分

论坛元老

自定义头衔

积分
6103
发表于 2026-4-25 09:41:32 | 显示全部楼层
eric2013 发表于 2026-4-24 08:14
这个就可以的。

基于V5,V6和V7的LVGL模板,驱动支持单缓冲,双缓冲和配合硬件消隐的双缓冲,以及电容 ...

回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
发表于 昨天 09:37 | 显示全部楼层
我也在做类似的,不过我是480*272,ARGB888,内部开了DMA2D加速LVGL渲染,用了两个局部双缓冲放在AXI SRAM,然后外部也是16位SDRAM,LVGL画内部缓存区1的时候就用MDAM搬运内部缓存区2到外部缓存区1,LTDC显示外部缓存区2,我想问一下楼主为什么你的DMA搬运的时候要在垂直消影的时候搬,按理来说带宽足够就算有总线竞争也是很短一段时间,大部分时候总线是空闲的吧
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
122716
QQ
发表于 昨天 09:42 | 显示全部楼层
kinh 发表于 2026-5-23 09:37
我也在做类似的,不过我是480*272,ARGB888,内部开了DMA2D加速LVGL渲染,用了两个局部双缓冲放在AXI SRAM,然后 ...

垂直消隐很重要,否则会有撕裂问题。

【实战技能】基于硬件垂直消隐的多缓冲技术在LVGL, emWin,GUIX和TouchGFX应用,含视频教程
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=120114

点评

我的LTDC是在垂直消影的时候更换的缓冲区指针,LTDC通过FMC获取缓存区1的时候,DMA搬运LVGL画好的内部缓存到外部SDRAM的缓存区2没有必要在垂直消影的时候搬运吧,虽然会有总线竞争但是带宽足够而且LTDC的优先级最高,按  详情 回复 发表于 昨天 10:13
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
发表于 昨天 10:13 | 显示全部楼层
eric2013 发表于 2026-5-23 09:42
垂直消隐很重要,否则会有撕裂问题。

【实战技能】基于硬件垂直消隐的多缓冲技术在LVGL, emWin,GUIX ...

我的LTDC是在垂直消影的时候更换的缓冲区指针,LTDC通过FMC获取缓存区1的时候,DMA搬运LVGL画好的内部缓存到外部SDRAM的缓存区2没有必要在垂直消影的时候搬运吧,虽然会有总线竞争但是带宽足够而且LTDC的优先级最高,按理来说不会造成撕裂
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-5-24 05:00 , Processed in 1.433358 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表