
前言 在一些图形界面应用中,系统架构会时常考虑使用 FSMC 接口来驱动 8080 接口的 LCD 屏。在 MCU 渲染完成,将framebuffer 发送到 LCD 时,有可能会遇到存儲大小端的问题。STM32 MCU 都采用 ARM Cortex 内核,内存使用小端格式。而 intel 8080 接口的 LCD 在传输 RGB 数据时,使用的是大端格式。MCU 在传输 RGB 数据时,字节序有可能不匹配。 在图形界面应用中,像素格式一般会使用 RGB888 或 RGB565。而在使用 FSMC 接口驱动 8bit 位宽的 LCD 时,很可能会使用 RGB565 格式。本文中会介绍两种方法来处理 8bit 8080 接口 RGB565 格式图像数据字节序问题。 图像数据字节序 8bit 8080 LCD 在接收 RGB565 数据时,会将第一个字节解析为{R4-R0,G5-G3}, 第二个字节解析为{G2-G0,B4-B0},并按这个顺序接收所有数据,如下图: ![]() 而在 MCU 内存中,数据按小端格式存放,RGB565 数据存放的字节序如下: ![]() 如果不做调整直接将 RGB 数据发给 LCD,MCU 会先发送 Byte 0,再发送 Byte 1,这样 LCD 显示的内容就会错乱。对比上面两张图可以看出,只需将内存中 Byte 0 与 Byte 1 字节位置对调(Byte swap),就能满足 LCD 接口的字节序要求。可以直接使用 CPU 进行 Byte swap,但这会消耗过多 CPU 算力,同时也会占用更多内存。这里我们将使用硬件进行 Byte swap. DMA2D 进行 Byte swap DMA2D 是 ST 为图形应用专门设计并优化的 2D 加速引擎,拥有丰富的功能。其字节序重排功能包含了 Red blueswap 以及 Byte swap 特性。Red blue swap 特性在 L4 和 L4+系列 MCU 都支持,而 Byte swap 仅在 L4+系列有支持。在 L4+系列上,通过配置 DMA2D_OPFCCR 寄存器的 SB 位,即可使能 Byte swap 功能,在 DMA2D 的 outputFIFO 中完成字节序调整,如下图: ![]() 因此在图形界面应用中,需要 Byte swap 时,可以考虑用 DMA2D 来传输 RGB 数据给 LCD。 GPDMA 进行 Byte swap 在新推出的 U5 系列芯片上,集成了 GPDMA 模块。这是新的通用 DMA 模块,能在传输数据的同时,还有丰富的数据处理能力。在初始化 GPDMA 时,通过配置源和目的数据位宽为 DMA_SRC_DATAWIDTH_WORD,在数据处理中配置 DataExchange 为 DMA_EXCHANGE_DEST_BYTE,如下面代码,也能实现 Byte swap 功能。
这样,在图形应用中,既能使用 DMA2D 加速渲染过程,也能使用 GPDMA 的数据处理能力。通过 GPDMA 直接向FSMC 接口输出 Byte swap 后的 RGB565 格式的图形数据给 LCD。 小结 在驱动 8 位 8080 接口 LCD 时,需要注意图像数据字节序问题。使用 RGB565 格式时,可以使用 DMA2D 或 GPDMA来传输图像数据,同时对图像数据做 Byte swap 调整,满足 LCD 的字节序要求。 完整版请查看:附件 |
LAT0815_驱动8位8080接口LCD时的字节序问题.pdf
下载345.32 KB, 下载次数: 0
STM32 GUI LTDC 最大像素时钟评估方法
【STM32U3评测】SPIDMA发送
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
【NUCLEO-WB09KE评测】USART的printf和GPIO的使用
STM32功能安全设计包,助力产品功能安全认证