第40章 STM32F429的LCD控制器LTDC基础知识和HAL库API

最新更新时间:2022-04-25来源: eefocus关键字:STM32F429  LCD控制器  LTDC  HAL库API 手机看文章 扫描二维码
随时随地手机看文章

40.1 初学者重要提示

本章40.2小节中的几个知识点比较重要,比如DE同步模式和HV同步模式的区别,Alpha混合,水平消隐和垂直消隐等知识点尤其重要,需要大家理解透彻。


40.2 LTDC基础知识

LTDC的几个关键知识点放在开头说:


1、STM32F429的LTDC最大支持1024*768分辨率,且支持硬件双图层。实际支持的分辨率可能比1024*768要高一点,因为最终可以支持的最大分辨率是芯片后期定标的。


2、支持32位色,24位色,16位色和8位色。


3、可编程窗口位置和大小,可编程行同步,场同步和数据使能信号的极性。


4、查色表 (CLUT,Color look-up table),每个图层最高可记录256种24位色。


5、支持如下8种颜色格式:


ARGB8888

32位颜色格式,一个像素点占用4字节,其中低位 3 字节用于颜色分量,高位字节用于 Alpha 混合。红、绿、蓝和 Alpha通道(0x00表示完全透明,0xFF表示完全不透明)都是 8 位表示。颜色格式:AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB。


RGB888

24位颜色格式,一个像素点占用3字节,分别用于红、绿、蓝。


颜色格式:RRRRRRRRGGGGGGGGBBBBBBBB。


RGB565

16位颜色格式,一个像素点占用2字节,分别用于红、绿、蓝。


颜色格式:RRRRRGGGGGGBBBBB。


ARGB1555

16位颜色格式,一个像素点占用2字节,Alpha通道使用1个位表示,等于0的时候表示完全透明,等于1的时候表示完全不透明。红、绿、蓝都是用5个位表示。


颜色格式:ARRRRRGGGGGBBBBB。


ARGB4444

16位颜色格式,一个像素点占用2字节,Alpha通道使用2个位表示(0x0表示完全透明,0x3表示完全不透明)。红、绿、蓝都是用4个位表示。


颜色格式:ARRRRRGGGGGBBBBB。


L8 (8-bit luminance or CLUT)

8位颜色格式,实际上仅仅是8位索引值,范围0–255,而每个索引值的具体颜色值在查色表CLUT里面存储。


AL44 (4-bit alpha + 4-bit luminance)

8位颜色格式,实际上是4位Alpha通道(0x0表示完全透明,0xF表示完全不透明)和4位的索引值,索引范围0–15,而每个索引值的具体颜色值在查色表CLUT里面存储。


AL88 (8-bit alpha + 8-bit luminance)

16位颜色格式,实际上是8位Alpha通道(0x00表示完全透明,0xFF表示完全不透明)和8位的索引值,索引范围0–255,而每个索引值的具体颜色值在查色表CLUT里面存储。


40.2.1 LTDC硬件框图

认识一个外设,最好的方式就是看它的框图,方便我们快速地了解LTDC的基本功能,然后再看手册了解细节。框图如下所示:

通过这个框图,我们可以得到如下信息:


  AHB Clock

AHB时钟域


  APB2 Clock

APB2时钟域


  Interrupts

LTDC时钟。


下面是LCD接口引脚,用于外接显示屏:


  LCD_CLK

像素时钟输出。


  LCD_HSYNC

水平同步信号。


  LCD_VSYN

垂直同步信号。


  LCD_DE

数据使能信号。


  LCD_R[7:0]

8位红色数据。


  LCD_G[7:0]

8 位绿色数据。


  LCD_B[7:0]

8位蓝色数据。


40.2.2 LTDC时钟源选择

LTDC仅有一个时钟源可供选择,如下图所示:

40.2.3 LCD的DE同步模式和HV同步模式的区别

 一般情况下,STM32F429都是用SDRAM作为LCD的显存,LTDC控制器会从SDRAM读取数据刷新到LCD显示屏上,具体如何刷新呢?这就涉及到DE同步模式和HV同步模式。


