ST意法半导体
直播中

崔映芬

7年用户 890经验值
私信 关注
[问答]

帧缓冲区和显示宽度之间有什么关系?

大家好,
我将 STM32L4R9AII 与我的定制板一起使用。
当我开始开发我的项目时,cubemx 不支持我的 MCU。因此,我从 Touchgfx 获得了发现板项目,并进行了很多更改以使其适应我的自定义板。
现在 cubemx 支持我的 MCU。我开始将我的项目传递给 cubemx 项目。通过 MIPI dsi,我的屏幕分辨率为 400x400px。当我从 cubemx 建立我的项目时,它并没有很好地工作。我在屏幕上放了一个盒子,我可以看到盒子的颜色,但每一行都在不同的地方。
我深入挖掘:
我将显示宽度作为 400px 传递给 cubemx。因此,Touchgfx 将 BlitOp.nSteps=400 传递给 DMA2D。
但是 GFXMMU 模块知道每行有 1024px,但显示是 400px。BlitOp.nSteps 必须是 1024。当我从新版本的 cubemx 检查我的旧项目和发现板项目时,我发现下面的代码可以修复它:
  • #define BSP_LCD_IMAGE_WIDTH     (3072 / 2)
  • #ifndef   GUI_FRAME_BUFFER_WIDTH
  • #define GUI_FRAME_BUFFER_WIDTH   BSP_LCD_IMAGE_WIDTH
  • void TouchGFXHAL::setFrameBufferStartAddresses(void* frameBuffer, void* doubleBuffer, void* animationStorage)
  • {
  •     bool useDoubleBuffering = (doubleBuffer != 0);
  •     bool useAnimationStorage = (animationStorage != 0);
  •     uint8_t* buffer = static_cast(frameBuffer);
  •     frameBuffer0 = reinterpret_cast(buffer);
  •     if (useDoubleBuffering)
  •     {
  •         buffer += GUI_FRAME_BUFFER_SIZE;
  •         frameBuffer1 = reinterpret_cast(buffer);
  •     }
  •     else
  •     {
  •         frameBuffer1 = 0;
  •     }
  •     if (useAnimationStorage)
  •     {
  •         buffer += GUI_FRAME_BUFFER_SIZE;
  •         frameBuffer2 = reinterpret_cast(buffer);
  •     }
  •     else
  •     {
  •         frameBuffer2 = 0;
  •     }
  •     USE_DOUBLE_BUFFERING  = useDoubleBuffering;
  •     USE_ANIMATION_STORAGE = useAnimationStorage;
  •     FRAME_BUFFER_WIDTH  = GUI_FRAME_BUFFER_WIDTH;  //gui_frame_buffer_width is 1024
  •     FRAME_BUFFER_HEIGHT = GUI_FRAME_BUFFER_HEIGHT;
  •     // Make note of whether we are using double buffering.
  •     doubleBufferingEnabled = useDoubleBuffering;
  •     currFbBase = frameBuffer0;
  • }
如您所见,FRAME_BUFFER_WIDTH 已更改为 GUI_FRAME_BUFFER_WIDTH。GUI_FRAMEBUFFER_WIDTH 来自 GFXMMU,即 (3072/3) 1024。所以一切正常。
frame buffer按照400x400px计算分配内存。但是我们对 toucghgfx 说,FRAME_BUFFER_WIDTH 是 1024。那一刻我很困惑。
根据上面的代码,我是否需要为帧缓冲区分配额外的内存?如果不需要,touchgfx如何处理?









回帖(1)

卢灏

2023-1-11 14:21:22
1 STM32 Chrom-GRC™ (GFXMMU) 简介 GFXMMU 是一个面向图形的内存管理单元,旨在根据显示形状优化内存使用。该外设允许微控制器仅将非矩形显示器的可见部分存储在连续的物理内存区域中,从而减少帧缓冲区内存占用。通过使帧缓冲区能够存储在内部 RAM 中并消除对外部 RAM 的需求,GFXMMU 为图形应用程序提供了高度集成的解决方案。该外设可带来更好的性能、更低的功耗和更低的系统成本。
但是你的问题是缓冲区的大小,这是大小而不是宽度
缓冲区 += GUI_FRAME_BUFFER_SIZE;
举报

更多回帖

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