STM32 - L4系列芯片手册: LTDC功能

  
STM32L4系列芯片手册 - LTDC功能
LCD-TFT display controller (LTDC)
简介

LCD-TFT(液晶显示器-薄膜晶体管)显示控制器提供了一个并行的数字RGB(红、绿、蓝)信号。
还提供水平/垂直同步信号、像素时钟和数据,这些作为输出,直接与各种LCD和TFT面板连接。
LTDC的主要功能
- 24位RGB并行像素输出;每像素8位(RGB888)。
- 2个显示层,有专用的FIFO(64x32位)。
- 颜色查找表(CLUT),每层最多256种颜色(256x24位)。
- 不同显示面板可对时序编程
- 背景颜色可编程
- HSYNC、VSYNC和数据启用的极性可编程
- 每层支持多达8种输入颜色格式:
- ARGB8888
- RGB888
- RGB565
- ARGB1555
- ARGB4444
- L8 (8位亮度或CLUT)
- AL44 (4位阿尔法透明通道+4位亮度)
- AL88 (8位阿尔法透明通道+8位亮度)
- 每通道低比特的伪随机抖动输出, 红、绿、蓝的抖动宽度为2比特
- 使用alpha值(每个像素或常数)在两层之间灵活混合
- 抠色(透明色)。
- 可编程的窗口位置和大小
- 支持薄膜晶体管(TFT)彩色显示器
- 具有16个字连续传输能力的AHB主接口
- 多达4个可编程的中断事件
LTDC的框图
层FIFO: 每层有一个64x32位的FIFO。
PFC:像素格式转换器,进行像素格式转换,从选定的输入模式的像素格式转换为字形式。
AHB接口:用于从存储器到FIFO的数据传输。
混合、抖动单元和定时发生器。
LTDC端子和外部信号接口:
LCD-TFT 
signals 
I/O Description
LCD_CLK
O
Clock output
LCD_HSYNC
O
Horizontal synchronization
LCD_VSYNC
O
Vertical synchronization
LCD_DE
O
Not data enable
LCD_R[7:0]
O
Data: 8-bit red data
LCD_G[7:0]
O
Data: 8-bit green data
LCD_B[7:0]
O
Data: 8-bit blue data
LTDC最多支持24位输出,RGB888,如果少于8bpp的位深,比如是RGB565,数据信号要优先使用MSB数据线。
R[4:0], G[5:0] 和B[4:0]这些数据,数据线端子映射到LCD-TFT控制器的LCD_R[7:3], LCD_G[7:2] and LCD_B[7:3]。
LTDC reset and clocks
LTDC控制器使用的时钟域:
 - AHB clock domain (HCLK)
使用此时钟的是数据从存储器传到某个层的FIFO里,和每帧数据的配置寄存器
 - APB2 clock domain (PCLK2)
使用此时钟的有全局配置寄存器和中断寄存器  
 - Pixel clock domain (LCD_CLK)
