使用正点原子北极星STM32H750开发板驱动正点原子4.3寸RGB LCD。
一、LTDC介绍
LTDC属于DPI(display pixel interface,显示像素接口,也称RGB接口),可用于MCU驱动TFT屏幕。同时一般都会配备DMA2D用于图形加速显示。
STM32H750 最大支持RGB888(1600W 色),信号线如下图:
RGB888可向下兼容RGB666和RGB565。
RGB 屏一般有 2 种驱动模式:DE 模式和 HV 模式。DE 模式使用 DE 信号来确定有效数据 (DE 为高/低时,数据有效),而 HV 模式,则需要行同步和场同步,来表示扫描的行和列。
二、STM32 LTDC说明
STM32H750 的 LTDC 具有如下特点:
⚫ 24 位 RGB 并行像素输出;每像素 8 位数据(RGB888)
⚫ 2 个带有专用 FIFO 的显示层(FIFO 深度 64x32 位)
⚫ 支持查色表 (CLUT),每层高达 256 种颜色(256x24 位)
⚫ 可针对不同显示面板编程时序
⚫ 可编程背景色
⚫ 可编程 HSync、VSync 和数据使能(DE)信号的极性
⚫ 每层有多达 8 种颜色格式可供选择:ARGB8888、RGB888、RGB565、ARGB1555、ARGB4444、 L8(8 位 Luminance 或 CLUT)、AL44(4 位 alpha+4 位 luminance)和 AL88(8 位 alpha+8
位 luminance)
⚫ 每通道的低位采用伪随机抖动输出(红色、绿色、蓝色的抖动宽度为 2 位)
⚫ 使用 alpha 值(每像素或常数)在两层之间灵活混合
⚫ 色键(透明颜色)
⚫ 可编程窗口位置和大小
⚫ 支持薄膜晶体管 (TFT) 彩色显示器
⚫ AHB 主接口支持 16 个字的突发
⚫ 高达 4 个可编程中断事件
说明:
ARGB8888(4B):在RGB888的基础上增加了8位A值(Alpha),0x00表示完全透明、0xFF表示不透明;
ARGB1555(2B):在RGB565的基础上砍掉一位,用作A值,0表示完全透明、1表示不透明;
STM32H750 的 LTDC 总共有三个层:背景层、第一层和第二层,其中,背景层只可以是 纯色(即单色),而第一层和第二层都可以用来显示信息,两层各有一个FIFO,需要开辟两个显存缓冲区来存放第一层和第二层要显示的内容,LTDC将缓冲区数据取到FIFO中,混合单元会将三个层混合起来,进行 显示,显示关系如下图:
从图中可以看出,第二层位于最顶端,背景层位于最低端,混合单元首先将第一层与背景 层进行混合,随后,第二层与第一层和第二层的混合颜色结果再次混合,完成混合后,送给 LCD 显示。
STM32 LTDC留有AXI接口,用于链接外部SDRAM,快速读取和存放显存数据。显存计算:如果使用4.3寸800*480的LCD,以RGB565(16位)为例,一个像素点16bit(2字节),单层的显存缓冲区就有800*480*2 = 768000 Byte = 750 KB;以RGB888(24位)为例,一个像素点24bit(3字节),而单片机内没有24bit定义,只能使用32bit(4个字节),单层的显存缓冲区就有800*480*4 = 1536000 Byte = 1500 KB
三、LTDC关键时序参数
以上参数中,HSW也会被称为HPW,VSW也会被称为VPW,具体看LCD对应的手册描述。
本文使用正点原子的4.3寸RGB屏幕,其正确的LTDC 工作参数如下:
由上图可知,该屏幕的时钟最大工作频率在50MHz,常规使用30MHz,LCD刷新率 = LTDC时钟工作频率 / ((HSW + HBP +HFP -1) * (VSW + VBP +VFP -1)) ,30Mhz接近60Hz的刷新率。
HSW(HPW) = 48 pixels
HBP = 88 pixels
HFP = 40 pixels
VSW(VPW) = 3 lines
VBP = 32 lines
VFP = 13 lines
Active Width = 800 pixels
Active Height = 480 lines
四、代码范例
1、硬件环境:正点原子北极星STM32H750开发板、正点原子4.3寸RGB LCD
2、硬件连接图:
3、工程配置
本工程使用LTDC + SDRAM + DMA2D外设。(SDRAM的使用查看SDRAM驱动代码)
PB5为LCD背光引脚,一定要配置并在代码中打开,不然LCD一直都是黑的!!!
注意修改LTDC的引脚翻转速度为Very High。
其中LTDC的工作参数上文所述,填入即可。同时此处如果需要特定的背景颜色,则需要对Red、Green、Blue参数进行修改(范围0-255),例如设置Red = 255,那么上电LTDC运行成功之后,屏幕会呈现红色。
接下来对层进行设置,当前只设置了一层,显示范围为(0,0)到(800,480),颜色为RGB565,第一层和背景混合透明度为255(不透明),同时以固定的透明度进行混合,第一层的默认颜色透明度为0(基本没用,会受到混合透明度的影响),第一层的RGB默认颜色为纯蓝色,显存首地址为0xC0000000(因为外设接口SDRAM 1的映射地址为0xC0000000),显存空间为800 * 480像素(此处单位为像素,实际大小查看上文的计算方式)。
不开LTDC中断。
DMA2D推荐使用正点原子使用寄存器的写法,因为LTDC同时存在Memory to Memory(内存到内存)和Register to Memory(寄存器到内存)两种新形式。所以只要打开DMA2D即可。
需要特别注意的是,这里必须要配置DMA2D中断,否则在使用DMA2D传输数据是会一直等待传输完成。
时钟配置如图。
配置完成后,点击生成即可。
4、代码添加
SDRAM需要添加初始化代码。(SDRAM的使用查看SDRAM驱动代码)
在main.c文件中,MX_LTDC_Init();函数之后添加:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,GPIO_PIN_SET); //打开背光
只要SDRAM驱动成功后,点击下载,LCD呈现蓝色就表示LTDC驱动成功了。(蓝色是由上面的第一层默认颜色配置得到的,通过修改这里可以获得不同的显示颜色)。