PL111 PrimeCell彩色LCD控制器是ARM公司开发的AMBA兼容片上系统外设,专为嵌入式图形显示设计。作为显示系统的核心组件,它负责将帧缓冲区的像素数据转换为符合LCD面板时序要求的视频信号。
控制器采用典型的显示流水线架构,包含三个关键功能模块:
内存映射方面,控制器基地址通常配置为0x10020000,关键寄存器包括:
c复制#define CLCD_TIM0 (0x00) // 水平时序控制
#define CLCD_TIM1 (0x04) // 垂直时序控制
#define CLCD_TIM2 (0x08) // 时钟分频配置
#define CLCD_UPBASE (0x10) // 帧缓冲基址
#define CLCD_CTRL (0x1C) // 控制寄存器
注意:0x030-0x1FE和0x400-0x7FF地址范围被保留,禁止在正常操作中使用这些区域。
LCD显示时序包含四个关键阶段:
以QVGA 240x320分辨率为例:
对应寄存器值计算:
c复制CLCD_TIM0 = (HBP<<24) | (HFP<<16) | (HACT<<8) | HSYNC;
// 0xC7A7BF38 = (199<<24)|(7<<16)|(319<<8)|56
| 分辨率 | CLCDCLK | CLCD_TIM0 | CLCD_TIM1 | CLCD_TIM2 |
|---|---|---|---|---|
| QVGA竖屏 | 25MHz | 0xC7A7BF38 | 0x595B613F | 0x04eF1800 |
| QVGA横屏 | 25MHz | 0x9F7FBF4C | 0x818360eF | 0x053F1800 |
| VGA | 25MHz | 0x3F1F3F9C | 0x090B61DF | 0x067F1800 |
| SVGA | 36MHz | 0x1313A4C4 | 0x0505F657 | 0x071F1800 |
实测技巧:首次调试时建议使用已知可用的寄存器值,待显示正常后再微调时序参数。注意不同LCD面板对时序的敏感度差异很大。
PL111支持多种像素格式,通过控制寄存器的[4:1]位配置:
8/8/8模式(True Color)
5/6/5模式(High Color)
调色板模式
16bpp(5/6/5)模式下像素数据映射:
code复制31 27 23 19 15 11 7 3 0
| R4 | R3 | R2 | R1 | R0 | G5 | G4 | G3 | ...
对应寄存器配置:
c复制ctrl_reg |= (0x5 << 1); // 设置5/6/5模式
CLCDC支持两种中断触发方式:
配置步骤:
c复制// 使能VSYNC中断
CLCD_IMSC |= (1 << 1);
// 在GIC中配置中断23
GIC_EnableSet[0] |= (1 << 23);
GIC_Priority[23] = 0x20;
通过PL081 DMA控制器实现双缓冲:
关键代码:
c复制DMAC_Config(15, SRC_INC, DST_FIX, BURST_8);
DMAC_Start(15, fb_addr, CLCD_UPBASE, fb_size);
| 现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 无显示 | 电源未开启 | 检查SYS_CLCD寄存器[0]位 |
| 花屏 | 时序配置错误 | 用示波器测量HSYNC/VSYNC信号 |
| 颜色异常 | 像素格式不匹配 | 核对LCD面板与控制器色彩模式 |
| 闪屏 | DMA带宽不足 | 降低分辨率或使用双缓冲 |
使用逻辑分析仪捕获:
寄存器检查清单:
电源管理:
在最近的车载仪表盘项目中,我们遇到垂直条纹显示问题。最终发现是HBP参数设置过小导致TFT充电不足。调整CLCD_TIM0[27:16]从0x07到0x0F后显示恢复正常。这个案例说明时序参数的微小差异可能产生显著影响。