LCD 控制器(LCDC)

支持的芯片[ RTL8730E ][ RTL8721F ]

概述

芯片集成了液晶显示控制器(LCDC),用于驱动 LCD 面板,为嵌入式系统提供灵活且高效的显示解决方案。

功能特性

  • 支持标准 RGB 并行和 I80 (MCU) 接口

  • 支持丰富的接口位宽与像素格式

  • 高度可配置的时序控制参数

  • 内置像素格式转换器(PFC)

  • 支持多种中断类型

架构与接口

系统架构

../../_images/lcdc_g2_arch.svg

LCDC 架构

接口信号

RGB 接口:

RGB 接口信号

../../_images/lcdc_g2_rgb_if_signal.svg

RGB 接口信号

可编程时序控制

  • 时序参数:VSW, VBP, VFP, HSW, HBP 和 HFP 宽度

  • 极性参数:HSYNC, VSYNC, DE, DCLK。

辅助控制信号

显示面板接口通常包含 LCDC 接口信号之外的其他必要信号:

  • 显示器使能(LCD_DISP)、背光控制、复位信号:可通过 GPIO 实现。有关 GPIO 用法请参考 GPIO

  • 面板初始化或触控:根据屏幕支持方式,使用 I2C 或 SPI 等通信接口。I2C/SPI 相关用法请参考 I2C SPI

接口位宽及色深

LCDC 支持的接口和颜色格式

接口类型

6bit-RGB565

8bit-RGB565

8bit-RGB888

16bit-RGB565

24bit-RGB888

RGB 接口

I80 接口

数据同步与处理

帧同步模式

RGB 接口:

提供两种帧同步模式,可依据 LCD 时序要求进行灵活选择:

  • HV 模式:通过 HSYNC 和 VSYNC 信号同步。

  • DE 模式:通过 DE 信号同步。

像素格式转换器

支持在内存中的像素格式与接口数据格式之间的实时转换。转换过程遵循以下规则:

  • Alpha 通道处理 :若源格式包含 Alpha 值,直接舍弃。

  • 高位深向低位深转换 :舍弃高位深格式的低位数据

示例:RGB888 转 RGB565

../../_images/lcdc_g2_pfc_h2l.svg
  • 低位深向高位深转换 :使用高位数据填充高位深格式的低位

示例:RGB565 转 RGB888

../../_images/lcdc_g2_pfc_l2h.svg

中断机制

提供细致的中断管理功能,以适应高效的事件响应需求:

  • 帧开始中断

  • 帧结束中断

  • 行命中中断

  • TE (Tearing Effect)信号中断

  • FIFO 下溢中断 (underflow)

双缓冲 Ping-Pong 机制

背景

某些LCD没有内置图形存储器(GRAM),需要主控持续推送像素数据到屏幕。

单缓冲区的问题

使用单一帧缓冲器时,存在以下风险:

CPU 正在更新的不完整帧数据可能被直接显示在屏幕上,导致画面闪烁或显示错误的中间状态。

通常使用多重缓冲技术(例如双缓冲)来避免该行为。

双缓冲区解决方案

使用两个独立的缓冲区进行 Ping-Pong:

  • 显示缓冲区 :当前 LCDC 推送到屏幕的完整帧

  • 绘制缓冲区 :CPU准备下一帧的工作区域

完成一帧显示后,两个缓冲区角色互换,确保屏幕始终接收完整帧数据,如图所示。

../../_images/lcdc_g2_double_buffer_machanism.svg

开发流程

前期准备

准备一块 LCD,并查阅其文档,确认以下信息:

  • 接口类型 :为后续软硬件操作奠定基础

  • 接口信号 :确保正确的硬件连接和驱动配置

  • 时序参数 :如采样时钟边沿等

备注

当屏幕文档无法满足上述需求时,请查阅屏幕驱动芯片文档。

警告

对于 MCU 接口 LCD:请务必获取正确的初始化序列,初始化错误可能导致显示异常。

硬件设计

芯片封装选型

确保足够的引脚数量以满足接口信号需求。

备注

部分封装引脚数量有限,可能无法支持复杂接口。

LCD 子板集成配置指南

Realtek 提供专业 LCD 转板,配备 FPC 接口和母口排针,用于连接屏幕 PCB 底板与 Ameba EVB。

../../_images/lcdc_daughter_board.png
  • 信号映射确认 :查阅 EVB 和 LCD 子板原理图,确认信号与引脚对应关系。

  • 电阻上件检查 :按需进行电阻 rework, 确保信号连通。

  • 电源规划 :确认供电和接地连接完整性。

LCD 面板连接

使用 LCD 转板将 EVB 与 LCD 面板进行连接。

../../_images/lcdc_pannel_connect.png

软件开发

RGB 接口:

编程要点

  • 引脚复用配置

  • 使能 LCDC 外设的时钟

  • 初始化结构体以配置时序参数

  • 初始化 LCDC 硬件寄存器

  • 配置帧缓冲区地址到寄存器

  • 使能 LCDC 外设

代码分析

  1. 引脚复用配置

    • 通用信号

      • 对于 背光硬件复位 等通用信号,可使用 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。

  2. 分配 GRAM 并填充像素数据

    • 需记录分配的内存首地址(如 0x60001000),以便在步骤 5 中配置给 LCDC。

  3. 使能 LCDC 功能及时钟

    LCDC_RccEnable()
    
  4. 根据 LCD 手册初始化 LCDC

    • 获取并配置以下信息:接口宽度、图像分辨率、像素格式、HV 参数(vsw, vbp, vfp, hsw, hbp, hfp)、信号极性等。

      备注

      1. 接口宽度与输出像素格式需在 接口位宽及色深 范围内配置,否则可能无法显示。

      2. 帧率不能低于 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);
    
  5. 根据步骤 2 分配的地址,配置给 LCDC

    LCDC_DMAImgCfg(LCDC, 0x60001000);
    
  6. 使能 LCDC

    LCDC_Cmd(LCDC, ENABLE);
    

备注

如果 LCD 需要初始化操作,请根据其指定通信接口补充以下配置:

  • 硬件配置

    • 保证 Ameba 的通信引脚正确连接至 LCD 的通信信号。

  • 软件配置

    • 初始化通信接口。

    • 发送 LCD 初始命令序列。

应用示例

SDK 提供了如下功能示例,帮助开发者了解和使用 LCDC 功能:

备注

要了解示例支持的芯片,请查看示例路径下的 README.md 文件。

常见问题排查

LCD 没有显示内容

现象

可能原因

解决方法

LCD无显示

  1. 背光电压异常

检查背光电压是否符合LCD规格

  1. 色深与位宽不匹配

确认设定输出像素格式与接口位宽匹配 接口位宽及色深

  1. 帧率过低

确保帧率达到LCD最低要求

  1. 初始化序列错误

(仅MCU LCD)

获取并应用正确的初始化序列

LCD 显示色调异常

现象

可能原因

解决方法

显示色调异常

(如:预期蓝色,实际显示红色)

  1. 像素格式设定与屏幕不匹配

  1. 检查输入输出格式设定

  2. 确保格式与屏幕接口输入要求一致

  1. 接口数据信号未连接成功

  1. 检查引脚复用配置正确

  2. 检查硬件接口信号连通

LCD 显示内容异常

现象

可能原因

解决方法

显示图案不符预期

内存像素数据错误

检查内存中的像素数据,确认与预期写入内容一致

LCD 显示抖动较严重

现象

可能原因

解决方法

LCD 显示抖动较严重

帧率过快

降低帧率,观察抖动现象是否得到改善