硬汉嵌入式论坛

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

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

积分
122000
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

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

谢谢告知最终原因
回复

使用道具 举报

0

主题

39

回帖

39

积分

新手上路

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-11 10:41 , Processed in 1.156851 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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