嵌入式显示子系统低功耗配置:从时钟、FIFO到SDI接口的深度优化实践

嵌入式显示子系统低功耗配置:从时钟、FIFO到SDI接口的深度优化实践

1. 项目概述与核心挑战

在嵌入式系统,尤其是电池供电的移动设备开发中,显示子系统往往是整个系统的“耗电大户”。一块持续高刷新的屏幕,其背后的驱动电路、内存访问和时钟网络所消耗的能量,常常能占到整机功耗的30%甚至更高。因此,如何在不牺牲用户体验(如避免屏幕闪烁、拖影)的前提下,对显示子系统进行精细化的低功耗配置,是每一位嵌入式工程师必须掌握的硬核技能。这不仅仅是调几个寄存器参数那么简单,它涉及到对显示控制器架构、时钟树、内存带宽以及面板物理特性的深刻理解。

本次分享,我将以经典的TI OMAP34xx系列平台为蓝本,深入拆解其显示子系统(Display Subsystem, DSS)的低功耗配置精髓,并详细剖析其Serial Display Interface(SDI)模块与FlatLink3G协议的应用实践。你手头可能没有OMAP的开发板,但这套从时钟、FIFO到时序的优化思路,是跨平台通用的。我们会从最根本的“为什么”出发,把每个寄存器配置背后的物理意义和设计考量讲清楚,让你不仅能“抄作业”,更能自己“出题”。

2. 显示子系统低功耗核心机制解析

实现显示低功耗,核心思想是在屏幕内容静止或更新缓慢时,让系统“偷懒”。但这里的“偷懒”不是简单关闭显示,而是在维持画面显示(避免闪屏或极化)的前提下,最大限度地降低相关模块的活动频率和电压。OMAP DSS的低功耗刷新模式正是为此设计。

2.1 低功耗刷新模式的工作原理

当系统进入空闲状态(例如,手机锁屏后显示静态时钟),MPU(主处理器)可以进入睡眠模式。此时,显示子系统并未完全关闭,而是由内部的DMA控制器独立工作。它从SDRAM中的帧缓冲区(Frame Buffer)读取数据,填充到DSS内部的FIFO,再持续输出到LCD面板。由于MPU休眠,SDRAM在DMA访问间隙可以进入自刷新(Self-Refresh)模式,这是一种功耗极低的保持数据状态。整个过程中,只有DSS的电源域、DMA和必要的时钟电路保持活动,从而实现“屏幕亮着,但整体很省电”的状态。

这里的关键在于平衡:降低功耗不能影响显示的稳定性。如果DMA唤醒SDRAM太频繁,则省电效果不佳;如果FIFO设置不当导致数据断流(下溢),屏幕就会出现撕裂或闪烁。因此,所有优化都围绕“延长SDRAM睡眠时间”和“降低电路开关频率”这两个目标展开。

2.2 像素时钟:功耗与性能的平衡点

像素时钟(Pixel Clock, PCLK)是驱动LCD面板像素扫描的基础时钟,其频率直接决定了帧率(FPS)。公式很直观:FPS = 1 / [ (Htotal * Vtotal) * PCLK周期 ]。其中Htotal和Vtotal是包括消隐区(Blanking)的总行像素和总行数。

降低PCLK是省电的直拳。PCLK由系统功能时钟经过分频得到。以OMAP为例,其路径为:DPLL4 -> DSS功能时钟(DSS1_ALWON_FCLK)-> LCD逻辑时钟 -> 像素时钟。通过配置DSS.DISPC_DIVISOR寄存器的LCDPCD字段,可以逐级分频。

但这一拳不能打空。PCLK过低会导致帧率下降,当FPS低于某个阈值(通常为50-60Hz,因面板而异)时,人眼就会感知到屏幕闪烁。更隐蔽的风险是,某些LCD面板(特别是STN或某些低端TFT)的液晶分子需要维持一个最低频率的交流电场以防止直流极化损坏,这个最低频率通常在面板数据手册中明确给出。

实操心得:在调试低功耗PCLK时,不要只盯着寄存器值。务必用示波器测量实际的PCLK波形和频率,并在不同环境光下(特别是低亮度环境)长时间观察屏幕,确认无闪烁。我曾在一个项目中,将PCLK降到面板标称的最低值以下5%,初期测试正常,但在高温环境下批量生产时出现了零星极化故障,教训深刻。

2.3 DPLL4的低功耗停止模式