这个时钟域包含像素数据生成、层配置寄存器以及以及LCD-TFT接口信号发生器。LCD_CLK的输出必须按照面板的要求进行配置。LCD_CLK是由一个特定的PLL输出产生的。
输出(参考复位和时钟控制部分)。
寄存器使用的时钟域如下表:
LTDC register 
Clock domain
LTDC_LxCR
HCLK
LTDC_LxCFBAR
HCLK
LTDC_LxCFBLR
HCLK
LTDC_LxCFBLNR
HCLK
LTDC_SRCR
PCLK2
LTDC_IER
PCLK3
LTDC_ISR
PCLK4
LTDC_ICR
PCLK5
LTDC_SSCR
Pixel clock (LCD_CLK)
LTDC_BPCR
Pixel clock (LCD_CLK)
LTDC_AWCR
Pixel clock (LCD_CLK)
LTDC_TWCR
Pixel clock (LCD_CLK)
LTDC_GCR
Pixel clock (LCD_CLK)
LTDC_BCCR
Pixel clock (LCD_CLK)
LTDC_LIPCR
Pixel clock (LCD_CLK)
LTDC_CPSR
Pixel clock (LCD_CLK)
LTDC_CDSR
Pixel clock (LCD_CLK)
LTDC_LxWHPCR
Pixel clock (LCD_CLK)
LTDC_LxWVPCR
Pixel clock (LCD_CLK)
LTDC_LxCKCR
Pixel clock (LCD_CLK)
LTDC_LxPFCR
Pixel clock (LCD_CLK)
LTDC_LxCACR
Pixel clock (LCD_CLK)
LTDC_LxDCCR
Pixel clock (LCD_CLK)
LTDC_LxBFCR
Pixel clock (LCD_CLK)
LTDC_LxCLUTWR
Pixel clock (LCD_CLK)
在访问LTDC寄存器时必须注意,APB2总线在以下时间段内会停滞:
对于PCLK2时钟域上的寄存器,APB2总线在寄存器写访问期间停滞6个PCKL2周期,在读访问期间停顿7个PCKL2周期。
LCD控制器可以通过设置RCC_APB2RSTR寄存器中的相应位来复位LCD控制器。它重置了三个时钟域。
LTDC global configuration parameters - Synchronous timings
HBP和HFP分别是水平后延时和前延时。VBP和VFP分别是垂直后延时和前延时。
LCD-TFT的可编程同步时序如下:
- HSYNC和VSYNC宽度:水平和垂直同步宽度,通过编程HSYNC宽度值来配置。
通过在LTDC_SSCR编程HSYNC宽度-1和VSYNC宽度-1的值来配置。
- HBP和VBP:在LTDC_BPCR寄存器中设置HSYNC宽度+HBP-1和VSYNC宽度+VBP-1。
- 有效宽度和高度:在LTDC_AWCR寄存器中设置HSYNC宽度+HBP-1和VSYNC宽度+VBP-1。
- 总宽度:在LTDC_TWCR寄存器中设置HSYNC宽度 + HBP + 活动宽度 + HFP - 1。
- 总高度:在LTDC_TWCR寄存器中设置VSYNC高度 + VBP + 活动高度 + VFP - 1 。
当LTDC停用时,将持续输出空白数据。
Example of synchronous timings configuration
LCD-TFT timings (must be extracted from panel datasheet):
• horizontal and vertical synchronization width: 0xA pixels and 0x2 lines
• horizontal and vertical back porch: 0x14 pixels and 0x2 lines
• active width and active height: 0x140 pixels, 0xF0 lines (320x240)
• horizontal front porch: 0xA pixels
• vertical front porch: 0x4 lines
The programmed values in the LTDC timings registers are:
• LTDC_SSCR register to be programmed to 0x00090001
(HSW[11:0] is 0x9 and VSH[10:0] is 0x1)
• LTDC_BPCR register to be programmed to 0x001D0003
(AHBP[11:0] is 0x1D (0xA+ 0x13) and AVBP[10:0]A is 0x3 (0x2 + 0x1))
• LTDC_AWCR register to be programmed to 0x015D00F3
(AAW[11:0] is 0x15D (0xA +0x14 +0x13F) and AAH[10:0] is 0xF3 (0x2 + 0x2 + 0xEF))
• LTDC_TWCR register to be programmed to 0x00000167
(TOTALW[11:0] is 0x167 (0xA +0x14 +0x140 + 0x9))
• LTDC_THCR register to be programmed to 0x000000F7
(TOTALH[10:0]is 0xF7 (0x2 +0x2 + 0xF0 + 3))
信号极性编程
水平垂直同步信号、数据使能信号和像素时钟的极性,低有效还是高有效可以同过LTDC_GCR寄存器来设置。
背景色
固定的背景色(RGB888)可以通过LTDC_BCCR寄存器进行编程。
它用于和底层的颜色混合。
抖动
使用LFSR的抖动伪随机技术是用来给每个像素的颜色通道(R、G或B)值添加一个小的随机值(阈值),从而在某些情况下将MSB四舍五入。
比如,当在18位显示器上显示24位数据时,加上这个随机数,有助于将MSB四舍五入。
抖动的伪随机技术与比较LSB和阈值的方法相同,如果LSB部分≥阈值,则只在MSB部分加1。LSB部分数据最后会丢掉。
一旦LCD-TFT控制器被启用,LFSR就会从第一个活动像素开始运行,它甚至在空白期和抖动被关闭时也保持运行。
如果LTDC被禁用,LFSR被重置。
拿黑白显示屏举例,几个像素点的数值位:
1 2 3 4 5 6 7 8
如果亮度下降20%,值为:
0.8 1.6 2.4 3.2 4.0 4.8 5.6 6.4
然后数据转为整数,截断后:
0 1 2 3 4 4 5 6
但如果上面小数加上0.5之后再截断:
1 2 2 3 4 5 6 6
类似的如果是RGB 24bit数值,左边是高位。
R 1110 1100
G 1110 1111
B 1110 1110
这个像素要在转成RGB 565格式数据,并显示到显示屏上,则变为:
R 1110 1xxx
G 1110 11xx
B 1110 1xxx
这样直接截断,对精度的损失较大,如果加上一个随机数,比如10,则变为
R 1110 1xxx
G 1111 00xx
B 1111 0xxx
这样颜色会更准确一些。
使用LTDC_GCR寄存器可以打开关闭抖动功能。
重新加载阴影寄存器
有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器)
设计preload register和shadow register的好处是,所有真正需要起作用的寄存器(shadow register)可以在同一个时间(发生更新事件时)被更新为所对应的preload register的内容,这样可以保证多个通道的操作能够准确地同步。如果没有shadow register,或者preload register和shadow register是直通的,即软件更新preload register时,同时更新了shadow register,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上其它因素(例如中断),多个通道的时序关系有可能是不可预知的。
一些配置寄存器是影子类型寄存器,写入后,可以设置为立刻加载,也可以在垂直消隐时加载。
选择立刻加载的话,要所有的新寄存器的值写完,才能激活加载过程。
读取这类寄存器,返回的是实际有效值,而新写入的值要在加载完成后才起作用,在加载期间不能再修改寄存器的值。
寄存器加载可以产生中断。
层操作可编程寄存器Layer programmable parameters
支持两个显示层,可以单独启用、停用和设置。
层显示的顺序是固定的,先底层,再上层。Layer 2是顶层。
每一显示层都可以调整位置和大小,但要在正常显示区间内。
窗口的位置和大小是通过左上角和右下角的X/Y位置以及内部定时发生器配置的,包括同步、后延时大小和活动数据区。
可编程层的位置和尺寸定义了一行的第一个/最后一个可见像素,以及窗口中的第一个/最后一个可见行。
它允许显示整个图像一部分。
中间这个灰色的是Active display Area,在前面图表中提过。
像素输入格式
层中的帧数据buffer的每个像素数据格式可设置。
通过LTDC_LxPFCR寄存器,最多支持8种像素数据格式。
像素数据从帧数据buffer中读取,然后转换为内部的8888(ARGB)格式。
宽度小于8比特的组件通过比特复制被扩展到8比特。
比如,RGB565的红色通道的5个比特成为43210,然后扩展为43210432,三个LSB用最高的三个MSB填充。
具体数据格式,请参照Datasheet。ARGB数据,B的数据地址在最低位。一个像素接着一个像素。
Color look-up table (CLUT)
CLUT可以在运行时通过修改LTDC_LxCR寄存器为每一层启用,它只在使用L8、AL44和AL88等输入像素格式为索引颜色的情况下有用。
首先,CLUT必须加载R、G和B值,以取代该像素的原始R、G、B
值(索引的颜色)。每种颜色(RGB值)都有自己在CLUT中的位置。
R、G、B值和它们各自的地址是通过LTDC_LxCLUTWR寄存器设置的。
- 如果是L8和AL88输入像素格式,CLUT必须按256种颜色加载。每种颜色的地址在LTDC_LxCLUTWR寄存器中配置。
- 如果是AL44输入像素格式,CLUT必须只加载16种颜色。每种颜色的地址必须通过将4位L通道复制到8位来填充,如下所示。
- L0(索引颜色0),地址为0x00
- L1,在地址0x11处
- L2,在地址0x22处
- .....
- L15,在地址0xFF处
图像帧数据地址Color frame buffer address
每个层都有一个通过LTDC_LxCFBAR寄存器配置的彩色帧缓冲器的起始地址。
当一个层被启用时,数据将从彩色帧缓冲器中获取。
帧数据长度Color frame buffer length
每一层都有一个以字节为单位的彩色帧缓冲器的每行的长度,以及帧缓冲器的行数, 在LTDC_LxCFBLR和LTDC_LxCFBLNR寄存器中配置。
行长和行数的设置用于在每帧数据结束时,停止从帧数据buffer中读取数据到layer的FIFO。
如果这两个设置所需字节数少于所需要的字节数,则会产生一个FIFO空载中断,如果这个中断被启用。
如果这两个设置所需字节数多于所需要的字节数,那从FIFO读出的多余无用数据会被丢弃。无用的数据不被显示。
每帧数据的间距设置
每一层都有一个可配置的彩色帧缓冲区的间距,即一行开始与下一行开始之间的距离,单位为字节。
它是通过LTDC_LxCFBLR寄存器配置。
图层混合
混合始终是激活的,两层可以按照通过LTDC_LxBFCR寄存器配置的混合系数进行混合。
混合的顺序是固定的,是自下而上的。如果启用了两个图层,首先将图层1与背景色混合, 然后混合后的结果再于层2进行混合。
默认颜色
每个图层都可以有一个格式为ARGB的默认颜色,在定义的图层窗口之外或当图层禁用时使用。
默认颜色是通过LTDC_LxDCCR寄存器配置的。
即使一个图层被禁用,混合也总是在两个图层之间进行。为了避免在某一图层被禁用时显示默认颜色,请将该图层的混合系数保持在其复位值。
色键配置
一个色键(RGB)可以被配置为透明像素的代表。
如果启用色键,当前像素与色键进行比较。如果它们与编程的RGB值,该像素的所有通道(ARGB)都被设置为0。
色键值可以在运行时设置。
颜色键控是通过LTDC_LxCKCR寄存器启用和设置的的。
编程后的数值取决于像素格式,因为它是在像素格式转换为ARGB888后与当前像素进行比较的。
例如:如果一个中黄的颜色(50%的红+50%的绿)被用作透明的颜色键。
分别混合)与色键进行比较。如果它们与编程的
RGB值,该像素的所有通道(ARGB)都被设置为0。
色键值可以在运行时设置。
颜色键控是通过LTDC_LxCKCR寄存器启用和设置的的。
编程后的数值取决于像素格式,因为它是在像素格式转换为ARGB888后与当前像素进行比较的。
到ARGB888后与当前像素进行比较。
例如:如果一个中黄的颜色(50%的红+50%的绿)被用作透明的颜色键。
取决于像素格式,因为它是在像素格式转换为ARGB888后与当前像素进行比较的。
到ARGB888后与当前像素进行比较。
例如:如果一个中黄的颜色(50%的红+50%的绿)被用作透明的颜色
键。
- 在RGB565中,中黄颜色是0x8400。将LTDC_LxCKCR设置为0x848200。
- 在ARGB8888中,中黄颜色是0x808000。将LTDC_LxCKCR设为0x808000。
- 在所有基于CLUT的颜色模式(L8、AL88、AL44)中,将调色板的一个条目设置为
中黄颜色0x808000,并将LTDC_LxCKCR设为0x808000。
中断LTDC interrupts
LTDC提供4个可屏蔽中断,通过或的关系关联到两个中断向量。
通过LTDC_IER寄存器来启用或关闭中断源。
将相应的屏蔽位设置为1启用相应的中断。
下面的事件可以触发中断:
 - 行中断
 - 寄存器加载中断
 - FIFO空载中断
 - 数据传输错误中断