具体支持哪种模式是由裸屏自带的Driver IC决定,比如V6板子7寸裸屏的Source Driver IC OTA7001支持DE和HV两种模式。现在的大分辨率显示屏一般都是DE同步模式,小分辨率的HV同步模式多。


  DE同步模式

DE模式需要LCD_DE和LCD_CLK信号来控制刷新。比如一个800x480分辨率的裸屏,在DE有效信号的时候(高电平或低电平),就有800个LCD_CLK输出时钟来确认行中800个点。每个时钟有效的时候,从显存读取一次RGB数据。因为存在回扫信号,所以DE是个方波。一个周期的LCD_DE信号,裸屏就扫描一行。扫描480行后,又从第一行扫描开始。这个规律由裸屏的驱动IC所决定的。


  HV同步模式

HV模式需要LCD_CLK时钟信号,行同步信号LCD_HSYNC和场同步信号LCD_VSYNC来控制刷新。比如一个480x272分辨率的裸屏,有一个行同步信号LCD_HSYNC产生时(高电平或者低电平脉冲),就有480个LCD_CLK输出时钟来确认行中480个点。每个时钟有效的时候,从显存读取一次RGB数据。再来一个行同步信号LCD_HSYNC产生时(高电平或者低电平脉冲),切换到下一行,继续行同步和时钟输出,扫描272行后,发送一个场同步信号LCD_VSYNC,又重新从第一行扫描开始。


具体的时序效果可以看第41章的内容。


40.2.4 LTDC的时序配置

 LTDC的时序控制就是下面几个参数的设置,这几个参数都可以通过寄存器进行配置。


  HSYNC width

水平同步宽度设置,以LCD_CLK的像素时钟输出为单位。


  HBP(horizontal back porch period)

水平后沿周期设置,以LCD_CLK的像素时钟输出为单位。


  Active width

有效宽度设置,以LCD_CLK的像素时钟输出为单位。以800*480分辨率为例,Active width = 800。


  HFP(horizontal front porch period)

水平前沿周期设置,以LCD_CLK的像素时钟输出为单位。


  VSYNC width

垂直同步宽度设置,以LCD_CLK的像素时钟输出为单位。


  VBP(vertical back porch period)

垂直后沿周期设置,以LCD_CLK的像素时钟输出为单位。


  Active height

有效高度设置,以LCD_CLK的像素时钟输出为单位。以800*480分辨率为例,Active height = 480。


  VFP(vertical front porch period)

垂直前沿周期设置,以LCD_CLK的像素时钟输出为单位。


40.2.5 LTDC背景层,图层1,图层2和Alpha混合

LTDC除了图层1和图层2两个硬件图层以外,还有一个背景层。由于背景层的刷新不需要显存空间,所以可以用这个图层验证LTDC时序配置是否有问题。

  对于背景层来说,仅支持单色设置,固定颜色格式RGB888(LTDC_HandleTypeDef hltdc_F)hltdc_F.Init.Backcolor.Blue = 0

hltdc_F.Init.Backcolor.Green = 0


hltdc_F.Init.Backcolor.Red = 0


  对于图层1和图层2来说,支持如下8种颜色格式:

– ARGB8888


– RGB888


– RGB565


– ARGB1555


– ARGB4444


– L8(8 位 Luminance 或 CLUT)


– AL44(4 位 alpha + 4 位 luminance)


– AL88(8 位 alpha + 8 位 luminance)


  实现Alpha混合的关键是要有一个变量可以设置各种透明度。对此,STM32F429准备了两个Alpha供使用:

  一个是常数Alpha(0x00表示完全透明,0xFF表示完全不透明),所有颜色格式都可以使用。

  另一个是像素Alpha,也就是ARGB8888,ARGB1555,ARGB4444等颜色格式的Alpha通道数值,也就是我们为图层每个位置绘制的实际颜色值。

 


==================================


了解了这点后就是具体的实现了。STM32F429的参考手册给出了具体的混合公式


 


