LCD 控制器(LCDC)
支持的芯片[ RTL8730E ][...]
概述
芯片集成了液晶显示控制器(LCDC),用于驱动 LCD 面板,为嵌入式系统提供灵活且高效的显示解决方案。
功能特性
支持标准 RGB 并行和 I80 (MCU) 接口
支持丰富的接口位宽与像素格式
高度可配置的时序控制参数
内置像素格式转换器(PFC)
支持多种中断类型
架构与接口
系统架构
LCDC 架构
接口信号
RGB 接口信号
RGB 接口信号
可编程时序控制
时序参数:VSW, VBP, VFP, HSW, HBP 和 HFP 宽度
极性参数:HSYNC, VSYNC, DE, DCLK
辅助控制信号
显示面板接口通常包含 LCDC 接口信号之外的其他必要信号:
接口位宽及色深
接口类型 |
6bit-RGB565 |
8bit-RGB565 |
8bit-RGB888 |
16bit-RGB565 |
24bit-RGB888 |
|---|---|---|---|---|---|
RGB 接口 |
✓ |
✓ |
✓ |
✓ |
|
I80 接口 |
✓ |
✓ |
✓ |
✓ |
数据同步与处理
帧同步模式
提供两种帧同步模式,可依据 LCD 时序要求进行灵活选择:
HV 模式:通过 HSYNC 和 VSYNC 信号同步。
DE 模式:通过 DE 信号同步。
提供两种帧同步模式,可依据 LCD 时序要求进行灵活选择:
TE 模式 : LCDC 响应 LCD 的 TE 信号,在预设延迟后传输像素数据。
VSYNC 模式 :LCDC 基于内部的 VSYNC 信号,按 VSYNC 节奏发送像素数据。
像素格式转换器
支持在内存中的像素格式与接口数据格式之间的实时转换。转换过程遵循以下规则:
Alpha 通道处理 :若源格式包含 Alpha 值,直接舍弃。
高位深向低位深转换 :舍弃高位深格式的低位数据
示例:RGB888 转 RGB565
低位深向高位深转换 :使用高位数据填充高位深格式的低位
示例:RGB565 转 RGB888
中断机制
提供细致的中断管理功能,以适应高效的事件响应需求:
帧开始中断
帧结束中断
行命中中断
TE (Tearing Effect)信号中断
FIFO 下溢中断 (underflow)
双缓冲 Ping-Pong 机制
背景
某些LCD没有内置图形存储器(GRAM),需要主控持续推送像素数据到屏幕。
单缓冲区的问题
使用单一帧缓冲器时,存在以下风险:
CPU 正在更新的不完整帧数据可能被直接显示在屏幕上,导致画面闪烁或显示错误的中间状态。
通常使用多重缓冲技术(例如双缓冲)来避免该行为。
双缓冲区解决方案
使用两个独立的缓冲区进行 Ping-Pong:
显示缓冲区 :当前 LCDC 推送到屏幕的完整帧
绘制缓冲区 :CPU准备下一帧的工作区域
完成一帧显示后,两个缓冲区角色互换,确保屏幕始终接收完整帧数据,如图所示。
开发流程
前期准备
准备一块 LCD,并查阅其文档,确认以下信息:
接口类型 :为后续软硬件操作奠定基础
接口信号 :确保正确的硬件连接和驱动配置
时序参数 :如采样时钟边沿等
备注
当屏幕文档无法满足上述需求时,请查阅屏幕驱动芯片文档。
警告
对于 MCU 接口 LCD:请务必获取正确的初始化序列,初始化错误可能导致显示异常。
硬件设计
芯片封装选型
确保足够的引脚数量以满足接口信号需求。
备注
部分封装引脚数量有限,可能无法支持复杂接口。
LCD 子板集成配置指南
Realtek 提供专业 LCD 转板,配备 FPC 接口和母口排针,用于连接屏幕 PCB 底板与 Ameba EVB。
信号映射确认 :查阅 EVB 和 LCD 子板原理图,确认信号与引脚对应关系。
电阻上件检查 :按需进行电阻 rework, 确保信号连通。
电源规划 :确认供电和接地连接完整性。
面板连接
使用 LCD 转板将 EVB 与 LCD 进行连接。
软件开发
编程要点
引脚复用配置
使能 LCDC 外设的时钟
初始化结构体以配置时序参数
初始化 LCDC 硬件寄存器
配置帧缓冲区地址到寄存器
使能 LCDC 外设
代码分析
引脚复用配置
通用信号
对于 背光 和 硬件复位 等通用信号,可使用 GPIO 控制。
RGB 接口时序信号
请参考 引脚复用,调用
Pinmux_Config(PinName, FuncId)进行配置。
备注
接口位宽最大支持 24-bit;
当接口位宽小于 24-bit 时,Function-ID 需从 LCD_D0 开始使用。
例如,对于 16-bit RGB565,Function-ID 仅支持 LCD_D0~LCD_D15,不支持 LCD_D8~LCD_D23。
分配 GRAM 并填充像素数据
需记录分配的内存首地址(如 0x60001000),以便在步骤 5 中配置给 LCDC。
使能 LCDC 功能及时钟
LCDC_RccEnable()
根据 LCD 手册初始化 LCDC
获取并配置以下信息:接口宽度、图像分辨率、像素格式、HV 参数(vsw, vbp, vfp, hsw, hbp, hfp)、信号极性等。
备注
接口宽度与输出像素格式需在 接口位宽及色深 范围内配置,否则可能无法显示。
帧率不能低于 LCD 要求,否则可能无法显示。
示例配置(24-bit RGB888,480x800):
void LCDC_RGBStructInit(LCDC_RGBInitTypeDef *LCDC_RGBInitStruct) { /* 配置 LCD 参数 */ LCDC_RGBInitStruct->Panel_Init.IfWidth = LCDC_RGB_IF_24_BIT; LCDC_RGBInitStruct->Panel_Init.ImgHeight = 480; LCDC_RGBInitStruct->Panel_Init.ImgWidth = 800; LCDC_RGBInitStruct->Panel_Init.InputFormat = LCDC_INPUT_FORMAT_RGB888; LCDC_RGBInitStruct->Panel_Init.OutputFormat = LCDC_OUTPUT_FORMAT_RGB888; LCDC_RGBInitStruct->Panel_Init.RGBRefreshFreq = 35; /* 配置信号 H/V 参数 */ LCDC_RGBInitStruct->Panel_RgbTiming.RgbVsw = 1; LCDC_RGBInitStruct->Panel_RgbTiming.RgbVbp = 4; LCDC_RGBInitStruct->Panel_RgbTiming.RgbVfp = 6; LCDC_RGBInitStruct->Panel_RgbTiming.RgbHsw = 4; LCDC_RGBInitStruct->Panel_RgbTiming.RgbHbp = 40; LCDC_RGBInitStruct->Panel_RgbTiming.RgbHfp = 40; /* 配置信号极性 */ LCDC_RGBInitStruct->Panel_RgbTiming.Flags.RgbEnPolar = LCDC_RGB_EN_PUL_HIGH_LEV_ACTIVE; LCDC_RGBInitStruct->Panel_RgbTiming.Flags.RgbHsPolar = LCDC_RGB_HS_PUL_LOW_LEV_SYNC; LCDC_RGBInitStruct->Panel_RgbTiming.Flags.RgbVsPolar = LCDC_RGB_VS_PUL_LOW_LEV_SYNC; LCDC_RGBInitStruct->Panel_RgbTiming.Flags.RgbDclkActvEdge = LCDC_RGB_DCLK_FALLING_EDGE_FETCH; } /* 初始化 LCDC */ LCDC_RGBInit(LCDC, &LCDC_RGBInitStruct);
根据步骤 2 分配的地址,配置给 LCDC
LCDC_DMAImgCfg(LCDC, 0x60001000);
使能 LCDC
LCDC_Cmd(LCDC, ENABLE);
备注
如果 LCD 需要初始化操作,请根据其指定通信接口补充以下配置:
硬件配置
保证 Ameba 的通信引脚正确连接至 LCD 的通信信号。
软件配置
初始化通信接口。
发送 LCD 初始命令序列。
编程要点
引脚复用配置
使能 LCDC 外设的时钟
初始化结构体以配置时序参数
初始化 LCDC 硬件寄存器
配置帧缓冲区地址到寄存器
使能 LCDC 外设
发送控制命令初始化 LCD
代码分析
引脚复用配置
通用信号
背光和硬件复位等通用信号可通过 GPIO 进行控制。
MCU 接口时序信号
请参考 引脚复用 章节,依次调用
Pinmux_Config(PinName, FuncId)进行必要的配置。
备注
接口位宽最大支持 24-bit;
当接口位宽小于 24-bit 时,Function-ID 需从 LCD_D0 开始使用。
例如,对于 16-bit RGB565,Function-ID 仅支持 LCD_D0~LCD_D15,不支持 LCD_D8~LCD_D23。
分配 GRAM 并填充像素数据
记录分配到的内存首地址(如 0x60001000)以供后续配置给 LCDC。
使能 LCDC 功能和时钟
LCDC_RccEnable()
初始化 MCU 进入 IO 模式
请查阅 LCD 手册,进行如下配置。
void LCDC_MCUStructInit(LCDC_MCUInitTypeDef *LCDC_MCUInitStruct) { /* 配置面板参数 */ LCDC_MCUInitStruct->Panel_Init.IfWidth = LCDC_MCU_IF_8_BIT; LCDC_MCUInitStruct->Panel_Init.ImgWidth = 240; LCDC_MCUInitStruct->Panel_Init.ImgHeight = 320; LCDC_MCUInitStruct->Panel_Init.InputFormat = LCDC_INPUT_FORMAT_RGB565; LCDC_MCUInitStruct->Panel_Init.OutputFormat = LCDC_OUTPUT_FORMAT_RGB565; /* 配置信号极性 */ LCDC_MCUInitStruct->Panel_McuTiming.McuRdPolar = LCDC_MCU_RD_PUL_RISING_EDGE_FETCH; LCDC_MCUInitStruct->Panel_McuTiming.McuWrPolar = LCDC_MCU_WR_PUL_RISING_EDGE_FETCH; LCDC_MCUInitStruct->Panel_McuTiming.McuRsPolar = LCDC_MCU_RS_PUL_LOW_LEV_CMD_ADDR; LCDC_MCUInitStruct->Panel_McuTiming.McuTePolar = LCDC_MCU_TE_PUL_LOW_LEV_ACTIVE; LCDC_MCUInitStruct->Panel_McuTiming.McuSyncPolar = LCDC_MCU_VSYNC_PUL_LOW_LEV_ACTIVE; } /* 初始化 LCDC */ LCDC_MCUInit(LCDC, &LCDC_MCUInitStruct); /* 使能 LCDC */ LCDC_Cmd(LCDC, ENABLE);
发送命令序列以初始化 LCD
发送命令和参数的接口分别为:
/* 发送命令 */ LCDC_MCUIOWriteCmd(LCDC, cmd);
/* 发送命令参数 */ LCDC_MCUIOWriteData(LCDC, data);
小心
请设置正确的初始化序列,否则可能无法正常显示。
设置预设命令,以写 Ram 的命令码 0x2C 为例
/* 设置预设命令: write_ram */ u8 wram_cmd = 0x2C; LCDC_MCUSetPreCmd(LCDC, &wram_cmd, 1);
切换 IO 模式至 DMA 模式
/* 关闭 LCDC */ LCDC_Cmd(LCDC, DISABLE); Lcdc_McuDmaCfgDef LCDC_MCUDmaCfgStruct; /* 设定同步方式 */ LCDC_MCUDmaCfgStruct.TeMode = 0; /* DISABLE */ /* 设定 DMA 模式 */ LCDC_MCUDmaCfgStruct.TriggerDma = LCDC_TRIGGER_DMA_MODE; LCDC_MCUDmaMode(LCDC, &LCDC_MCUDmaCfgStruct);
根据步骤 2 分配的地址,配置给 LCDC
LCDC_DMAImgCfg(LCDC, 0x60001000);
使能 LCDC
LCDC_Cmd(LCDC, ENABLE);
在需要更新像素数据时,触发 LCDC 发送像素数据
LCDC_MCUDMATrigger(LCDC);
应用示例
SDK 提供了如下功能示例,帮助开发者了解和使用 LCDC 功能:
raw_lcdc_rgb_st7262 演示如何使用
RGB 接口DMA自动模式驱动 RGB LCD;raw_lcdc_srgb_st7272a 演示如何使用 RGB 接口驱动
SRGB LCD;raw_lcdc_mcu_ili9806 演示如何使用
MCU 接口DMA触发模式驱动 MCU LCD。
备注
要了解示例支持的芯片,请查看示例路径下的 README.md 文件。
要详细了解和使用相关 API,请参阅 {SDK}\component\soc\amebaxxxx\fwlib\include\ameba_lcdc.h 。
常见问题排查
LCD 没有显示内容
现象 |
可能原因 |
解决方法 |
|---|---|---|
LCD无显示 |
|
检查背光电压是否符合LCD规格 |
|
确认设定输出像素格式与接口位宽匹配 接口位宽及色深 |
|
|
确保帧率达到LCD最低要求 |
|
(仅MCU LCD) |
获取并应用正确的初始化序列 |
LCD 显示色调异常
现象 |
可能原因 |
解决方法 |
|---|---|---|
显示色调异常 (如:预期蓝色,实际显示红色) |
|
|
|
|
LCD 显示内容异常
现象 |
可能原因 |
解决方法 |
|---|---|---|
显示图案不符预期 |
内存像素数据错误 |
检查内存中的像素数据,确认与预期写入内容一致 |
LCD 显示抖动较严重
现象 |
可能原因 |
解决方法 |
|---|---|---|
LCD 显示抖动较严重 |
帧率过快 |
降低帧率,观察抖动现象是否得到改善 |