4. LTDC 初始化配置:时钟、层与时序参数寄存器设置

LTDC(LCD-TFT Display Controller)的初始化是 RGB 接口屏幕驱动的基础。配置顺序必须严格遵循:先时钟 → 再时序 → 最后层配置。任何顺序错乱都可能导致屏幕无显示、闪屏或色彩异常。本节从寄存器级出发,拆解三个核心配置域。

4.1 像素时钟生成:PLL 与时钟树配置

RGB 接口需要精确的像素时钟(Pixel Clock, PCLK),通常由 MCU 内部 PLL 分频得到。以 STM32F4/F7/H7 系列为例,LTDC 时钟源来自 PLLSAI(专用 PLL)或 PLLQ,经分频后送入 LTDC 的 CKER 计数器。

关键公式:
Pixel Clock = (PLLSAI_VCO_Out) / (PLLSAIR_Divider) / (LTDC_CKER_Divider)
其中 PLLSAI_VCO_Out = HSE_Value × PLLSAI_N / PLLSAI_M
参数 寄存器域 说明 典型值(480×272@60Hz)
PLLSAI_N RCC_PLLSAICFGR: PLLSAIN[8:0] VCO 倍频系数 192
PLLSAI_M RCC_PLLSAICFGR: PLLSAIM[5:0] VCO 预分频 8
PLLSAI_R RCC_PLLSAICFGR: PLLSAIR[2:0] LTDC 主分频 5
CKER 分频 LTDC_GCR: PCPOLEN + 内部计数器 像素时钟再分频(通常设为 1) 1
调试建议:使用示波器或逻辑分析仪测量 LTDC 的 PCK 引脚,确认频率与目标像素时钟偏差在 ±5% 以内。频率过高会导致屏幕撕裂,过低则刷新率不足。

4.2 时序参数寄存器设置:HBP / HFP / VBP / VFP

RGB 接口的时序由水平同步(HSYNC)和垂直同步(VSYNC)信号及其前后肩(Back Porch / Front Porch)定义。LTDC 通过 LTDC_SSCR、LTDC_BPCR、LTDC_AWCR 和 LTDC_TWCR 四个寄存器完成配置。

// 以 480×272 分辨率、HSYNC=41、VFP=2、VBP=2、HBP=13、HFP=32 为例
// 水平时序
LTDC->SSCR  = (41 << 16) | (41);          // HSYNC 宽度 = 41
LTDC->BPCR  = (41+13 << 16) | (41+13);    // AHBP = HSYNC + HBP = 54
LTDC->AWCR  = (41+13+480 << 16) | (41+13+480); // AAW = AHBP + 宽度 = 534
LTDC->TWCR  = (41+13+480+32 << 16) | (41+13+480+32); // Total Width = AAW + HFP = 566

// 垂直时序
LTDC->SSCR  |= (2 << 0);                 // VSYNC 宽度 = 2
LTDC->BPCR  |= (2+2 << 0);               // AVBP = VSYNC + VBP = 4
LTDC->AWCR  |= (2+2+272 << 0);           // AAV = AVBP + 高度 = 276
LTDC->TWCR  |= (2+2+272+2 << 0);         // Total Height = AAV + VFP = 278
寄存器 全称 水平域 垂直域
LTDC_SSCR Synchronization Size Configuration Register HSYNC 脉冲宽度 VSYNC 脉冲宽度
LTDC_BPCR Back Porch Configuration Register AHBP = HSYNC + HBP AVBP = VSYNC + VBP
LTDC_AWCR Active Width Configuration Register AAW = AHBP + 水平有效像素 AAV = AVBP + 垂直有效行
LTDC_TWCR Total Width Configuration Register Total Width = AAW + HFP Total Height = AAV + VFP
常见错误:HBP/HFP/VBP/VFP 的值必须与屏幕数据手册严格一致。部分屏幕将 HBP 定义为从 HSYNC 结束到有效数据开始,而 LTDC 的 BPCR 寄存器要求写入 HSYNC + HBP 的累加值,切勿直接写入 HBP 原始值。
RGB 接口水平时序与 LTDC 寄存器映射 一行总像素 = HSYNC + HBP + 有效像素 + HFP HSYNC HBP 有效像素(480) HFP SSCR BPCR AWCR TWCR 注意:BPCR 写入的是 HSYNC+HBP 的累加值,AWCR 写入的是 BPCR+有效像素的累加值

