3. LCD硬件时序

LCD 显示屏的驱动本质上是按照严格的时序要求,将像素数据逐行、逐帧地发送给显示面板。理解行同步(HSYNC)、场同步(VSYNC)、像素时钟(PCLK)以及前后肩(HBP/HFP/VBP/VFP)是编写正确 LCD 驱动的基础。本章将深入剖析这些时序参数的含义、作用以及它们之间的配合关系。

核心概念: LCD 时序可以类比为“电子扫描枪”在屏幕上逐行绘制图像。VSYNC 决定何时开始新的一帧,HSYNC 决定何时开始新的一行,PCLK 决定每个像素点数据的传输节奏,而前后肩则提供了必要的“消隐”和“准备”时间。

3.1 像素时钟(PCLK)

像素时钟(Pixel Clock,PCLK)是整个 LCD 时序系统中最基础的节拍信号。每来一个 PCLK 脉冲,驱动接口就会从 FIFO 中取出一个像素点的数据(如 RGB 分量)发送到数据线上。PCLK 的频率直接决定了数据传输的速率。

  • 频率计算: PCLK 频率 = 分辨率宽度 × 分辨率高度 × 刷新率 × (1 + 消隐区开销)。例如,1024×768 @ 60Hz 的典型 PCLK 约为 65 MHz。
  • 极性(Polarity): 数据在 PCLK 的上升沿或下降沿被采样。通常由 LCD 控制器寄存器配置,常见配置为“上升沿采样数据”。
  • 与数据线的关系: PCLK 的每个有效边沿对应一组 RGB 数据线的稳定状态。
驱动调试提示: 如果屏幕出现“花屏”、“水波纹”或“图像偏移”,首先检查 PCLK 频率是否与 LCD 面板数据手册严格匹配。频率偏差超过 1% 就可能导致显示异常。
像素时钟(PCLK)与数据采样关系 PCLK RGB Data[23:0] 采样点 1 采样点 2 采样点 3

3.2 行同步(HSYNC)与行时序

行同步信号(Horizontal Sync,HSYNC)用于标识新一行的开始。当 HSYNC 脉冲发出后,LCD 控制器开始传输当前行的像素数据。行时序由以下几个部分组成:

行时序参数 缩写 说明 典型值(1024×768)
行同步脉冲宽度 HSPW / HPW HSYNC 信号保持有效电平的 PCLK 周期数 136
行后肩 HBP HSYNC 结束到有效像素数据开始之间的 PCLK 周期数 160
行有效数据 HACT 实际显示一行像素所需的 PCLK 周期数(等于水平分辨率) 1024
行前肩 HFP 有效像素数据结束到下一个 HSYNC 开始之间的 PCLK 周期数 24

一行总长度(HTotal)= HSPW + HBP + HACT + HFP。驱动中配置的“行同步”相关寄存器通常需要设置这些参数。

行同步(HSYNC)时序结构 HSYNC 有效像素数据(HACT = 1024 PCLK) HSPW HBP HFP 一行总长度(HTotal)= HSPW + HBP + HACT + HFP

3.3 场同步(VSYNC)与帧时序

场同步信号(Vertical Sync,VSYNC)用于标识新一帧的开始。VSYNC 的脉冲频率决定了屏幕的刷新率(如 60Hz)。帧时序与行时序结构类似,但单位是“行数”而非 PCLK 周期。

帧时序参数 缩写 说明 典型值(1024×768)
场同步脉冲宽度 VSPW / VPW VSYNC 信号保持有效电平的行数 6
场后肩 VBP VSYNC 结束到有效数据第一行开始之间的行数 29
场有效数据 VACT 实际显示一帧图像所需的行数(等于垂直分辨率) 768
场前肩 VFP 有效数据最后一行结束到下一个 VSYNC 开始之间的行数 3

一帧总长度(VTotal)= VSPW + VBP + VACT + VFP。帧率 = PCLK 频率 / (HTotal × VTotal)。

场同步(VSYNC)与帧时序结构 VSYNC 有效行数据(VACT = 768 行) VSPW VBP VFP 一帧总长度(VTotal)= VSPW + VBP + VACT + VFP

3.4 前后肩(HBP/HFP/VBP/VFP)的作用

前后肩(Back Porch 和 Front Porch)是时序中看似“浪费”的消隐区间,但它们对显示稳定性至关重要:

  • 行后肩(HBP): 提供 HSYNC 结束后到像素数据开始前的准备时间,允许 LCD 面板的行驱动电路稳定下来。
  • 行前肩(HFP): 提供像素数据传输结束后到下一个 HSYNC 开始前的缓冲时间,防止数据溢出。
  • 场后肩(VBP): 在 VSYNC 结束后,允许垂直扫描电路复位并准备接收第一行数据。
  • 场前肩(VFP): 在最后一行数据发送完毕后,提供时间让电子枪(或等效电路)回到屏幕顶部,准备下一帧。
常见驱动错误: 将 HBP/HFP/VBP/VFP 设置为 0 或过小,会导致屏幕顶部/底部出现“撕裂”或“滚动条”,甚至完全无显示。务必参考 LCD 数据手册的最小值进行配置。

3.5 完整时序参数配置示例

以下是一个基于 Linux Framebuffer 驱动中常见的时序配置结构体示例,展示了如何将上述参数映射到代码中:

/* Linux 内核中的 LCD 时序结构体配置示例 */
static struct fb_videomode lcd_timing = {
    .name       = "1024x768@60",
    .refresh    = 60,
    .xres       = 1024,          /* 水平有效像素 */
    .yres       = 768,           /* 垂直有效像素 */
    .pixclock   = 15384,         /* 像素时钟周期(皮秒),对应约 65 MHz */
    .left_margin = 160,          /* HBP */
    .right_margin = 24,          /* HFP */
    .upper_margin = 29,          /* VBP */
    .lower_margin = 3,           /* VFP */
    .hsync_len  = 136,           /* HSPW */
    .vsync_len  = 6,             /* VSPW */
    .sync       = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, /* 极性 */
    .vmode      = FB_VMODE_NONINTERLACED,
};
参数换算关系: pixclock 的单位是皮秒(ps)。频率(Hz)= 1 / (pixclock × 10⁻¹²)。例如 15384 ps ≈ 65 MHz。务必使用数据手册提供的精确值,或通过示波器测量实际波形来校准。

3.6 时序参数与显示效果的关系

下表总结了时序参数配置不当可能引发的典型显示问题,帮助你在调试时快速定位:

问题现象 可能原因 排查方向
屏幕无显示,背光亮 VSYNC 或 HSYNC 极性错误;PCLK 频率严重偏离 检查 sync 标志位;用示波器测量 PCLK
图像整体偏移(左/右) HBP 或 HFP 配置错误 调整 left_margin 和 right_margin
图像整体偏移(上/下) VBP 或 VFP 配置错误 调整 upper_margin 和 lower_margin
屏幕闪烁或滚动 VSYNC 脉冲宽度(VSPW)过小;帧率不稳定 增大 vsync_len;检查 PCLK 抖动
图像有噪点或条纹 PCLK 极性错误;数据建立/保持时间不足 尝试反转 PCLK 边沿采样;检查 HBP
LCD 时序参数与显示区域映射 有效显示区域 (xres × yres) HBP HFP VBP VFP