1.显示器的基本参数
(1) 像素
像素是组成图像的最基本单元要素,显示器的像素指它成像最小的点。
(2) 分辨率
一些嵌入式设备的显示器常常以“行像素值 x列像素值”表示屏幕的分辨率。如分辨率 800x480表示该显示器的每一行有 800 个像素点,
每一列有 480 个像素点,也可理解为有 800列,480 行。
(3) 色彩深度
色彩深度指显示器的每个像素点能表示多少种颜色,一般用“位”(bit)来表示。如单色屏的每个像素点能表示亮或灭两种状态(即实际上能显示 2 种颜色),
用 1 个数据位就可以表示像素点的所有状态,所以它的色彩深度为 1bit,其它常见的显示屏色深为16bit、24bit。
(4) 显示器尺寸
显示器的大小一般以英寸表示,如 5英寸、21 英寸、24 英寸等,这个长度是指屏幕对
角线的长度, 通过显示器的对角线长度及长宽比可确定显示器的实际长宽尺寸。
(5) 点距
点距指两个相邻像素点之间的距离,它会影响画质的细腻度及观看距离,相同尺寸的屏幕,若分辨率越高,则点距越小,画质越细腻。
如现在有些手机的屏幕分辨率比电脑显示器的还大,这是手机屏幕点距小的原因;LED 点阵显示屏的点距一般都比较大,所以适合远距离观看。
(1) RGB信号线
RGB信号线各有 8 根,分别用于表示液晶屏一个像素点的红、绿、蓝颜色分量。使用红绿蓝颜色分量来表示颜色是一种通用的做法,打开 Windows 系统自带的画板调色工具,
可看到颜色的红绿蓝分量值。常见的颜色表示会在“RGB”后面附带各个颜色分量值的数据位数,如 RGB565表示红绿蓝的数据线数分别为 5、6、5根,一共为 16个数据位,
可表示 2^16 种颜色;而这个液晶屏的种颜色分量的数据线都有 8 根,所以它支持 RGB888 格式,一共 24位数据线,可表示的颜色为 2^24 种。
(2) 同步时钟信号 CLK
液晶屏与外部使用同步通讯方式,以 CLK 信号作为同步时钟,在同步时钟的驱动下,每个时钟传输一个像素点数据。
(3) 水平同步信号 HSYNC
水平同步信号 HSYNC(Horizontal Sync)用于表示液晶屏一行像素数据的传输结束,每传输完成液晶屏的一行像素数据时,
HSYNC 会发生电平跳变,如分辨率为 800x480 的显示屏(800 列,480 行),传输一帧的图像 HSYNC的电平会跳变 480 次。
(4) 垂直同步信号 VSYNC
垂直同步信号 VSYNC(Vertical Sync)用于表示液晶屏一帧像素数据的传输结束,每传输完成一帧像素数据时,VSYNC会发生电平跳变。其中“帧”是图像的单位,一幅
图像称为一帧,在液晶屏中,一帧指一个完整屏液晶像素点。人们常常用“帧/秒”来表示液晶屏的刷新特性,即液晶屏每秒可以显示多少帧图像,如液晶屏以 60 帧/秒的
速率运行时,VSYNC每秒钟电平会跳变 60 次。
(5) 数据使能信号 DE
数据使能信号 DE(Data Enable)用于表示数据的有效性,当 DE 信号线为高电平时,RGB信号线表示的数据有效。
3. 液晶数据传输时序
液晶屏显示的图像可看作一个矩形,结合下图来理解。液晶屏有一个显示指针,它指向将要显示的像素。显示指针的扫描方向方向从左到右、从上到下,
一个像素点一个像素点地描绘图形。这些像素点的数据通过 RGB数据线传输至液晶屏,它们在同步时钟CLK 的驱动下一个一个地传输到液晶屏中,
交给显示指针,传输完成一行时,水平同步信号 HSYNC电平跳变一次,而传输完一帧时 VSYNC电平跳变一次。
液晶显示指针在行与行之间,帧与帧之间切换时需要延时,而且 HSYNC 及VSYNC 信号本身也有宽度,这些时间参数说明如下表:
在这些时间参数控制的区域,数据使能信号线“DE”都为低电平,RGB数据线的信号无效,当“DE”为高电平时,表示的数据有效,传输的数据会直接影响液晶屏的显示区域。
4. 显存
液晶屏中的每个像素点都是数据,在实际应用中需要把每个像素点的数据缓存起来,再传输给液晶屏,这种存储显示数据的存储器被称为显存。
显存一般至少要能存储液晶屏的一帧显示数据,如分辨率为 800x480 的液晶屏,使用 RGB888 格式显示,它的一帧显示数据大小为:3x800x480=1152000 字节;
若使用 RGB565 格式显示,一帧显示数据大小为:2x800x480=768000字节。
5. LTDC 液晶控制器
STM32F429 系列芯片内部自带一个 LTDC液晶控制器,使用 SDRAM 的部分空间作为显存,可直接控制液晶面板,无需额外增加液晶控制器芯片。
STM32 的 LTDC液晶控制器最高支持 800x600 分辨率的屏幕;可支持多种颜色格式,包括 RGB888、RGB565、ARGB8888 和 ARGB1555 等(其中的“A”是指透明像素);
支持 2 层显示数据混合,利用这个特性,可高效地做出背景和前景分离的显示效果,如以视频为背景,在前景显示弹幕。
LTDC的控制信号线与液晶显示面板的数据线一一对应,包含有 HSYNC、VSYNC、DE、CLK 及 RGB数据线各 8 根。设计硬件时把液晶面板与 STM32 对应的这些引脚连接起
来即可,查阅《STM32F4xx 规格书》可知 LTDC信号线对应的引脚,见下表。
时钟信号
LTDC外设使用 3 种时钟信号,包括 AHB时钟、APB2 时钟及像素时钟 LCD_CLK。
AHB时钟用于驱动数据从存储器存储到 FIFO,APB2 时钟用于驱动 LTDC 的寄存器。而LCD_CLK 用于生成与液晶面板通讯的同步时钟,见下图,它的来源是 HSE(高速外部晶振),
经过“/M”分频因子分频输出到“PLLSAI”分频器,信号由“PLLSAI”中的倍频因子 N 倍频得到“PLLSAIN”时钟、然后由“/R”因子分频得到“PLLCDCLK”时钟,
再经过“DIV”因子得到“LCD-TFT clock”,“LCD-TFT clock”即通讯中的同步时钟LCD_CLK,它使用 LCD_CLK 引脚输出。
在实际使用 LTDC控制器控制液晶屏时,使 LTDC正常工作后,往配置好的显存地址
写入要显示的像素数据,LTDC 就会把这些数据从显存搬运到液晶面板进行显示,而显示
数据的容量非常大,所以我们希望能用 DMA来操作,针对这个需求,STM32 专门定制了
DMA2D 外设,它可用于快速绘制矩形、直线、分层数据混合、数据复制以及进行图像数
据格式转换,可以把它理解为图形专用的 DMA。
DMA2D 结构框图剖析
下图是 DMA2D 的结构框图,它与前面 LTDC结构里的图像处理单元很类似,主要为分层 FIFO、PFC及彩色混合器。
1. FG FIFO 与 BG FIFO
FG FIFO(Foreground FIFO)与 BG FIFO(Backgroun FIFO)是两个 64x32 位大小的缓冲区,
它们用于缓存从 AHB总线获取的像素数据,分别专用于缓冲前景层和背景层的数据源。
AHB总线的数据源一般是 SDRAM,也就是说在 LTDC外设中配置的前景层及背景层
数据源地址一般指向 SDRAM 的存储空间,使用 SDRAM 的部分空间作为显存。
2. FG PFC 与 BG PFC
FG PFC(FG Pixel Format Convertor)与 BG PFC(BG Pixel Format Convertor)是两个像素格
式转换器,分别用于前景层和背景层的像素格式转换,不管从 FIFO 的数据源格式如何,
都把它转化成字的格式(即 32 位),ARGB8888。
图中的“ɑ”表示 Alpha,即透明度,经过 PFC,透明度会被扩展成 8 位的格式。
图中的“CLUT”表示颜色查找表(Color Lookup Table),颜色查找表是一种间接的颜色
表示方式,它使用一个 256x32 位的空间缓存 256 种颜色,颜色的格式是 ARGB8888 或
RGB888。见下图,利用颜色查找表,实际的图像只使用这 256 种颜色,而图像的每个
像素使用 8位的数据来表示,该数据并不是直接的 RGB 颜色数据,而是指向颜色查找表的
地址偏移,即表示这个像素点应该显示颜色查找表中的哪一种颜色。在图像大小不变的情
况下,利用颜色查找表可以扩展颜色显示的能力,其特点是用 8位的数据表示了一个 24或
32 位的颜色,但整个图像颜色的种类局限于颜色表中的 256 种。DMA2D 的颜色查找表可
以由 CPU自动加载或编程手动加载。
3. 混合器
FIFO 中的数据源经过 PFC像素格式转换器后,前景层和背景层的图像都输入到混合器中运算,运算公式如下:
从公式可以了解到混合器的运算主要是使用前景和背景的透明度作为因子,对像素
RGB 颜色值进行加权运算。经过混合器后,两层数据合成为一层 ARGB8888 格式的图像。
4. OUT PFC
OUT PFC是输出像素格式转换器,它把混合器转换得到的图像转换成目标格式,如ARGB8888、RGB888、RGB565、ARGB1555 或 ARGB4444,具体的格式可根据需要在输出 PFC控制寄存器 DMA2D_OPFCCR 中选择。
STM32F429 芯片使用 LTDC、DMA2D 及 RAM 存储器,构成了一个完整的液晶控制器。LTDC负责不断刷新液晶屏,DMA2D 用于图像数据搬运、混合及格式转换,RAM 存储器作为显存。其中显存可以使用 STM32 芯片内部的 SRAM 或外扩 SDRAM/SRAM,只要容量足够大即可(至少要能存储一帧图像数据)。
LTDC 初始化结构体
控制 LTDC涉及到非常多的寄存器,利用 LTDC初始化结构体可以减轻开发和维护的工作量,LTDC初始化结构体见如下代码:
这个结构体大部分成员都是用于定义 LTDC的时序参数的,包括信号有效电平及各种时间参数的宽度,配合“液晶数据传输时序”中的说明更易理解。各个成员介绍如下,括号中的是 STM32 标准库定义的宏:
对这些 LTDC初始化结构体成员赋值后,调用库函数 LTDC_Init 可把这些参数写入到LTDC 的各个配置寄存器,LTDC 外设根据这些配置控制时序。
LTDC 层级初始化结构体
LTDC初始化结构体只是配置好了与液晶屏通讯的基本时序,还有像素格式、显存地址等诸多参数需要使用 LTDC 层级初始化结构体完成。代码如下:
本结构体成员可以设置 BF1/BF2 参数使用 CA配置(LTDC_BlendingFactor1/2_CA)还是PAxCA 配置(LTDC_BlendingFactor1/2_PAxCA)。配置成 CA 表示混合系数中只包含恒定的 Alpha 值,即像素本身的 Alpha 不会影响混合效果,若配置成 PAxCA,则混合系数中包含有像素本身的 Alpha 值,即把像素本身的 Alpha 加入到混合运算中。其中的恒定Alpha 值即前面“ LTDC_ConstantAlpha ”结构体配置参数的透明度百分比:(配置的Alpha 值/0xFF)。
数据源混合时,由下至上,如果使用了 2层,则先将第 1 层与 LTDC背景混合,随后再使用该混合颜色与第 2层混合得到最终结果。例如,当只使用第 1层数据源时,且 BF1及 BF2 都配置为使用恒定 Alpha,该 Alpha 值在 LTDC_ConstantAlpha结构体成员值中被配置为 240(0xF0)。因此,恒定 Alpha 值为 240/255=0.94。若当前层颜色 C=128,背景色 Cs=48,那么第 1 层与背景色的混合结果为:
BC=恒定 Alpha x C + (1- 恒定 Alpha) x Cs=0.94 x Cs +(1-0.94)x 48=123
配置完 LTDC_Layer_InitTypeDef层级初始化结构体后,调用库函数 LTDC_LayerInit可把这些配置写入到 LTDC的层级控制寄存器中,完成初始化。初始化完成后 LTDC会不断把显存空间的数据传输到液晶屏进行显示,我们可以直接修改或使用 DMA2D 修改显存中的数据,从而改变显示的内容。
DMA2D初始化结构体
在实际显示时,我们常常采用 DMA2D 描绘直线和矩形,这个时候会用到 DMA2D 结构体
配置完这些结构体成员,调用库函数 DMA2D_Init 即可把这些参数写入到 DMA2D 的控制寄存器中,然后再调用 DMA2D_StartTransfer 函数开启数据传输及转换。