STM32 RGBLCD
2023-02-09
5分钟阅读时长
开发环境
- 开发板: STM32F767IGT6 核心板加正点原子阿波罗底板
- 屏幕:正点原子 ALIENTEK 7 RGB LCD 屏幕
- 开发软件:STM32CubeIDE
LTDC 外设概述
LTDC 概念
LTDC 全称 LCD-TFT Display Controller,LCD 显示控制器,提供了 RGB 信号和控制信号来直接控制外部 LCD 显示屏。
-
TFT-LCD 屏幕
- 一般 TFT-LCD 屏幕中带有驱动 IC,并集成有显存,其内部就在不断的将显存内容显示到 LCD 面板上;
- 驱动屏幕时往往是直接去操作驱动 IC,通过发送操作命令来设置显示模式,通过发送显示数据来修改显存内容。
-
数据通信
- GPIO 传送 LCD_RS 命令/数据到 IC;
- FMC 传送 LCD_CS 片选信号到 IC;
- FMC 传送 LCD_WR 写使能信号到 IC;
- FMC 传送 LCD_RD 读使能信号到 IC;
- IC 传送 D0-D15 16 位数据总线到 FMC;
-
RGB 屏幕
- RGB 类型的屏幕中内部没有驱动 IC,操作这种屏幕时往往使用 MCU 内部集成的 LCD 控制器直接去控制 LCD 显示;
- 显存空间当然也是在 MCU 内部,按照空间大小可以选择放在内部 SRAM 或者外部 SDRAM 中。
-
数据通信
- LTDC 传送 LCD_HSYNC 水平同步信号;
- LTDC 传送 LCD_VSYNC 垂直同步信号;
- LTDC 传送 LCD_DE 数据使能信号;
- LTDC 传送 LCD_CLK 像素时钟;
- LTDC 传送 R0-R7 8 位数据总线;
- LTDC 传送 G0-G7 8 位数据总线;
- LTDC 传送 B0-B7 8 位数据总线;
颜色格式
LCD 可以理解为像素阵,其常见的参数是:
- 屏幕尺寸 表示对角线的长度,单位是英寸
- 屏幕分辨率 像素点的数量,1024*600 表示一行有 1024 个像素点,共 600 行
-
色彩格式
- 用于控制每个像素点的颜色
- 单色屏每个像素点只需要 1 bit 表示(非黑即白)
-
彩色屏每个像素点由 RGB 三原色的值混合
- RGB888(3B):R值 8 位、G值 8 位、B值 8 位
- RGB565(2B):R值 5 位、G值 6 位、B值 5 位
- ARGB8888(4B):在 RGB888 基础上增加 8 位 Alpha 值表示透明度,0x00 表示完全透明,0xFF 表示完全不透明
- ARGB1555(2B):在 RGB565 基础上砍掉 1 位用于 Alpha,0 表示完全透明,1表示完全不透明
可以看到,RGB888 比 RGB565 表示的颜色更多,LTDC 对上述格式均支持;但是 RGB888 每个像素点需要 24bit(3 个字节)的显存空间来存储。
在资源紧张的嵌入式系统中,在一般屏幕显示需求中 RGB888 格式过于浪费珍贵的 SRAM 空间;因此在不影响显示的情况下,建议使用
RGB565
格式,每个像素点只需要 16bit(两个字节)的显存空间就够了。
液晶面板的控制信号
- RGB 信号线 RGB 信号线各有 8 根,分别用于表示液晶屏一个像素点的红、绿、蓝颜色分量。
- 同步时钟信号 CLK 液晶屏与外部使用同步通讯方式,以 CLK 信号作为同步时钟,在同步时钟的驱动下,每个时钟传输一个像素点数据。
-
水平同步信号 HSYNC
- 水平同步信号 HSYNC(Horizontal Sync) 用于表示液晶屏一行像素数据的传输结束
- 每传输完成液晶屏的一行像素数据时,HSYNC 会发生电平跳变 如分辨率为 800x480 的显示屏(800 列,480 行),传输一帧的图像 HSYNC 的电平会跳变 480 次。
-
垂直同步信号 VSYNC
- 垂直同步信号 VSYNC(Vertical Sync) 用于表示液晶屏一帧像素数据的传输结束
- 每传输完成一帧像素数据时,VSYNC 会发生电平跳变。
- “帧”是图像的单位,一幅图像称为一帧。在液晶屏中,一帧指一个完整屏液晶像素点
- 人们常常用“帧每秒”来表示液晶屏的刷新特性,即液晶屏每秒可以显示多少帧图像。如液晶屏以 60 帧每秒的速率运行时,VSYNC 每秒钟电平会跳变 60 次。
- 数据使能信号 DE 数据使能信号 DE(Data Enable) 用于表示数据的有效性,当 DE 信号线为高电平时,RGB 信号线表示的数据有效。
液晶通讯的时间参数和传输时序
建议参考《野火 STM32 HAL 库开发指南》书中 LTDC 部分。
- 液晶屏显示的图像可看作一个矩形。液晶屏有一个显示指针,它指向将要显示的像素。
- 显示指针的扫描方向方向从左到右、从上到下,一个像素点一个像素点地描绘图形。这些像素点的数据通过 RGB 数据线传输至液晶屏,它们在同步时钟 CLK 的驱动下依次传输到液晶屏中交给显示指针。
- 当传输完成一行时,水平同步信号 HSYNC 电平跳变一次,当完成传输一帧时,垂直同步信号 VSYNC 电平跳变一次。
- Active width 和 Active height 是可见的 LCD 显示面板分辨率,称为有效宽度和有效高度。
-
传送数据行过程:
- 传输 HSYNC 信号数据,用
HSW
表示其宽度,单位为 CLK 个数; - 等待
HBP
,即从该水平同步信号开始到有效数据开始间的 CLK 个数; - 传送有效数据;
- 等待
HFP
,即从有效数据结束到下一个水平同步信号开始间的 CLK 个数;
- 传输 HSYNC 信号数据,用
-
传送数据帧过程:
- 传输 VSYNC 信号数据,用
VSW
表示其宽度,单位为行; - 等待
VBP
,它表示在一帧图像开始时,垂直同步信号以后的无效的行数; - 传送有效高度的数据行;
- 等待
VFP
,表示在一帧图像结束后,垂直同步信号以前的无效的行数;
- 传输 VSYNC 信号数据,用
- 在时间参数控制区域,数据使能信号线 DE 均为低电平;仅在传送有效数据时 DE 为高电平;
图像数据混合
LTDC 有三个层:背景层(BG)、图层 1(Layer1)、图层 2(Layer2)。
- 背景层只能是 RGB888 格式,并且是一个常量值,在 LTDC 初始化结构体中由 Backcolor 成员指定;
-
图层用来显示内容;
- 大小是设置的 Active width 和 Active height,称为有效区域;
- 在这个图层的有效区域中,用户可以设置一个任意大小的窗口用于显示,称为 Window;
- 当窗口小于图层有效区域时,窗口之外的区域会显示该图层背景色;
-
图层混合
- 首先,背景和图层的大小都是 Active width 和 Active height;
- 背景层在最下面,如果开了单个图层,则显示结果为背景层和单个图层混合结果;如果两个图层都开,则显示结果为背景层先和图层 1 混合,混合结果再与图层 2 混合的结果;
- 图层混合在 LTDC 硬件上是一直开启的,可以直接配置该图层用于混合的 Alapha 常量来调节整层透明度,范围为 0-255,0 为完全透明、255 为不透明、127 为半透明;