STM32硬件基础--LTDC显示图像

【海东青电子原创文章,转载请注明出处:https://www.jianshu.com/p/216388df4d4d】

(实例代码下载地址:https://github.com/haidongqing/ltdc-demo)

LTDC是一种显示接口,主要被MCU用来连接TFT屏,这也是Lcd-Tft Display Controller(LTDC)的本意。各种常用的显示接口请参见这篇文章:《各种显示接口DBI、DPI、LTDC、DSI、FSMC》(向原作者致意!),文中详细描述了3大类显示接口:DBI、DPI和DSI。LTDC属于DPI(display pixel interface,显示像素接口,也称RGB接口),它不断地向显示器(TFT液晶屏)发送图像数据(即:不断刷新),液晶屏不需要具备显存,显存在MCU一端(片内RAM或外扩RAM)。可以直观地认为LTDC就是PC上的“显卡”。

液晶屏上的像素点是一行、一行地显示出来的,扫描到最后一行后,再回到第一行扫描,如此循环往复,很像VGA显示器的工作模式。


图一 VGA显示器

而且,LTDC的信号时序确实沿用了VGA的术语,为了便于理解LTDC的时序参数如何设置,先来看看关于传统的VGA的信号时序:《VGA原理详解》(向原作者致意!)。核心概念如下:

      “显示器的扫描方式:扫描从屏幕左上角一点开始,从左向右逐点扫描。每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号进行同步;当扫描完所有的行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。

      从扫描方式中我们知道,行同步,场同步以及消隐区的概念。回到时钟上来。以行扫描为例子,在一行中由于需要行消隐,所以要求一定的时钟周期用于行消隐,当然也有行同步信号。”


图二

上图中,1-6处是重点,是LTDC的主要参数,后面将详述。LTDC的功能框图:


图三

LTDC的信号可以分为两类:4个控制信号(像素时钟LCD_CLK、水平同步HSYNC、垂直同步VSYNC、数据有效DE)和3个RGB数据信号(8-bit x 3)。LTDC与液晶面板之间的通讯是“同步的”,受LCD_CLK的控制。STM32F746G-DISCO开发板有关TFT显示器的电路原理图如下:


图四

4个控制信号和3个RGB数据信号与图三相对应。除此之外,注意上图绿色框中的 LCD_BL_CTRL 和 LCD_DISP 2个信号线。LCD_BL_CTRL 控制电源芯片 STLD40D 的输出,当其高电平时有效,使得输出的 LCD_BL_A(阳极)与 LCD_BL_K(阴极)导通,TFT面板的背光打开。这样,LCD_BL_CTRL (板子上是PK3管脚)可以用来控制TFT面板是否显示。LCD_DISP(板子上是PI12管脚) 用来控制 TFT面板是否进入休眠状态,见 RK043FN48H-CT672B 模组的参考手册:


图五

RK043FN48H-CT672B 是深圳晶鸿公司的带触摸的TFT液晶模组,其中液晶驱动IC型号为 OTA5180A,其数据手册里也有关于DISP信号的描述:


图六

这个DISP 名字实在是令人费解,换成 Standby 或 Sleep 就容易理解了,反正是需要给高电平,才能使液晶屏正常工作。 LCD_BL_CTRL 和 LCD_DISP 这2个信号线不是LTDC“标配”的,是液晶模组“特有”的,不同的模组可能有不同的控制信号,这里特别说明一下,后面需要用CUBEMX专门配置对应的GPIO。

LTDC的硬件接口介绍完了,下面具体说说LTDC的控制逻辑。


图七

图七中的1-6 标号与图二的标号是一一对应的:

1、HSYNC,水平同步信号,需要指明它的脉宽,单位:像素时钟DCLK。

2、HBP,Horizontal Back Porch,水平同步信号后肩(后沿,后廓,一个意思),它之后就是真正的数据开始了。单位:像素时钟。

3、HFP,Horizontal Front Porch,水平同步信号前肩,表明一行结束,单位:像素时钟。

4、VSYNC,垂直同步信号,一帧的开始,需要指明宽度,单位:行。

5、VBP,Vertical Back Porch,垂直同步信号后肩,它之后就是一帧的首行数据开始了,单位:行。

6、VHP,Vertical Front Porch,垂直同步信号前肩,表明一帧结束,单位:行。

再加上 Active Width(宽,像素,本例中为480)、Active height(高,像素,本例中为272),这8个数据是LTDC需要配置的最重要的参数。看看液晶控制芯片手册中对参数的要求:


图八

上表给出了各个参数的范围,实际使用时可以在这个参考范围内做调整。注意,像素时钟DCLK的范围在5--12MHz,本例中将使用9.8MHz。

这里还要介绍两个LTDC的重要概念:显示层(Layer)与窗口(Window)。LTDC支持2个Layer,每个Layer对应一个显存,也就是一个图像。LTDC可以将2个图像叠加,layer1在下、layer2在上。2个层可以分别被使能,可以单独使用,也可以一起叠加使用。显然,这种2个(硬件)图层的结构非常利于动画的实现。例如,layer1保持不动,layer2不停改变相对位置,则看到的是上面的图像(比如,动画人物)在背景图上运动。进一步,每个层都有一个活动的“窗口”,就是图像具体的显示位置和大小,即图七中的 Active display area。窗口的大小可以等同于图层的大小(满屏),也可以小于图层,这样的设计利于编程的灵活性。例如,当只需要显示1/4大小的图片时,可以定义一个1/4大小的窗口来显示图片,对应的显存也只需要1/4大小,节省内存。而且图片的显示位置可以动态调整。

补充:关于图四中LCD_DE信号的说明:


图九


图十

当 LCD_DE 为高电平时,LTDC向液晶面板输出数据有效(就是说,LCD_DE变高后,LCD_R[7:0]等24条数据线上的输出数据有效)。

至此,与LTDC有关的参数配置讲完了,下面可以使用CUBEMX具体来配置LTDC了。

选择芯片 STM32F746NG:


图十一

配置外部晶振:


图十二

调试模式(ST-LINK):


图十三

配置主时钟、像素时钟:


图十四

HCLK配置为最高频率216MHz;绿框中的 LCD-TFT 的频率默认是48MHz,超出了5--12 的范围(见图八),但这个值是灰色的、无法更改。这是因为LTDC还没有启用,像素时钟是通过LTDC的寄存器配置的,所以到这一步还无法配置像素时钟。下面配置LTDC,需要三个步骤,先配置LTDC的参数:


图十五

Display Type 选 RGB888,是因为LTDC的硬件接口是RGB各占8-bit,共24条数据线(跟显存数据格式RGB565等不是一个概念、不要混淆)。

然后配置图层参数:


图十六

为了简化,选择了一个图层(layer1,直接显示、不关layer2的事了),图像格式是RGB565,这是显存中数据的格式。我们将在代码编程时,通过ST的图像格式转换工具将一个demo图片转化成C语言数组数据,而这个数据是RGB565的,所以上面layer1要选RGB565格式。Buffer的起始地址设置成了0xC000 0000,这是开发板上SDRAM的地址,我们的测试程序为了简化,不使用SDRAM作显存,而是直接从片内FLASH中读取图片,在CUBEMX生成的代码中,需要修改这个地址(见后)。Alpha选了最大值255,就是完全不透明显示图片(即原图)。如果Alpha=128,将看到半透明的图片;Alpha=0的话,就什么也看不到了。

第三步,也是容易被忽略的一步,检查LTDC用到的GPIO复用管脚是否正确。这是CUBEMX默认配置的:


图十七

与开发板原理图对比,上图中大部分GPIO的配置不对。按照电路图重新配置如下:


图十八

LTDC本身的所有参数配置完毕了(为什么强调“本身”?见后),再回到时钟配置页,因为LTDC使能了,图十四绿框中的参数不再是灰色的了,按下图将像素时钟DCLK配置成9.8MHz:


图十九

至此,所有参数配置完成了吗?没有,还差一点点。在图四时说过 LCD_BL_CTRL 和 LCD_DISP 2个信号线,它们不是LTDC本身具有的,是控制液晶面板必须的,需要将这两个GPIO配置成输出模式、并初始化成高电平:


图二十

全部配置工作完成,生成KEIL代码。(完整代码下载地址:https://github.com/haidongqing/ltdc-demo)

在main.c文件中,修改 MX_LTDC_Init():


图二十一

0xC000 0000是图十六配置的参数,例程中图片数据是保存在flash中的。图片数据保存在头文件 RGB565_480x272.h 中:


图二十二

编译、烧写,运行后的结果:


图二十三


touchgfx用到的三大硬件接口技术:FMC(SDRAM)、QaudSPI(NOR FLASH)、LTDC(TFT Panel),到今天全部介绍完了,下一步将进入touchgfx开发的正题:使用CUBEMX从零开始配置touchgfx!(待续......)

你可能感兴趣的:(STM32硬件基础--LTDC显示图像)