这些中断事件和NVIC中断控制器相连接:
LTDC programming procedure
LTDC编程步骤
1. 在RCC寄存器中启用LTDC时钟。
2. 按照面板数据手册配置所需的像素时钟。
3. 配置同步时序:VSYNC, HSYNC, HBP,VBP,HFP,VFP和显示区域
4. 在LTDC_GCR寄存器中配置同步信号和时钟极性。
5. 如果需要,在LTDC_BCCR寄存器中配置背景颜色。
6. 在LTDC_IER和LTDC_LIPCR寄存器中配置需要的中断。
7. 通过以下方式配置layer1和2参数。
- 在LTDC_LxWHPCR和LTDC_WVPCR 寄存器中对层窗口的水平和垂直位置进行编程。
- 在LTDC_LxPFCR寄存器中设置对像素输入格式
- 在LTDC_LxCFBAR寄存器中设置对彩色帧缓冲器的起始地址
- 在LTDC_LxCFBLR 寄存器中设置对彩色帧缓冲器的每行像素数和间距
- 在LTDC_LxCFBLNR 寄存器中设置编程彩色帧缓冲器的行数。
- 如果需要,在LTDC_LxCLUTWR 寄存器中配置CLUT加载地址
- 如果需要,分别在LTDC_LxDCCR 和 LTDC_LxBFCR 寄存器中设置默认颜色和混合因子
8. 启用第1或2层,如果需要,在LTDC_LxCR寄存器中启用CLUT。
9. 如果需要,分别在LTDC_GCR和LTDC_LxCKCR寄存器中启用抖动和彩色键控功能。它们也可以在运行中被启用。
10. 通过LTDC_SRCR寄存器将阴影寄存器重新加载到活动寄存器。
11. 在LTDC_GCR寄存器中启用LCD-TFT控制器。
12. 除了CLUT之外,所有的层参数都可以被即时修改。新的配置必须立即重新加载,或者在垂直消隐期间通过配置LTDC_SRCR寄存器来完成。
LTDC寄存器
详情请查阅Datasheet。
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 用途是用于初始化 LCD 控制器。DMA2D_Init,用法用途是用于初始化 DMA2D 控制器。LTDC_LayerInit,用法用途是用于初始化 LTDC 图层。LTDC_ReloadConfig,用法用途是用于重新加载 LTDC 配置。 ### 回答2: STM32 HAL库提供的API函数中包括LTDC_Init函数,用于初始化LTDC(LCD-TFT显示控制器)模块。 LTDC_Init函数的使用方法如下: 在使用之前,需要确保已经在项目中引入了正确的库文件,并且已经包含了相应的头文件。 1. 调用LTDC_InitTypeDef结构体来定义和配置LCD控制器的参数。这个结构体包含了与LTDC相关的各种配置选项。 2. 设置结构体中需要配置的各项参数。这些参数包括时钟分频系数、像素时钟频率、水平和垂直同步信号的极性等。 3. 调用HAL_LTDC_Init函数,将上述配置应用到LTDC模块上。 下面是一个示例代码,仅供参考: ```c // 定义并初始化LTDC_InitTypeDef结构体 LTDC_HandleTypeDef hltdc; LTDC_InitTypeDef ltdc_config; // 配置LTDC_InitTypeDef结构体的各个参数 ltdc_config.HorizontalSync = 10; ltdc_config.VerticalSync = 10; ltdc_config.AccumulatedHBP = 20; ltdc_config.AccumulatedVBP = 10; //... // 将配置应用到LTDC模块上 hltdc.Instance = LTDC; hltdc.Init = ltdc_config; HAL_LTDC_Init(&hltdc); ``` 通过以上步骤,LTDC模块的配置就完成了。接下来,可以进一步配置其他相关参数,如背光控制、前景层和背景层的配置等。 需要注意的是,在使用LTDC_Init函数之前,还需先调用RCC配置函数来使能LTDC的时钟,以确保LTDC模块正常工作。 请注意,以上是一个简单的示例,具体的配置参数还需要根据实际的应用和硬件平台来进行调整。建议查阅STM32的相关参考文档,以获取更详细的配置信息和实例代码。 ### 回答3: STM32 HAL库中的LTDC_Init函数是用于初始化LCD控制器(LTDC)的函数。该函数主要用于配置LCD控制器的各种参数,以便正确驱动与之连接的LCD屏幕。 首先,要使用LTDC_Init函数,需要在代码中包含stm32f4xx_hal_ltdc.h头文件。 LTDC_Init函数的原型如下: HAL_StatusTypeDef LTDC_Init(LTDC_HandleTypeDef *hltdc) 该函数的参数是一个LTDC_HandleTypeDef结构体指针,用于传递LTDC控制器的配置参数。 在调用LTDC_Init函数之前,需要先创建一个LTDC_HandleTypeDef结构体,并对其中的成员进行配置。该结构体中的成员包括: - HorizontalSync:水平同步信号的极性和水平同步信号宽度的配置; - VerticalSync:垂直同步信号的极性和垂直同步信号宽度的配置; - AccumulatedHBP:水平后沿之后的像素数,即背景显示的宽度; - AccumulatedVBP:垂直后沿之后的行数,即背景显示的高度; - AccumulatedActiveW:可见像素的宽度; - AccumulatedActiveH:可见像素的高度; - TotalWidth:一行像素的总宽度; - TotalHeigh:一帧像素的总高度; - BackColor:背景颜色的配置; - ClockPolarity:时钟极性的配置; - HorizontalBackPorch:水平前沿和有色信息之间的像素数; - VerticalBackPorch:垂直前沿和有色信息之间的行数。 配置完以上参数后,就可以调用LTDC_Init函数,将配置好的LTDC_HandleTypeDef结构体传入。LTDC_Init函数内部会根据传入的配置参数,对LTDC进行相应的初始化操作,包括时钟配置、信号极性配置、背光颜色配置等。 总之,通过调用LTDC_Init函数,可以方便地进行LTDC控制器的初始化配置,以实现对LCD屏幕的正确驱动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值