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。