3、启动时序基础概念:上电时序、复位时序、初始化时序、显示时序(VBLANK/HBLANK)

各位好,今天我们聊聊多屏系统里最基础、也最容易踩坑的部分——启动时序。说白了,就是各个模块从「冷冰冰的硬件」到「能正常显示画面」这一路上,谁先谁后、谁等谁的问题。

我刚开始做多屏项目时,总觉得时序这东西嘛,按手册接好电源、写好初始化代码就行了。结果第一次联调,三块屏死活不同步,有的亮得早,有的亮得晚,还有一块直接花屏。嗯,从那以后,我再也不敢小看启动时序了。

3.1 上电时序:谁先吃饱饭?

上电时序,就是给系统各个部分供电的顺序。多屏系统里,通常有主控芯片、DDR内存、多个显示驱动IC、背光驱动等。它们对电源的要求不一样。

核心原则:先给核心逻辑供电,再给I/O和模拟部分供电。反过来容易导致芯片内部锁死,甚至烧坏。

典型上电顺序(以某款常见多屏驱动方案为例):

  1. VDD_CORE (1.1V) —— 先给核心逻辑供电
  2. VDD_DDR (1.8V) —— 内存供电
  3. VDD_IO (3.3V) —— I/O接口供电
  4. VDD_PLL (1.8V) —— 锁相环供电
  5. VDD_LCD (3.3V / 1.8V) —— 显示驱动IC供电
  6. VDD_BACKLIGHT (12V) —— 背光供电(最后上)

我个人习惯,在每个电源轨之间留至少1ms的延迟。别小看这1ms,它能避免电源同时启动时的大电流冲击。我在一个项目中遇到过,因为背光和核心电源同时上电,导致电源管理IC过流保护,系统反复重启。后来加了延时,问题就解决了。

注意:不同显示IC的上电时序要求可能不同。有的要求VDD_IO先于VDD_CORE,有的则相反。一定要仔细看数据手册的「Power Sequence」章节。我曾经因为没看手册,直接套用上一个项目的时序,结果新屏死活点不亮。

3.2 复位时序:让系统「清醒」过来

上电完成后,接下来就是复位。复位信号的作用,是把所有寄存器、状态机恢复到已知的初始状态。

复位时序的关键点:

  • 复位信号必须在所有电源稳定之后才能释放
  • 复位脉冲宽度要足够长(通常至少10个时钟周期)
  • 多个屏的复位信号最好独立控制,方便单独复位

你想想看,如果电源还没稳定就释放复位,芯片内部的状态机可能进入一个「中间态」,既不是复位状态,也不是正常工作状态。这种状态最危险,因为它不可预测。

我的经验:复位释放后,不要立即开始初始化。我习惯再等5-10ms,让内部振荡器和PLL完全锁定。这个「等待窗口」能避免很多莫名其妙的初始化失败。

3.3 初始化时序:配置「大脑」和「眼睛」

初始化时序,就是通过I2C、SPI等接口,向显示驱动IC写入配置寄存器。这一步决定了屏的显示模式、分辨率、刷新率等。

初始化顺序一般如下:

  1. 软件复位(让IC内部状态机复位)
  2. 设置电源相关寄存器(升压、稳压等)
  3. 设置时钟相关寄存器(PLL分频、倍频)
  4. 设置显示参数(分辨率、时序参数)
  5. 设置Gamma校正(色彩调整)
  6. 退出睡眠模式(Display On)

这里有个坑:很多驱动IC在退出睡眠模式后,需要等待一段时间(通常是120ms左右)才能开始发送显示数据。这个等待时间叫「DCS Exit Sleep Mode Wait Time」。我见过有人没等够时间就发数据,结果画面撕裂、闪烁。

// 伪代码示例:初始化一块常见的MIPI DSI屏
void lcd_init(void) {
    // 1. 软件复位
    dsi_write_cmd(0x01);  // Software Reset
    delay_ms(10);         // 等待复位完成

    // 2. 设置电源
    dsi_write_cmd(0x11);  // Exit Sleep Mode
    delay_ms(120);        // 必须等待!手册要求至少120ms

    // 3. 设置显示参数
    dsi_write_cmd(0x36);  // Memory Access Control
    dsi_write_data(0x00); // 参数:正常方向

    // 4. 开启显示
    dsi_write_cmd(0x29);  // Display On
    delay_ms(50);         // 等待显示稳定
}

3.4 显示时序:VBLANK 和 HBLANK

显示时序,是屏幕在逐行扫描时,每一行和每一帧之间的「空白时间」。这两个概念,搞多屏同步时必须理解透彻。

HBLANK(水平消隐): 扫描完一行像素后,电子枪(或TFT扫描线)从右边界回到左边界的时间。这段时间不传输有效像素数据。

VBLANK(垂直消隐): 扫描完一帧后,从右下角回到左上角的时间。这段时间也不传输有效像素数据。

为什么需要它们?

  • 给显示驱动IC留出处理时间(如行缓存刷新、Gamma切换)
  • 防止画面撕裂(VBLANK期间更新帧缓冲最安全)
  • 多屏同步时,VBLANK是天然的「同步信号」

我做过一个三屏拼接项目,要求三块屏的画面完全同步。一开始我直接用帧同步信号,但发现三块屏的VBLANK起始时间总有微小偏差。后来我改用「VBLANK中断同步法」:每块屏在VBLANK中断里发送一个同步脉冲,主控收到所有脉冲后,再统一触发下一帧的更新。这样就把偏差控制在了一个像素时钟以内。

参数 典型值(1080p@60Hz) 说明
HBLANK 280 像素时钟 每行扫描完后的水平消隐
VBLANK 45 行时间 每帧扫描完后的垂直消隐
HFP (Horizontal Front Porch) 88 像素时钟 行有效数据前的消隐
HSW (Horizontal Sync Width) 44 像素时钟 行同步脉冲宽度

避坑指南:我曾经在调整VBLANK时长时,为了「省带宽」把VBLANK压得太短。结果屏的刷新率不稳定,画面偶尔抖动。后来发现,VBLANK太短会导致驱动IC来不及完成内部处理。建议VBLANK至少保留5%的帧周期。

3.5 小结:启动时序的「黄金法则」

说了这么多,其实核心就几条:

  • 上电:先核心后外围,留足延时
  • 复位:等电源稳定再释放,脉冲宽度要够
  • 初始化:按手册顺序来,别跳过等待时间
  • 显示:用好VBLANK,它是多屏同步的「节拍器」

下一章,我们会深入讲「多屏同步策略」,包括硬件同步和软件同步的取舍。到时候我会分享一个用FPGA做多屏同步的实战案例,那个项目让我对时序有了更深的理解。咱们下章见。