DPLL4是DSS功能时钟的源头。在深度低功耗场景下,我们可以将其置于低功耗停止模式(Low-Power Stop Mode)。此时,DSS1_ALWON_FCLK时钟会被切断。

那么显示时钟从何而来?系统需要切换到备用时钟源——DSI PLL功能时钟(DSI1_PLL_FCLK)。切换通过设置DSS.DSS_CONTROL[0] DISPC_CLK_SWITCH位实现。这里有一个关键顺序:必须在切换前,确保DSI PLL已经完成编程并锁定(Lock)。否则时钟会瞬间丢失,导致显示异常。

进入和退出此模式需要仔细编排

  1. 进入:配置DSI PLL并等待锁定 -> 切换时钟源至DSI1_PLL_FCLK-> 将DPLL4设置为自动空闲(AUTO_PERIPH_DPLL)或手动停止模式。
  2. 退出:使能DPLL4并等待其重新锁定 -> 将时钟源切换回DSS1_ALWON_FCLK-> 恢复原有时钟配置。

注意事项:DPLL4的锁定时间(Lock Time)不可忽略。在切换回DSS1_ALWON_FCLK后,必须插入足够的延时或通过状态位轮询,确认DPLL4已稳定输出,才能进行后续操作。匆忙操作会导致显示花屏或系统不稳定。

2.4 自动空闲与智能空闲机制

这是模块级的时钟门控技术,可以理解为“微观节能”。

  • 自动空闲(Autoidle):当模块内部总线没有事务时,自动关闭该模块的内部功能时钟。通过设置DSS.DSS_SYSCONFIG[0] AUTOIDLEDSS.RFBI_SYSCONFIG[0] AUTOIDLEDSS.DISPC_SYSCONFIG[0] AUTOIDLE等位为1来启用。同时,DSS.DISPC_CONFIG[9] FUNCGATED位用于使能显示控制器的功能时钟门控。
  • 智能空闲(Smart-Idle):允许模块在空闲时请求进入空闲模式,由系统电源管理框架统一协调。通过DSS.DSS_SYSCONFIG[4:3] SIDLEMODE等字段配置。

这两者的区别:Autoidle是模块自发行为,反应快,粒度细;Smart-Idle是参与系统级电源状态切换,更全局化。在低功耗刷新模式下,通常建议全部开启。

2.5 FIFO阈值:管理SDRAM唤醒的关键

DSS内部的FIFO是连接DMA和LCD面板的缓冲区。DMA的启停由两个阈值控制:

  • GFXFIFOLOWTHRESHOLD:FIFO数据量低于此阈值时,触发DMA从SDRAM读取数据。
  • GFXFIFOHIGHTHRESHOLD:FIFO数据量达到此阈值时,DMA停止。

优化策略是“宽进宽出”:尽可能拉大高、低阈值之间的差值。这样,DMA一次工作可以填充大量数据,然后长时间停止,让SDRAM得以进入并保持在自刷新模式的时间最大化。

配置的黄金法则

  1. 低阈值:尽可能设低,以减少DMA启动延迟,但必须高于DMA单次突发(Burst)传输的数据量,否则永远无法填满FIFO,导致持续DMA请求,反而更耗电。
  2. 高阈值:尽可能设高,但必须小于FIFO总大小减去一个突发传输量。如果设得过高,DMA会试图填充一个永远无法达到的FIFO水位,导致持续忙碌。
  3. 差值:高、低阈值之差至少为一个突发传输大小。如果小于此值,DMA可能刚启动就停止,SDRAM无法进入深度省电状态。

假设FIFO深度为1024字节,DMA突发长度为128字节。一个经验性的安全配置是:低阈值=256,高阈值=768。这样差值512字节,是突发长度的4倍,能保证DMA有效工作后,SDRAM有足够长的休眠时间。

2.6 垂直与水平时序:隐藏的省电空间

除了像素时钟,行、场时序中的消隐期(Blanking Period)也是调节帧率、影响功耗的杠杆。增加水平同步宽度(HSW)、前后肩(HFP, HBP)以及垂直同步宽度(VSW)、前后肩(VFP, VBP),就等于增加了每行和每帧的非有效像素时间。

为什么能省电?在消隐期内,虽然像素时钟仍在运行,但DMA通���不需要为LCD数据端供给新的像素数据(取决于面板类型),内部数据路径的活动率降低。更重要的是,更长的消隐期意味着相同的PCLK下,帧率会下降(因为完成一帧的总时间变长了)。要维持目标帧率,就可以允许我们使用更低的PCLK,从而直接降低功耗。