BC          =  BF1       x     C     +   BF2      x    Cs


混合后的颜色= 混合系数1 x 当前层颜色 + 混合系数2 x 底层混合后的颜色


  混合系数1可以选择:

(1)常数 Alpha


(2)像素 Alpha x 常数 Alpha


 


  混合系数2可以选择:

(1)1 - 常数 Alpha


(2)1 - 像素 Alpha x 常数 Alpha


 


  底层混合后的颜色:

(1)可以是背景层。


(2)可以是背景层与图层1混合后的颜色。


 


  那么公式就变成如下形式(主要是如下两种):

混合后的颜色 = 常数 Alpha x 当前层颜色 + (1 - 常数 Alpha) x 底层混合后的颜色。


混合后的颜色 = 像素 Alpha x 常数 Alpha x 当前层颜色 +(1 - 像素 Alpha x 常数 Alpha) x 底层混合后的颜色。


 


  再进一步简化,代入HAL库参数(LTDC_LayerCfgTypeDef  pLayerCfg):

像素Alpha是ARGB8888,ARGB1555等颜色格式的Alpha数值,也就是我们为图层每个位置绘制的实际颜色值,我们这里用AlphaValue表示。


混合后的颜色 = (pLayerCfg.Alpha /255 ) x 当前层颜色 +(1 - pLayerCfg.Alpha /255 ) x 底层混合后的颜色。


混合后的颜色 = (AlphaValue/255)x (pLayerCfg.Alpha /255 ) x 当前层颜色 +(1 - (AlphaValue/255)x (pLayerCfg.Alpha /255 )) x 底层混合后的颜色。


 


注,Alpha值要做归一化,Alpha的范围是0 - 255,比如Alpha = 100,那么代入公式的时候就是100/255。


 


  举例:

(1)混合因数1选择像素 Alpha x 常数 Alpha。


(2)混合因数2选择像素 Alpha x 常数 Alpha。


(3)使用图层1和背景层,图层1使用ARGB8888颜色格式。


(4)背景色 = 0xFF0000,图层1位置坐标(0,0)颜色值0x5500FF00。


(5)Alpha常数 = 0x77


混合后的颜色 = (AlphaValue/255)x (pLayerCfg.Alpha /255 ) x 当前层颜色 +(1 - (AlphaValue/255)x (pLayerCfg.Alpha /255 )) x 底层混合后的颜色。


             = (0x55/255)x (0x77/255) x 0x00FF00 +(1 - (0x55/255)x (0x77/255)) x 0xFF0000


             =  0xD7809C


 


  最后注意一点:

如果大家设置的图层显示区没有显示满整个显示屏,且使用的ARGB颜色格式,那么未覆盖的区域会使用图层默认颜色。对此HAL库有专门的配置:


LTDC_LayerCfgTypeDef      pLayerCfg


pLayerCfg.Alpha0 = 0;


pLayerCfg.Backcolor.Blue = 0;


pLayerCfg.Backcolor.Green = 0;


pLayerCfg.Backcolor.Red = 0;


40.2.6 LTDC的水平消隐和垂直消隐

正常情况下,LCD的刷新就是从左到右,从上到下进行逐个像素点刷新。但仅刷新有效的显示区是不够的,比如800*480分辨率,我们不仅仅要刷800*480这段有效区域,边界区也是要刷新的,即下图总宽度以内,有效宽度以外的区域。

水平消隐就是LCD扫描一行结束到另一行开始的时间,这段消失的时间就是水平消隐,即HSYNC宽度+ HBP + HFP这段消失的时间。


垂直消隐就是LCD扫描最后一行结束到第一行开始的时间,这段消失的时间就是垂直消隐,即VSYNC宽度+ VBP + VFP这段消失的时间。


40.2.7 区分FPS帧率和刷新率

FPS帧率是对STM32F429刷到显存,也就是SDRAM里面来说的,而是刷新率是实际LCD显示的速度。


