前言
在一些图形界面应用中,系统架构会时常考虑使用FSMC接口来驱动8080接口的LCD屏。在MCU渲染完成,将framebuffer发送到LCD时,有可能会遇到存儲大小端的问题。STM32MCU都采用ARMCortex内核,内存使用小端格式。而intel8080接口的LCD在传输RGB数据时,使用的是大端格式。MCU在传输RGB数据时,字节序有可能不匹配。在图形界面应用中,像素格式一般会使用RGB888或RGB565。而在使用FSMC接口驱动8bit位宽的LCD时,很可能会使用RGB565格式。本文中会介绍两种方法来处理8bit8080接口RGB565格式图像数据字节序问题。
图像数据字节序
8bit8080 LCD在接收RGB565数据时,会将第一个字节解析为{R4-R0,G5-G3},第二个字节解析为{G2-G0,B4-B0},并按这个顺序接收所有数据,如下图:
而在MCU内存中,数据按小端格式存放,RGB565数据存放的字节序如下:
如果不做调整直接将RGB数据发给LCD,MCU会先发送Byte0,再发送Byte 1,这样LCD显示的内容就会错乱。对比上面两张图可以看出,只需将内存中Byte0与Byte1字节位置对调(Byteswap),就能满足LCD接口的字节序要求。可以直接使用CPU进行Byteswap,但这会消耗过多CPU算力,同时也会占用更多内存。这里我们将使用硬件进行Byteswap.
DMA2D 进行Byteswap
DMA2D是ST为图形应用专门设计并优化的2D加速引擎,拥有丰富的功能。其字节序重排功能包含了Red blueswap以及Byteswap特性。Red blueswap特性在L4和L4+系列MCU都支持,而Byteswap仅在L4+系列有支持。在L4+系列上,通过配置DMA2D_OPFCCR寄存器的SB位,即可使能Byteswap功能,在DMA2D的outputFIFO中完成字节序调整,如下图:
因此在图形界面应用中,需要Byteswap时,可以考虑用DMA2D来传输RGB数据给LCD。
GPDMA 进行Byteswap
在新推出的U5系列芯片上,集成了GPDMA模块。这是新的通用DMA模块,能在传输数据的同时,还有丰富的数据处理能力。在初始化GPDMA时,通过配置源和目的数据位宽为DMA_SRC_DATAWIDTH_WORD,在数据处理中配置DataExchange为DMA_EXCHANGE_DEST_BYTE,如下面代码,也能实现Byteswap功能。
这样,在图形应用中,既能使用DMA2D加速渲染过程,也能使用GPDMA的数据处理能力。通过GPDMA直接向FSMC接口输出Byteswap后的RGB565格式的图形数据给LCD。
小结
在驱动8位8080接口LCD时,需要注意图像数据字节序问题。使用RGB565格式时,可以使用DMA2D或GPDMA来传输图像数据,同时对图像数据做Byteswap调整,满足LCD的字节序要求。
相关文章