计算公式回顾FPS = 1 / { [(Hsw+1)+(Hfp+1)+有效宽度+(Hbp+1)] * [(Vsw+1)+(Vfp+1)+有效高度+(Vbp+1)] * PCLK周期 }

操作要点:调整时序参数必须参考LCD面板数据手册规定的范围,特别是同步脉冲的极性和最小宽度。盲目增加可能导致面板无法识别同步信号。通常,我们会在面板允许的最大范围内,适当增加前后肩来“拉长”帧时间。

3. 低功耗配置实战:从寄存器到效果

理论说完,我们来看一个针对240x320 QVGA LCD的具体配置实例。目标是实现一个稳定的低功耗刷新模式。

3.1 时钟树配置示例

假设系统DPLL4输出为532MHz (DPLL4_ALWON_FCLKOUTX2)。我们需要为QVGA面板生成一个约6MHz的像素时钟,同时尽可能降低逻辑时钟以省电。

  1. 选择功能时钟源:设置DSS.DSS_CONTROL[0] = 0x0,选择DSS1_ALWON_FCLK
  2. 配置DSS功能时钟分频:设置PRCM.CM_CLKSEL_DSS[4:0] = 0x08,将532MHz分频得到66.5MHz的DSS1_ALWON_FCLK。计算:532MHz / 8 = 66.5MHz
  3. 配置LCD逻辑时钟分频:设置DSS.DISPC_DIVISOR[23:16] LCD = 0x01。这意味着逻辑时钟 = 功能时钟 / (1+1)?这里需要澄清:在OMAP中,LCD分频值通常为实际除数-1。若手册公式为LogicClock = DSS1_ALWON_FCLK / (LCD + 1),则设为0x01得到66.5MHz / 2 = 33.25MHz。但根据原始文档公式LogicClock = DSS1_ALWON_FCLK / 1,似乎LCD=0x01代表除数为1。务必以具体平台的参考手册为准。我们假设此处LCD=0x01代表逻辑时钟等于功能时钟66.5MHz。
  4. 配置像素时钟分频:设置DSS.DISPC_DIVISOR[7:0] PCD = 0x0C。假设公式为PixelClock = LogicClock / (PCD + 1),则PCD=0x0C即12,得到66.5MHz / 13 ≈ 5.12MHz。这个值在QVGA面板60Hz刷新率所需的典型范围(~6MHz)附近,可以通过微调时序来匹配。

关键技巧:文档中提到,为了进一步省电,可以尝试增大LCD分频器,同时减小PCD,以获得相同的像素时钟。例如,目标PCLK为1.625MHz,功能时钟13MHz。方案A:LCD=1, PCD=8(13 / (1) / (8+1) ≈ 1.625MHz)。方案B:LCD=2, PCD=4(13 / (2+1) / (4+1) = 13/15 ≈ 0.867MHz,不对)。这里必须仔细验算!正确的等效关系应是:PCLK = Func_CLK / ((LCD+1) * (PCD+1))。要验证(LCD1+1)*(PCD1+1) = (LCD2+1)*(PCD2+1)。方案B应为LCD=2(除数为3),PCD=4(除数为5),总除数15,得到13/15≈0.867MHz,与方案A的除数9不同。因此,需要通过计算找到一组(LCD, PCD)值,在满足总除数相同的前提下,让逻辑时钟频率尽可能低(因为逻辑时钟驱动更多数字逻辑,其降低对省电贡献更大)。

3.2 FIFO与时序配置示例

继续以QVGA为例,假设我们通过上述计算,将PCLK设定为5.5MHz。

  1. 计算帧率:假设我们采用文档中的时序参数:Hsw=2, Hfp=4, Hbp=3, 有效宽度=240;Vsw=2, Vfp=9, Vbp=6, 有效高度=320。

    • 水平总像素: (2+1)+4+240+3 = 250
    • 垂直总行数: (2+1)+9+320+6 = 338
    • 总像素每帧: 250 * 338 = 84500
    • 帧周期: 84500 * (1 / 5.5e6) ≈ 0.01536 秒
    • 帧率: 1 / 0.01536 ≈ 65.1 Hz 这个帧率足以避免闪烁。
  2. 配置FIFO阈值:假设我们的FIFO深度为1KB(1024字节),单像素16位(2字节),DMA突发传输为8个像素(16字节)。

    • 低阈值:应大于一次突发传输的数据量。设为32字节(16个像素),对应GFXFIFOLOWTHRESHOLD= 32 / (FIFO深度单位) 。注意寄存器单位可能是字或字节,需查手册。假设单位为字节,则设为32。
    • 高阈值:应小于FIFO深度减去一次突发。设为960字节(1024-64)。GFXFIFOHIGHTHRESHOLD= 960。
    • 这样,当FIFO数据低于32字节时DMA启动,填充到960字节时停止,期间SDRAM可以睡眠。
  3. 配置时序寄存器:将计算好的值写入DSS.DISPC_TIMING_HDSS.DISPC_TIMING_V寄存器。注意,手册中通常说明编程值是实际值减1。