4.3 层配置(Layer)寄存器设置

LTDC 支持最多 2 个显示层(Layer0 / Layer1),每个层独立配置帧缓冲地址、像素格式、窗口位置、Alpha 混合系数和颜色关键值。层配置通过 LTDC_LxCFBAR、LTDC_LxCFBLR、LTDC_LxCFBLNR、LTDC_LxWHPCR、LTDC_LxCACR 等寄存器完成。

// 以 Layer0 为例:帧缓冲地址 0x20010000,RGB565 格式,全屏 480×272
LTDC->Layer[0].CFBAR = 0x20010000;          // 帧缓冲起始地址
LTDC->Layer[0].CFBLR = (480*2 << 16) | (480*2 + 3); // 行长度 = 宽度×2字节 + 3(对齐)
LTDC->Layer[0].CFBLNR = 272;                // 总行数
LTDC->Layer[0].WHPCR = (534 << 16) | 54;   // 窗口水平:WHSTPOS=54, WHSPPOS=533
LTDC->Layer[0].WVPCR = (276 << 16) | 4;    // 窗口垂直:WVSTPOS=4, WVSPPOS=275
LTDC->Layer[0].PFCR = 0x02;                 // 像素格式:RGB565
LTDC->Layer[0].CACR = 255;                  // 恒定 Alpha = 255(不透明)
LTDC->Layer[0].DCCR = 0xFFFFFF;             // 默认颜色:白色
寄存器 功能 关键位域
LTDC_LxCFBAR 帧缓冲基地址(必须 4 字节对齐) CFBADD[31:0]
LTDC_LxCFBLR 行长度配置 CFBLL[13:0](行字节数),CFBP[12:0](行间距)
LTDC_LxCFBLNR 帧总行数 CFBLNBR[10:0]
LTDC_LxWHPCR 窗口水平起始/结束位置 WHSTPOS[11:0],WHSPPOS[11:0]
LTDC_LxWVPCR 窗口垂直起始/结束位置 WVSTPOS[10:0],WVSPPOS[10:0]
LTDC_LxPFCR 像素格式选择 PF[2:0](0=ARGB8888, 1=RGB888, 2=RGB565, 3=ARGB1555, 4=ARGB4444)
LTDC_LxCACR 恒定 Alpha 值(0~255) CA[7:0]
性能优化:帧缓冲地址建议放在 AXI SRAM 或 SDRAM 的 32 字节对齐区域,并开启 LTDC 的 AXI 突发传输(通过 LTDC_GCR 的 AXBLEN[1:0] 位)。对于双缓冲场景,使用两个 CFBAR 交替切换,避免撕裂。
LTDC 层配置寄存器与帧缓冲关系 帧缓冲 0x20010000 RGB565 480×272 Layer 寄存器组 CFBAR → 帧缓冲地址 CFBLR → 行长度 CFBLNR → 行数 PFCR → 像素格式 窗口裁剪 WHPCR: 54 ~ 533 WVPCR: 4 ~ 275 CACR: Alpha=255 DCCR: 默认颜色 窗口位置必须落在时序有效区域内(AAW × AAV),否则层内容不会显示

4.4 初始化顺序与常见陷阱

  1. 使能 LTDC 时钟域:先配置 RCC 的 PLLSAI,等待 PLL 锁定,再使能 LTDC 时钟(RCC_APB2ENR 或 RCC_AHB1ENR)。
  2. 配置全局时序寄存器:SSCR → BPCR → AWCR → TWCR,顺序不可颠倒。
  3. 配置层寄存器:先设置 CFBAR 和 CFBLR,再设置窗口位置和像素格式,最后使能层(LTDC_LxCR 的 LEN 位)。
  4. 使能 LTDC:设置 LTDC_GCR 的 LTDCEN 位,等待至少 1 帧时间后检查状态。
陷阱排查:
• 屏幕全黑:检查 PLL 锁定状态、LTDC_GCR 的 LTDCEN 位、层使能位 LEN。
• 图像偏移或滚动:检查 HBP/HFP 累加值是否正确,窗口 WHSTPOS 是否等于 AHBP。
• 颜色异常:确认 PFCR 像素格式与帧缓冲实际数据格式一致,RGB565 模式下字节序为 B1G0/R5G3 等。