大家好,
我将
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如何处理?