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