工程师笔记 | 驱动 8 位 8080 接口 LCD 时的字节序问题

发布时间:
来源: 电子工程世界

前言

在一些图形界面应用中,系统架构会时常考虑使用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的字节序要求。


文章来源于: 电子工程世界 原文链接

本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。