1. 引言
某客户项目需要在正常显示的基础上,增加垂直方向镜像特性,目标 MCU 是STM32L4R9。客户希望能够从硬件层面实现这个特性,避免引入两套 UI 资源和代码增加资源占用。
2. 调研
STM32L4R9 的 GFXMMU 外设原本用于减少非矩形显示面板的帧缓存占用,大致思路是将帧缓存按照物理显示的形状映射到一个虚拟空间,形状通过 LUT 来描述。对该虚拟空间的访问,会通过 LUT 来判断是否会被映射到物理内存,以及具体位置。如果把 Chrom-GRC 中的第一段映射到 Frame Buffer 中的倒数第一行,第二段映射到倒数第二行,以此类推,Frame Buffer 中的图像,在 CFXMMU 的虚拟空间中就是按照垂直镜像的方式存在的。我们可以通过反序加载 GFXMMU 的 LUT 来实现这个功能。
3. 实现
STM32L4R9-Discovery 板自带一块 390x390 分辨率的 LCD。我们首先在 GFXMMU 中开辟一块空间(0-389 行)按正序加载 LUT;再开辟第二块空间(390-779)按反序加载 LUT。然后将 LTDC Frame Buffer 地址向后偏移 390 行指向第二块空间。这样当 LTDC 取 Frame Buffer 第一行数据时,会被映射到物理内存的倒数第一行;取 Frame Buffer 第二行数据时,会被映射到物理内存的倒数第二行;以此类推,最终在屏幕上呈现出垂直镜像的效果。关键代码见图 2,详细代码请参考演示工程。运行结果见图 3
图2. 反序加载 LUT,调整 LTDC Frame Buffer 地址
图3. 运行结果(左:正常显示,右:垂直镜像)
4. 小结
通过 GFXMMU 外设,可以实现显示垂直镜像而无需要引入额外工作量。
|