刷新率 = LTDC输出时钟 /((Width + HSYNC_W  + HBP  + HFP )*(Height + VSYNC_W +  VBP  +VFP  ))


一般情况下,帧率是远高于刷新率的,但帧数高于刷新率有没有意义?网上普遍的看法是高于刷新率的帧数都是浪费,比如F429刷800*480分辨率显示屏,帧数可以达到300多,而刷新率估计才70Hz,多出来的不是都浪费了吗(对于那种FPS类的游戏,我们不讨论)。


对于这种观点,在一定情况下是成立的。但是有一点,即使是帧数和刷新率都是108Hz,能保证显示没有撕裂感吗?能保证没有帧延迟吗?能保证流畅的画面吗?这个时候,我们使用emWin支持的三缓冲,多余的帧数完全可以输出到其它缓冲区,有效降低撕裂感和帧延迟,保证流畅输出。


40.2.8 避免 LTDC刷新撕裂感的解决办法

如果用户快速刷新颜色差异比较大的两种界面,容易遇到这种撕裂问题。


  出现这个问题的原因

用户更新显存数据期间,LTDC也在不断的读取显存的数据到显示屏上,如果用户才更新了部分界面数据,后面部分还没有更新,LTDC刷新到显示屏的界面效果出现撕裂感,即下面这种现象:

  解决这个问题的办法

LTDC刷新还在垂直消隐期间就将整个界面刷新完成,而我们如何只知道LTDC在垂直消隐期,通过函数HAL_LTDC_ProgramLineEvent设置刷新到指定行时进入中断即可,一般设置为第0行进入中断,然后设置个标志即可。


一旦检测到这个标志,就通过DMA2D快速将界面刷新好,这样就有效的避免了撕裂感。


40.3 LTDC的HAL库用法

LTDC的HAL库用法其实就是几个结构体变量成员的配置和使用,然后配置GPIO、时钟,并根据需要配置NVIC、中断和DMA。下面我们逐一展开为大家做个说明。


40.3.1 LTDC寄存器结构体LTDC_TypeDef

LTDC相关的寄存器是通过HAL库中的结构体LTDC_TypeDef定义的,在stm32h743xx.h中可以找到它们的具体定义:


typedef struct

{

  uint32_t      RESERVED0[2];/*!< Reserved,                                                    0x00-0x04 */

  __IO uint32_t SSCR;     /*!< LTDC Synchronization Size Configuration Register,    Address offset: 0x08 */

  __IO uint32_t BPCR;     /*!< LTDC Back Porch Configuration Register,              Address offset: 0x0C */

  __IO uint32_t AWCR;     /*!< LTDC Active Width Configuration Register,            Address offset: 0x10 */

  __IO uint32_t TWCR;     /*!< LTDC Total Width Configuration Register,             Address offset: 0x14 */

  __IO uint32_t GCR;      /*!< LTDC Global Control Register,                        Address offset: 0x18 */

  uint32_t      RESERVED1[2]; /*!< Reserved,                                                   0x1C-0x20 */

  __IO uint32_t SRCR;     /*!< LTDC Shadow Reload Configuration Register,            Address offset: 0x24 */

  uint32_t      RESERVED2[1]; /*!< Reserved,                                                        0x28 */

  __IO uint32_t BCCR;     /*!< LTDC Background Color Configuration Register,        Address offset: 0x2C */

  uint32_t      RESERVED3[1];  /*!< Reserved,                                                       0x30 */

  __IO uint32_t IER;      /*!< LTDC Interrupt Enable Register,                      Address offset: 0x34 */

  __IO uint32_t ISR;      /*!< LTDC Interrupt Status Register,                      Address offset: 0x38 */

  __IO uint32_t ICR;      /*!< LTDC Interrupt Clear Register,                       Address offset: 0x3C */

  __IO uint32_t LIPCR;    /*!< LTDC Line Interrupt Position Configuration Register, Address offset: 0x40 */

  __IO uint32_t CPSR;     /*!< LTDC Current Position Status Register,               Address offset: 0x44 */

  __IO uint32_t CDSR;     /*!< LTDC Current Display Status Register,                 Address offset: 0x48 */

} LTDC_TypeDef;  

