LTDC/DMA2D—液晶显示
本章参考资料:《STM32F4xx 参考手册 2》、《STM32F4xx 规格书》、库帮助文档
《stm32f4xx_dsp_stdperiph_lib_um.chm》。
关于开发板配套的液晶屏参数可查阅《5.0 寸液晶屏数据手册》配套资料获知。
显示器简介
显示器属于计算机的 I/O 设备,即输入输出设备。它是一种将特定电子信息输出到屏
幕上再反射到人眼的显示工具。 常见的有 CRT 显示器、液晶显示器、 LED 点阵显示器及
OLED 显示器。
液晶显示器
液晶显示器,简称 LCD(Liquid Crystal Display),相对于上一代 CRT 显示器(阴极射线
管显示器), LCD 显示器具有功耗低、体积小、承载的信息量大及不伤眼的优点,因而它成
为了现在的主流电子显示设备,其中包括电视、电脑显示器、手机屏幕及各种嵌入式设备
的显示器。图 27-1 是液晶电视与 CRT 电视的外观对比,很明显液晶电视更薄,“时尚”
是液晶电视给人的第一印象,而 CRT 电视则感觉很“笨重”。
液晶是一种介于固体和液体之间的特殊物质,它是一种有机化合物,常态下呈液态,
但是它的分子排列却和固体晶体一样非常规则,因此取名液晶。 如果给液晶施加电场,会
改变它的分子排列, 从而改变光线的传播方向, 配合偏振光片,它就具有控制光线透过率
的作用,再配合彩色滤光片,改变加给液晶电压大小,就能改变某一颜色透光量的多少,
图 27-2 中的就是绿色显示结构。 利用这种原理,做出可控红、绿、蓝光输出强度的显示结
构,把三种显示结构组成一个显示单位,通过控制红绿蓝的强度,可以使该单位混合输出
不同的色彩,这样的一个显示单位被称为像素。
注意液晶本身是不发光的,所以需要有一个背光灯提供光源,光线经过一系列处理过
程才到输出,所以输出的光线强度是要比光源的强度低很多的,比较浪费能源(当然,比
CRT 显示器还是节能多了)。而且这些处理过程会导致显示方向比较窄,也就是它的视角较
小,从侧面看屏幕会看不清它的显示内容。另外,输出的色彩变换时,液晶分子转动也需
要消耗一定的时间,导致屏幕的响应速度低。
LED 和 OLED 显示器
LED 点阵显示器不存在以上液晶显示器的问题, LED 点阵彩色显示器的单个像素点内
包含红绿蓝三色 LED 灯,显示原理类似我们实验板上的 LED 彩灯,通过控制红绿蓝颜色
的强度进行混色,实现全彩颜色输出,多个像素点构成一个屏幕。由于每个像素点都是
LED 灯自发光的,所以在户外白天也显示得非常清晰,但由于 LED 灯体积较大,导致屏幕
的像素密度低,所以它一般只适合用于广场上的巨型显示器。相对来说,单色的 LED 点阵
显示器应用得更广泛,如公交车上的信息展示牌、店招等,见图 27-3。
新一代的 OLED 显示器与 LED 点阵彩色显示器的原理类似,但由于它采用的像素单元
是“有机发光二极管” (Organic Light Emitting Diode),所以像素密度比普通 LED 点阵显示
器高得多,见图 27-5。
OLED 显示器不需要背光源、对比度高、轻薄、视角广及响应速度快等优点。待到生
产工艺更加成熟时,必将取代现在液晶显示器的地位,见图 27-5。
显示器的基本参数
不管是哪一种显示器,都有一定的参数用于描述它们的特性,各个参数介绍如下:
(1) 像素
像素是组成图像的最基本单元要素,显示器的像素指它成像最小的点,即前面讲解液
晶原理中提到的一个显示单元。
(1) 分辨率
一些嵌入式设备的显示器常常以“行像素值 x 列像素值”表示屏幕的分辨率。如分辨
率 800x480 表示该显示器的每一行有 800 个像素点,每一列有 480 个像素点,也可理
解为有 800 列, 480 行。
(2) 色彩深度
色彩深度指显示器的每个像素点能表示多少种颜色,一般用“位” (bit)来表示。如单
色屏的每个像素点能表示亮或灭两种状态(即实际上能显示 2 种颜色),用 1 个数据位
就可以表示像素点的所有状态,所以它的色彩深度为 1bit,其它常见的显示屏色深为
16bit、 24bit。
(3) 显示器尺寸
显示器的大小一般以英寸表示,如 5 英寸、 21 英寸、 24 英寸等,这个长度是指屏幕对
角线的长度, 通过显示器的对角线长度及长宽比可确定显示器的实际长宽尺寸。
(4) 点距
点距指两个相邻像素点之间的距离, 它会影响画质的细腻度及观看距离,相同尺寸的
屏幕,若分辨率越高,则点距越小,画质越细腻。如现在有些手机的屏幕分辨率比电
脑显示器的还大,这是手机屏幕点距小的原因; LED 点阵显示屏的点距一般都比较大,
所以适合远距离观看。
STM32F429 系列的芯片不需要额外的液晶控制器,也就是说它把专用液晶控制器的功能集成到 STM32F429 芯片内部了,节约
了额外的控制器成本。
(1) RGB 信号线
RGB 信号线各有 8 根,分别用于表示液晶屏一个像素点的红、绿、蓝颜色分量。使用
红绿蓝颜色分量来表示颜色是一种通用的做法,打开 Windows 系统自带的画板调色工
具,可看到颜色的红绿蓝分量值,见图 27-7。常见的颜色表示会在“RGB”后面附带
各个颜色分量值的数据位数,如 RGB565 表示红绿蓝的数据线数分别为 5、 6、 5 根,
一共为 16 个数据位,可表示 216 种颜色;而这个液晶屏的种颜色分量的数据线都有 8
根,所以它支持 RGB888 格式,一共 24 位数据线,可表示的颜色为 224种。
(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 信号线表示的数据有效。
液晶数据传输时序
通过上述信号线向液晶屏传输像素数据时,各信号线的时序见图 27-8。 图中表示的是
向液晶屏传输一帧图像数据的时序, 中间省略了多行及多个像素点。
液晶屏显示的图像可看作一个矩形,结合图 27-9 来理解。液晶屏有一个显示指针,它
指向将要显示的像素。显示指针的扫描方向方向从左到右、从上到下,一个像素点一个像
素点地描绘图形。这些像素点的数据通过 RGB 数据线传输至液晶屏,它们在同步时钟
CLK 的驱动下一个一个地传输到液晶屏中,交给显示指针,传输完成一行时,水平同步信
号 HSYNC 电平跳变一次,而传输完一帧时 VSYNC 电平跳变一次。
显存
液晶屏中的每个像素点都是数据,在实际应用中需要把每个像素点的数据缓存起来,
再传输给液晶屏,这种存储显示数据的存储器被称为显存。显存一般至少要能存储液晶屏
的一帧显示数据,如分辨率为 800x480 的液晶屏,使用 RGB888 格式显示,它的一帧显示
数据大小为: 3x800x480=1152000 字节;若使用 RGB565 格式显示,一帧显示数据大小为:
2x800x480=768000 字节。
常见的颜色表示会在“RGB”后面附带各个颜色分量值的数据位数,如RGB565
表示红绿蓝的数据线数分别为5、 6、 5根,一共为16个数据位,可表示216
种颜色;而我们这个液晶屏的种颜色分量的数据线都有8根,所以它支持
RGB888格式,一共24位数据线,可表示的颜色为224种。
RGB后面的数值,分别代表其表示颜色的bits。
LCD-TFT 控制器 (LTDC)
LTDC 液晶控制器简介
STM32F429 系列芯片内部自带一个 LTDC 液晶控制器,使用 SDRAM 的部分空间作为
显存,可直接控制液晶面板,无需额外增加液晶控制器芯片。 STM32 的 LTDC 液晶控制器
最高支持 800x600 分辨率的屏幕;可支持多种颜色格式,包括 RGB888、 RGB565、
ARGB8888 和 ARGB1555 等(其中的“A”是指透明像素);支持 2 层显示数据混合,利用这
个特性,可高效地做出背景和前景分离的显示效果,如以视频为背景,在前景显示弹幕。
图像数据混合
LTDC 外设支持 2 层数据混合,混合前使用 2 层数据源,分别为前景层和背景层,见
图 27-10。在输出时,实际上液晶屏只能显示一层图像,所以 LTDC 在输出数据到液晶屏
前需要把 2 层图像混合成一层,跟 Photoshop 软件的分层合成图片过程类似。混合时,直
接用前景层中的不透明像素替换相同位置的背景像素;而前景层中透明像素的位置,则使
用背景的像素数据,即显示背景层的像素。
如果想使用图像混合功能,前景层必须使用包含透明的像素格式,如 ARGB1555 或
ARGB8888。其中 ARGB1555 使用 1 个数据位表示透明元素,它只能表示像素是透明或不
透明,当最高位(即“A”位)为 1 时,表示这是一个不透明的像素,具体颜色值为 RGB 位
表示的颜色,而当最高位为 0 时,表示这是一个完全透明的像素, RGB 位的数据无效;而
ARGB8888 的像素格式使用 8 个数据位表示透明元素,它使用高 8 位表示“透明度” (即代
表“A”的 8 个数据位),若 A 的值为“0xFF”,则表示这个像素完全不透明,若 A 的值为
“0x00”则表示这个像素完全透明,介于它们之间的值表示其 RGB 颜色不同程度的透明度,
即混合后背景像素根据这个值按比例来表示。
注意液晶屏本身是没有透明度概念的,如 24 位液晶屏的像素数据格式是 RGB888,
RGB 颜色各有对应的 8 根数据线,不存在用于表示透明度的数据线,所以实际上 ARGB 只
是针对内部分层数据处理的格式,最终经过混合运算得出直接颜色数据 RGB888 才能交给
液晶屏显示。
图像处理单元
LTDC 框图标号表示的是图像处理单元,它通过“AHB 接口”获取显存中的数据,
然后按分层把数据分别发送到两个“层 FIFO”缓存,每个 FIFO 可缓存 64x32 位的数据,
接着从缓存中获取数据交给“PFC” (像素格式转换器),它把数据从像素格式转换成字
(ARGB8888)的格式,再经过“混合单元”把两层数据合并起来,最终混合得到的是单层要
显示的数据,通过信号线输出到液晶面板。这部分结构与 DMA2D 的很类似,我们在下一
小节详细讲解。
在输出前混合单元的数据还经过一个“抖动单元”,它的作用是当像素数据格式的色
深大于液晶面板实际色深时,对像素数据颜色进行舍入操作,如向 18 位显示器上显示 24
位数据时,抖动单元把像素数据的低 6 位与阈值比较,若大于阈值,则向数据的第 7 位进
1,否则直接舍掉低 6 位。
配置和状态寄存器
框图中标号表示的是 LTDC 的控制逻辑,它包含了 LTDC 的各种配置和状态寄存器。
如配置与液晶面板通讯时信号线的有效电平、各种时间参数、有效数据宽度、像素格式及
显存址等等, LTDC 外设根据这些配置控制数据输出,使用 AHB 接口从显存地址中搬运数
据到液晶面板。还有一系列用于指示当前显示状态和位置的状态寄存器,通过读取这些寄
存器可以了解 LTDC 的工作状态。
时钟信号
LTDC 外设使用 3 种时钟信号,包括 AHB 时钟、 APB2 时钟及像素时钟 LCD_CLK。
AHB 时钟用于驱动数据从存储器存储到 FIFO, APB2 时钟用于驱动 LTDC 的寄存器。而
LCD_CLK 用于生成与液晶面板通讯的同步时钟,见图 27-12,它的来源是 HSE(高速外部
晶振),经过“/M”分频因子分频输出到“PLLSAI”分频器,信号由“PLLSAI”中的倍频
因子 N 倍频得到“PLLSAIN”时钟、然后由“/R”因子分频得到“PLLCDCLK”时钟,再
经过“DIV”因子得到“LCD-TFT clock”,“LCD-TFT clock”即通讯中的同步时钟
LCD_CLK,它使用 LCD_CLK 引脚输出。
/************************************************2017.7.29***************************************************************/
LTDC 初始化结构体
这里有很多涉及寄存器的东西,如果不是必要,不用自己去配置。
但是却有几个值得注意的地方:
第一:关于LTDC的引脚复用:
看到上图不要以为LCD_G3和LCD_B2可以同时使用一个引脚,LCD_B2还有其他引脚可以使用,只是提醒自己不要以为复用只有AF14的LCD,在AF9处还隐藏着有LCD的复用功能。
有可能是复用AF14也可能是复用AF9,具体如何选择AF14还是AF9的复用呢?在stm32f4xx_gpio.h中:
期间当然还有更多的复用选择:
需要注意的是这里LTDC复用不是单纯的只有AF14,还有AF9的。
第二点:用sdram写点刷屏方式:
这样可能会在屏幕下方有乱码或者花屏这样的现象,此时需要更改sdram中的一个配置:
static void SDRAM_InitSequence(void)函数中的:
突发长度如果配置成8可能会出现上面所说的花屏问题,改成4之后,得到了解决。
/************************************************2017.7.29***************************************************************/
欢迎加入作者的小圈子
扫描下方左边二维码加入QQ交流群,扫描下方右边二维码关注个人微信公众号并获取更多隐藏干货,QQ交流群:816747642 微信公众号:Crystal软件学堂
![](https://images.cnblogs.com/cnblogs_com/yangguang-it/1907263/o_201227061707QQ20201227141844.png)
![](https://images.cnblogs.com/cnblogs_com/yangguang-it/1704156/o_200415115115qrcode_for_gh_5c7d1da35871_258.jpg)
作者:Crystal软件学堂 bilibili视频教程地址:https://space.bilibili.com/5782182 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在转载文章页面给出原文连接。 如果你觉得文章对你有所帮助,烦请点个推荐,你的支持是我更文的动力。 文中若有错误,请您务必指出,感谢给予我建议并让我提高的你。 |