ST意法半导体
直播中

张国厚

8年用户 1448经验值
私信 关注
[问答]

为什么无法将帧缓冲区放在靠近每个的外部RAM中?

大家好,
我目前正在使用 Touchgfx 在带有 STM32F469II、外部 RAM/FLASH、SD 卡和 1024x600 屏幕的定制板上开发一个项目。
我无法将帧缓冲区放在靠近每个的外部 RAM 中。现在,“TouchGFXHAL.cpp”中的以下配置运行良好:
setFrameBufferStartAddresses((void*)0xC0000000, (void*)0xC0200000, (void*)0xC0400000);
参数如下:
- 第一个地址是第一个帧缓冲区的开始。
- 第二个地址是第二个帧缓冲区的开始(用于多缓冲)。
- 第三个地址是动画存储空间的开始(用于屏幕之间的滑动转换)。
所有这些都放在自定义板的外部 RAM 空间中,从 0xC0000000 到 0xC07FFFFF (8 MB)。
这样,添加了第四个也是最后一个空间,它是动态位图缓存,用于存储 SD 卡中的图像,以使用 TouchGFX 在屏幕上显示。
然而,当我想最大化第四个空间以获得尽可能多的空间来存储 SD 卡中的图像时(例如,占用大量空间的背景),我在减少之间的空间时遇到了很多麻烦帧缓冲区,这是我到目前为止发现的:
  • 设置好后,我可以毫不费力地将图片从 SD 卡下载到缓存中。

  • 理论上,在我的 RGB565 配置中,每个帧缓冲区应该正好采用 (1024*600*16)/8 = 0x12C000,这意味着我应该能够像这样设置帧缓冲区:setFrameBufferStartAddresses((void*)0xC0000000, (void* )0xC012C000, (无效*)0xC0258000); 0x47C000 空间用于位图缓存存储。

  • 我可以将第三个帧缓冲区设置为最小大小,这意味着位图缓存可以从 0xC052C000 开始,大小为 0x2D4000。

  • 但是,一旦我减少任何其他帧缓冲区(甚至一个字节)之间的空间,屏幕上的图像就会开始抖动,有时当屏幕上的图像是静态的时会随机抖动,而在执行转换时会更多(任何他们)。

  • 我限制帧缓冲区之间的空间越多,这种晃动似乎就越大(不是 100% 确定那个)。

  • 删除第二个和/或第三个帧缓冲区不会改变任何东西(图像仍在摇晃)。

  • 更改 LTDC 参数(门廊、同步等)似乎无法解决问题,只能移动屏幕上的图片区域。

  • 调试时,如果我去观察每个帧缓冲区占用的内存,我确实可以看到不应该有数据的地方没有数据(即对于第一个帧缓冲区,屏幕的像素按预期停在0xC012C000并且没有数据直到下一个帧缓冲区位于 0xC0200000)。

  • 更改类型或转换速度不能解决问题。
我已经联系了屏幕制造商,他们告诉我这可能是因为 DMA2D 可以配置为 8/16/32 位访问,错误的对齐可以解释抖动。但是,由于他不太确定如何检查 DMA2D 访问大小以及是否真的是导致摇晃的原因,我想问一下是否有人遇到过这个问题,如果遇到过如何解决这个问题。






回帖(1)

薛珊珊

2023-1-4 10:22:18
您需要阅读 LTDC appnotes ,仅供参考 LTDC 需要帧缓冲区起始地址满足某些条件。例如不能按一个字节或一个字****...
第二个条件是 FMC SDRAM 在 bank 上访问,最佳是在分离的 bank 上的每个缓冲区。在你的 SDRAM 上,也许一个 bank 是 2M 并且有四个。
当你需要的时候你可以只降低帧率又名点时钟然后LTDC和FMC可以配合其他地址,但这需要满足基本条件,例如必须是64的倍数......
举报

更多回帖

发帖
×
20
完善资料,
赚取积分