STM32L4系列芯片手册 - 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的框图STM32L4系列芯片手册 - 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 STM32L4系列芯片手册 - LTDC功能 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位置以及内部定时发生器配置的,包括同步、后延时大小和活动数据区。 可编程层的位置和尺寸定义了一行的第一个/最后一个可见像素,以及窗口中的第一个/最后一个可见行。 它允许显示整个图像一部分。 STM32L4系列芯片手册 - LTDC功能 中间这个灰色的是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进行混合。 STM32L4系列芯片手册 - LTDC功能默认颜色 每个图层都可以有一个格式为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中断控制器相连接: STM32L4系列芯片手册 - LTDC功能STM32L4系列芯片手册 - LTDC功能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。
上一篇:深度盘点:Python 7种提效增速的技巧


下一篇:c++计算程序运行时间-毫秒级