3.3 低功耗模式使能流程

  1. 基础使能:在DSS初始化时,确保所有相关时钟已使能(CM_FCLKEN_DSS,CM_ICLKEN_DSS,CM_CLKEN_PLL相关位)。
  2. 启用Autoidle/Smart-Idle:设置DSS_SYSCONFIGDISPC_SYSCONFIGRFBI_SYSCONFIG中的AUTOIDLESIDLEMODE位。
  3. 进入低功耗刷新模式: a. MPU准备进入空闲(idle)状态。 b. 确保帧缓冲区内容已是需要静态显示的画面(如锁屏界面)。 c. 配置DSS的FIFO阈值、时序等到低功耗参数(通常PCLK更低,消隐期更长)。 d. MPU执行WFI(等待中断)指令进入睡眠。 e. DSS依靠DMA和内部状态机维持显示,SDRAM在DMA间歇进入自刷新。
  4. 深度省电(切换DPLL4): a. 初始化并锁定DSI PLL。 b. 切换显示时钟源至DSI1_PLL_FCLK(DISPC_CLK_SWITCH=1)。 c. 将DPLL4设置为低功耗停止模式(手动或自动)。 d. 需要恢复时,使能DPLL4,等待锁定,再切回DSS1_ALWON_FCLK

4. SDI接口与FlatLink3G协议应用详解

Serial Display Interface(SDI)是一种将并行RGB数据转换为高速串行数据流的接口,FlatLink3G是其中一种协议,常用于驱动高分辨率面板,能显著减少板级连线(从几十根减少到几对差分线)。

4.1 SDI PLL架构与配置逻辑

SDI模块的核心是一个专用的PLL,用于生成高速串行数据所需的比特时钟。其架构基于一个数字锁相环(DPLL),输入是像素时钟(PCLK),输出是串行数据时钟(SCLK)。数据速率 = PCLK * PDIV * (每通道位数)。对于FlatLink3G,每通道位数是固定的(1通道30位,2通道15位,3通道10位),因此PDIV值决定了倍频关系。