__IO表示volatile, 这是标准C语言中的一个修饰字,表示这个变量是非易失性的,编译器不要将其优化掉。core_m4.h 文件定义了这个宏:


#define     __O     volatile             /*!< Defines 'write only' permissions */

#define     __IO    volatile             /*!< Defines 'read / write' permissions */

[1] [2] [3] [4]
关键字:STM32F429  LCD控制器  LTDC  HAL库API 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic567926.html

上一篇:第41章 STM32F429的LTDC应用之LCD汉字显示和2D图形显示
下一篇:第39章 STM32F429的FMC总线应用之SDRAM

推荐阅读

STM32F429 PWM配置
void TIM4_PWM_Init(u32 arr,u32 psc, u32 dutyCycle){ GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //TIM4时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, EN
发表于 2022-05-20
第3章 STM32F429整体把控
3.1 初学者重要提示学习一款新的芯片,优先掌握系统框架是比较重要的,建议逐渐养成这种学习习惯,然后各个击破即可。本章节提供了多张STM32F429的框图,这些框图都非常具有代表性。很多时候记忆知识点比较费脑子,记录这些框图是一种非常好的方式。对于本章节提供的部分知识点,无法理解透彻,暂时没有关系。随着后面的深入学习,基本都可以掌握。3.2 STM32F429硬件框图学习一款新的芯片,需要优先了解一下它的整体功能设计。需要的资料主要是来自官网和数据手册,比如我们V6开发板使用的STM32F429BIT6,直接在官方地址:链接(这是超链接)就可以看到对此芯片所做的介绍,页面中有一个如下的框图,对于了解STM32F429整体设计非常方便
发表于 2022-04-15
第3章 <font color='red'>STM32F429</font>整体把控
第2章 STM32F429的开发环境搭建
2.1 初学者重要提示如果使用JLINK调试下载STM32F429,可以使用JLINK V8,V9或V10,推荐使用V9和V10。如果使用STLINK调试下载STM32F429,推荐使用最新的电脑端驱动和对应的固件,详情见本章2.6小节。MDK5的工程创建,调试方法以及字体设置,多核编译,语法提示等设置在第4章和第5章有详细说明。IAR8的工程创建,调试方法以及字体设置,语法提示等设置在第6章和第7章有详细说明。2.2 常用的开发工具开发STM32软件,需要配置一个仿真器(也可以叫下载器),同时必须在PC机上安装一系列软件。可以使用JLINK、CMSIS-DAP、ULINK或者STLINK仿真器来下载和调试程序,虽然STM32支持串
发表于 2022-04-15
第2章 <font color='red'>STM32F429</font>的开发环境搭建
第1章 初学STM32F429的准备工作
1.1 初学者重要提示关于学习方法问题,可以看附件章节A。学会 STM32F429相关资源的获取方法,做到心中有数,否则心里老是没底。关于MDK和IAR两种编译器,推荐都掌握,以其中一个为主,另一个为辅。因为很多时候我们需要参考的工程代码不是自己熟悉的编译器,就会很被动。这几年涌现出好几款非常棒的调试工具(如Event Recoder,SEGGER RTT),教程的后面章节会为大家做讲解。1.2 开发环境说明1、 IDE:支持两种IDE开发环境,MDK和IAR MDK推荐使用MDK5.26正式版及其以上版本。 IAR固定使用IAR8.3版本,由于IAR向下兼容性稍差,其它版本未做支持。2、 调试器使用JLINK,CMSIS-DAP,
发表于 2022-04-14
第1章 初学<font color='red'>STM32F429</font>的准备工作
第5章 STM32F429下载和调试方法(MDK5)
5.1 初学者重要提示如果使用JLINK调试下载STM32F429,可以使用JLINK V8,V9和V10。如果使用STLINK调试下载STM32F429,推荐使用最新的电脑端驱动和对应的固件,详情见第2章的2.6小节。MDK曾发布的STM32F1,F407,F429和F7的所有调试方法的设置细节及其注意事项,同样适用于STM32H7:http://www.armbbs.cn/forum.php?mod=viewthread&tid=14896 。MDK5调试过程中容易崩溃的问题,请看本章5.4小节,比较重要。JLINK无法下载解决思路以及常见问题整理,适用于其它LINK:http://www.armbbs.cn/forum.php
发表于 2022-04-14
第5章 <font color='red'>STM32F429</font>下载和调试方法(MDK5)
第6章 STM32F429工程模板建立(IAR8)
6.1 初学者重要提示IAR的工程创建过程还是比较重要的,务必实际上手操作一遍。6.2 第1步,创建工程文件夹创建一个文件夹,里面包含如下文件(直接将跑马灯例子的Project文件里面内容全部删除,然后整个工程复制进来即可)。Doc文件夹用于记录例程的修改记录和例子简介。Libraries文件夹在第一章详细介绍从官网的下载方法。Project文件夹这个是本章的重点,在这个文件夹里面再建立两个文件夹,EWARMv8文件夹用于存放IAR工程,MDK-ARM(uV5)文件夹里面用于存放MDK工程,方便以后创建MDK的工程。User文件夹这个是要用户提供的,开发板已经都提供好,bsp文件夹里面是开发板各个外设的驱动,segger文件夹是硬件
发表于 2022-04-14
第6章 <font color='red'>STM32F429</font>工程模板建立(IAR8)

推荐帖子

请问版主,STM32的Jtck上拉到10K,有何坏处
不慎将JTCK上拉到10K,不知长时间运行有何坏处。 非常期待回复!请问版主,STM32的Jtck上拉到10K,有何坏处
jerrygang stm32/stm8
(转)电磁干扰的屏蔽方法
电磁兼容性(EMC)是指“一种器件、设备或系统的性能,它可以使其在自身环境下正常工作并且同时不会对此环境中任何其他设备产生强烈电磁干扰(IEEEC63.12-1987)。”对于无线收发设备来说,采用非连续频谱可部分实现EMC性能,但是很多有关的例子也表明EMC并不总是能够做到。例如在笔记本电脑和测试设备之间、打印机和台式电脑之间以及蜂窝电话和医疗仪器之间等都具有高频干扰,我们把这种干扰称为电磁干扰(EMI)。 EMC问题来源   所有电器和电子设备工作时都会有间歇或连续性电压电流
blink 电源技术
如何把这个段程序移植到MSP430F1232上,用4M的晶振。
如何把这个段程序移植到MSP430F1232上,用4M的晶振。 //***************************************************************************** //MSP-FET430P140Demo-BootstrapLoader(BSL)Replicator // //Description:ThisprogramimplementstheBSLprotocolusedtodownload
wodedaqianjin 微控制器 MCU
自动布线和交互式布线有什么区别
在protel99se里面,自动布线和交互式布线有什么区别?交互式布线是什么意思? 我是刚学着画pcb,(以前是看懂别人画的即可),有很多不懂,要请教大家,谢谢!自动布线和交互式布线有什么区别
SnowfoxMetal 嵌入式系统
【资料】 分享一本模电的资料
网上找到的,,感觉还不错,跟大家分享一下。。。。 【资料】分享一本模电的资料
574433742 模拟电子
RTT&瑞萨高性能 CPK-RA6M4 开发板测评——光线传感器
一、硬件 本次测评的是Intersil一款极具超小封装的数字型红外光传感器--ISL29035. ISL29035是业界最小的采用6个管脚的数字型红外光传感器,能够实现对各种光源的精准检测。其除了具有高灵敏度的特性,还包括:   (1)采用6个管脚的业内最小的数字光传感器;   (2)提供市场领先的宽角度的光响应特性;   (3)支持Windows8和Android操作系统的要求;   (4)宽动态光照度范围可增强用户的视觉体验;   (5)内部集成的ADC可以直接将光
怀揣少年梦 瑞萨电子MCU
小广播
实战 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved