4. 水平时序详解:HBP、HFP、HSW、HACT

各位同学,今天我们来啃一块硬骨头——水平时序。说白了,就是一行像素从左到右,怎么被送出去的整个过程。

我刚开始接触显示驱动时,总觉得水平时序不就是一行数据嘛,有什么好研究的?直到有一次调试一块4K高刷屏,画面右侧总是出现一条细细的暗线,查了三天才发现是HBP配错了。嗯,从那以后我再也不敢小看这几个参数了。

4.1 水平时序的四个核心参数

先看一张图,这是我手绘的水平时序结构,帮你建立直观印象:

水平时序结构图(一行像素的完整周期) HSW 同步脉宽 HBP 水平后肩 HACT(有效像素数据) 1920 / 2560 / 3840 个像素 HFP 水平前肩 DE=0 DE=0 DE=1(数据有效) DE=0 ← 一行总像素(HTotal)→

你想想看,一行像素的传输,就像一列火车进站。HSW是火车头鸣笛,HBP是乘客上车准备,HACT是车厢里坐满的乘客,HFP是乘客下车后的空档。四个阶段缺一不可。

4.2 HSW(水平同步脉宽)

HSW是什么?它是行同步信号(HSYNC)保持低电平(或高电平,取决于极性)的持续时间。说白了,就是告诉显示器:「下一行要开始了,准备接收!」

我个人习惯把HSW比喻成「起跑枪声」。枪声太短,选手听不清;枪声太长,选手等得着急。HSW也是这个道理。

典型值参考:

  • 1080p 60Hz:HSW = 44 像素时钟
  • 1080p 144Hz:HSW = 32 像素时钟
  • 4K 60Hz:HSW = 88 像素时钟
  • 4K 120Hz:HSW = 48 像素时钟

我在项目中遇到过一块奇葩的驱动IC,它的HSW必须大于等于20个像素时钟,否则行同步信号根本锁不住。当时看数据手册没注意这个细节,结果画面一直闪。后来翻到手册第47页的小字才找到这个限制条件。所以啊,数据手册一定要看全,尤其是那些「Note」部分。

4.3 HBP(水平后肩)

HBP是什么?它是行同步信号结束后,到有效像素数据开始之间的空白期。这段时间DE(数据使能)信号为低电平,不传输任何像素数据。

你可能会问:「为什么要留这段空白?」

原因有两个:

  1. 给显示面板缓冲时间——行同步结束后,面板内部的扫描电路需要时间稳定下来,然后才开始接收像素数据。
  2. 满足时序约束——有些显示接口(比如LVDS、eDP)对HBP有最小要求,太短会导致数据采样出错。

避坑指南:

我曾经调试过一个项目,为了压榨带宽,把HBP从88砍到了12。结果画面右侧出现了一条垂直的「鬼影」——其实就是上一行的残留电荷没来得及释放,被新一行的数据干扰了。后来老老实实把HBP恢复到48,问题消失。

所以我的建议是:HBP不要小于显示面板数据手册中规定的最小值,最好留20%的余量。

4.4 HFP(水平前肩)

HFP是什么?它是有效像素数据传输结束后,到下一个行同步信号开始之间的空白期。同样,DE信号为低电平。

HFP的作用和HBP类似,但侧重点不同:

  • HBP:给接收端准备时间
  • HFP:给发送端收尾时间

你想想看,一行数据传完了,发送端需要时间把总线状态拉回空闲,然后才能发起下一行的同步信号。HFP就是干这个的。

参数 位置 主要作用 常见范围(像素时钟)
HSW 行周期最前面 同步信号,标识行开始 16 ~ 128
HBP HSW之后,HACT之前 接收端准备,消除残影 16 ~ 256
HACT 中间段 传输有效像素数据 640 / 1280 / 1920 / 3840
HFP HACT之后,下一个HSW之前 发送端收尾,总线释放 16 ~ 256

4.5 HACT(水平有效像素)

HACT就是一行中真正显示在屏幕上的像素数量。比如1920×1080的分辨率,HACT就是1920个像素。这部分没什么好说的,分辨率是多少,HACT就是多少。

但有一点要注意:HACT必须和显示面板的物理分辨率严格匹配。多一个像素或少一个像素,画面都会错位。

实用技巧:

如果你在调试时发现画面左右偏移,或者有垂直条纹,大概率是HACT配错了。我曾经犯过这种低级错误——把1920写成了1922,结果画面整体右移了两个像素,左侧出现了一条黑边。排查了半天才发现是代码里多写了两个像素的循环。

所以我的习惯是:在初始化代码里把HACT单独定义成一个宏,和分辨率定义放在一起,避免手误。

4.6 水平时序的完整计算

一行像素的总长度(HTotal)等于这四个参数之和:

HTotal = HSW + HBP + HACT + HFP

举个例子,1080p 60Hz的典型时序:

HSW  = 44
HBP  = 148
HACT = 1920
HFP  = 88
-----------------
HTotal = 44 + 148 + 1920 + 88 = 2200 像素时钟

有了HTotal,我们就可以算出行频:

行频 = 像素时钟 / HTotal

比如像素时钟是148.5MHz,那么:

行频 = 148.5MHz / 2200 ≈ 67.5 KHz

这个67.5KHz就是一行一行的刷新频率。再乘以总行数(VTotal),就得到帧率了。这部分我们下一章讲垂直时序时会详细展开。

4.7 高刷新率下的水平时序调整

高刷屏(120Hz、144Hz、240Hz)对水平时序有什么特殊要求?

说白了,就是时间更紧了。同样的HTotal,刷新率翻倍意味着像素时钟也要翻倍。但像素时钟不能无限提高,所以只能压缩HBP、HFP、HSW这些空白期。

我调试过一块240Hz的Fast IPS面板,它的HBP只有16个像素时钟,HFP只有8个。这么短的空白期,对信号质量要求极高。稍微有点信号反射或者串扰,画面就会出现噪点。

我的经验是:

  • 高刷屏的HBP/HFP尽量保持对称,比如HBP=HFP=32,这样时序最稳定
  • HSW不要小于16,否则行同步信号可能被误判为噪声
  • 如果画面有闪烁,先检查HBP是否太小,而不是盲目加大HTotal

核心要点总结:

  • 水平时序由HSW、HBP、HACT、HFP四个参数组成
  • HACT等于水平分辨率,不可更改
  • HBP和HFP是空白期,用于信号稳定和时序缓冲
  • 高刷新率下需要压缩空白期,但要注意信号完整性
  • 数据手册中的最小值是底线,建议留余量

好了,水平时序就讲到这里。这几个参数看着简单,但实际调试中坑不少。我建议你在做驱动移植时,先把这几个参数打印出来,和面板数据手册一一核对,能省去很多排查时间。


公众号:蓝海资料掘金营,微信deep3321