配置流程的核心是选择模式并计算分频系数

  1. 确定通道数:根据像素时钟频率范围选择。
    • 1通道模式:4 MHz ≤ PCLK ≤ 15 MHz
    • 2通道模式:8 MHz ≤ PCLK ≤ 30 MHz
    • 3通道模式:20 MHz ≤ PCLK ≤ 65 MHz
  2. 设置SDI_PRSELSDI_PDIV:这两个寄存器字段根据通道数有固定搭配。
    • 1通道:SDI_PRSEL=0b00,SDI_PDIV=0x1E(30)
    • 2通道:SDI_PRSEL=0b01,SDI_PDIV=0x0F(15)
    • 3通道:SDI_PDIV=0x0A(10)
  3. 配置SDI PLL内部参数(REGN,REGM,HIGHFREQ,FREQSEL:这是最复杂的部分。目标是让PLL的内部参考频率Fint落在推荐的稳定范围内(通常0.75-2.1 MHz)。
    • Fint = PCLK / (NDIV + 1)(当HIGHFREQ=0
    • Fint = PCLK / [2 * (NDIV + 1)](当HIGHFREQ=1,用于PCLK≥32MHz的3通道模式)
    • 然后计算MDIV,使得MDIV = (PDIV * (NDIV+1) * (HIGHFREQ?2:1))
    • FREQSEL根据计算出的Fint值查表设置,用于优化PLL环路滤波。

一个HVGA(320x480)显示器的计算实例

  • 像素时钟PCLK = 10.03 MHz。
  • 选择2通道模式(PCLK在8-30MHz范围内)。
  • 设置SDI_PRSEL=0b01,SDI_PDIV=0x0F(15)。
  • 计算NDIV:目标Fint~2MHz。NDIV = PCLK / Fint - 1 = 10.03 / 2 - 1 ≈ 4。取整NDIV=4,则Fint = 10.03 / (4+1) = 2.006 MHz,符合范围。
  • 计算MDIVMDIV = PDIV * (NDIV+1) = 15 * 5 = 75(0x4B)。
  • HIGHFREQ=0FREQSEL根据2.006MHz查表设为0x7。
  • 寄存器配置:SDI_PLL_REGN=0x4,SDI_PLL_REGM=0x4B,SDI_PLL_HIGHFREQ=0,SDI_PLL_FREQSEL=0x7

4.2 与SN65LVDS302接收器的硬件与软件协同

SN65LVDS302是TI配套的FlatLink3G解串器芯片,将SDI输出的串行差分信号转换回并行RGB信号。

硬件连接要点

  • 电源去耦:数据手册强烈建议在芯片电源引脚附近放置去耦电容,推荐使用2个0.1μF和2个0.01μF电容,并尽可能靠近引脚(如放在PCB背面芯片正下方),以抑制高速开关噪声。
  • 控制信号RXEN(接收使能)和CPE(通道奇偶校验错误)通常连接到处理器的GPIO,用于软件控制接收器开关和错误检测。
  • 模式配置LS1LS0选择通道数(1/2/3对),SWAP控制RGB字节顺序,F/S选择输出边沿速度,CPOL选择像素时钟极性。这些引脚通常通过上拉/下拉电阻固定配置。

软件配置流程

  1. DSS控制器配置
    • DISPC_CONTROL[3] STNTFT = 1:选择主动矩阵(TFT)模式。
    • DISPC_CONTROL[9:8] TFTDATALINES = 0x3:选择24位数据输出(对应RGB888)。
    • DSS_SDI_CONTROL[1:0] SDI_BWSEL = 0x2:设置SDI色彩深度为24位。
  2. 信号极性配置(需匹配面板规格):
    • DISPC_POL_FREQ[16] RF = 1:HSYNC/VSYNC在PCLK上升沿驱动。
    • DISPC_POL_FREQ[14] IPC = 0:像素数据在PCLK上升沿驱动。
    • DISPC_CONTROL[29] LCDENABLEPOL = 1:LCD使能信号高有效。
    • DISPC_POL_FREQ[13] IHS = 0:HSYNC高有效。
    • DISPC_POL_FREQ[12] IVS = 0:VSYNC高有效。
    • DISPC_POL_FREQ[15] IEO = 0:数据使能(DE)高有效。
  3. SDI PLL配置:如4.1节所述,根据面板分辨率和刷新率计算并配置PLL参数。
  4. 接收器控制
    • 上电后,通过GPIO拉高RXEN至少10μs,使能接收器。
    • 接收器会经历Acquire模式(PLL锁定),锁定后进入Receive模式输出有效数据。
    • 可通过监控CPE信号(如果连接)检测传输错误。
    • 需要关闭显示时,拉低RXEN至少10μs,使接收器进入Shutdown模式。

4.3 XGA显示应用实例解析

对于一个1024x768(XGA)分辨率、60Hz刷新率、20%消隐开销的显示应用:

  • 总像素数 = 1024 * 768 * (1 + 20%) ≈ 943,718 像素/帧。
  • 所需像素时钟 PCLK = 943,718 * 60 ≈ 56.6 MHz。
  • 该频率落在3通道模式范围(20-65 MHz)。
  • 因此选择3通道模式:SDI_PRSEL=0b10,SDI_PDIV=0x0A(10)。
  • 由于PCLK > 32MHz,设置SDI_PLL_HIGHFREQ=1
  • 计算NDIV:目标Fint~2MHz。Fint = PCLK / [2*(NDIV+1)]。取NDIV=14,则Fint = 56.6 / [2*(14+1)] ≈ 1.89 MHz
  • 计算MDIVMDIV = PDIV * (NDIV+1) * 2 = 10 * 15 * 2 = 300(0x12C)。
  • 寄存器配置:SDI_PLL_REGN=0xE(14),SDI_PLL_REGM=0x12C,SDI_PLL_HIGHFREQ=1,SDI_PLL_FREQSEL=0x7

5. 常见问题排查与调试心得

在实际项目中,配置显示子系统,尤其是SDI这类高速接口,难免会遇到问题。以下是一些常见坑点和排查思路。

5.1 显示无输出或花屏

现象可能原因排查步骤
屏幕全黑,背光亮1. 电源/时钟未开启
2. 复位未解除
3. 面板使能信号不正确
1. 检查PRCM模块中DSS相关时钟使能位(CM_FCLKEN_DSS,CM_ICLKEN_DSS)和DPLL4锁定状态。
2. 检查DSS的软复位是否已释放。
3. 用示波器测量面板的RESET、ENABLE引脚时序是否符合数据手册要求。
屏幕出现雪花、条纹或错位1. 像素时钟(PCLK)频率或极性错误
2. 时序参数(HSYNC, VSYNC, DE)设置错误
3. FIFO下溢/上溢
1. 测量PCLK实际频率和占空比,检查DISPC_DIVISOR配置。
2. 用逻辑分析仪抓取HSYNC、VSYNC、DE和RGB数据线,与面板手册时序图对比。重点检查脉冲宽度、前后肩。
3. 检查DISPC_GFX_FIFO_THRESHOLD设置是否合理,尝试调大高低阈值差值。查看是否有FIFO错误状态位。
SDI输出无信号或信号混乱1. SDI PLL未锁定
2. 差分线对极性接反或阻抗不连续
3. 接收器(如SN65LVDS302)未正确使能或配置
1. 轮询DSS_SDI_STATUS[5] SDI_PLL_LOCK位,确认PLL已锁定。检查PLL配置参数计算是否正确。
2. 用高速示波器(带差分探头)测量SDI_CLKP/N和SDI_DATAxP/N信号,检查差分幅度、共模电压和眼图质量。
3. 确认接收器RXEN引脚已被正确拉高,LS1/LS0等配置引脚电平与SDI发送端模式匹配。

5.2 低功耗模式异常

  • 退出低功耗后显示异常:最常见原因是DPLL4时钟切换时序问题。确保从DSI PLL切回DSS1_ALWON_FCLK前,DPLL4已完全锁定。在切换代码后增加足够延时(毫秒级),或轮询DPLL4锁定状态位。
  • 低功耗模式下屏幕闪烁:可能是SDRAM自刷新唤醒不及时导致FIFO下溢。尝试提高GFXFIFOLOWTHRESHOLD,给DMA更充裕的响应时间。同时检查SDRAM控制器在自刷新模式下的退出延迟参数。
  • 功耗下降不明显:使用电流表或板级功耗分析工具测量。确认除了DSS,其他无关模块(如摄像头、GPU)的时钟和电源已关闭。检查Autoidle和Smart-Idle位是否真正启用。用示波器测量SDRAM的CKE引脚,确认其在帧间确实进入了自刷新(低电平)。

5.3 SDI PLL锁定失败

  • 计算错误:反复核对NDIVMDIVPDIV的计算公式和寄存器映射。特别注意NDIVMDIV的寄存器值有时是写入N-1M-1
  • 输入时钟不稳定:确保输入的PCLK本身是干净、稳定的。如果PCLK来自另一个可配置的PLL,确保该PLL已锁定。
  • 电源噪声:SDI PLL对电源噪声敏感。检查SDI模块的电源滤波电路,确保去耦电容容值和布局符合要求。
  • 寄存器写入顺序:有些PLL要求配置参数在特定使能位之前写入。严格按照手册推荐的初始化序列操作,通常在设置完REGNREGMFREQSEL后,最后触发GOBIT启动锁定过程。

5.4 性能与功耗的权衡记录

在一次车载中控项目里,我们使用800x480的面板。默认配置下,全速运行功耗约为120mW。通过以下组合优化,在静态画面低功耗模式下,功耗降至约35mW:

  1. PCLK从33MHz降至16.5MHz:通过调整PCD分频器实现,帧率从60Hz降至30Hz。实测在车载静态导航界面下,30Hz无感知闪烁。
  2. 调整时序:将水平消隐期增加约20%,垂直消隐期增加15%。这进一步降低了有效帧率,并给SDRAM更多休眠时间。
  3. 优化FIFO阈值:根据DMA burst size(64字节)和FIFO深度(2KB),将低阈值设为128字节,高阈值设为1792字节,最大化DMA休眠间隔。
  4. 启用所有Autoidle:设置DSS、DISPC、RFBI模块的AUTOIDLE位。
  5. 切换时钟源:在深度休眠时,切换到DSI PLL并关闭DPLL4,额外节省约5mW。

最重要的心得是:一定要做老化测试。将设备置于低功耗显示模式,连续运行24小时以上,观察是否有任何偶发的闪屏、花屏或复位现象。功耗优化往往在边界条件上,环境温度、电压波动都可能暴露出时序余量不足的问题。