LCD 控制器(LCDC)

支持的芯片[ RTL8730E ][...]

概述

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

功能特性

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

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

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

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

  • 支持多种中断类型

架构与接口

系统架构

../../_images/lcdc_g2_arch.svg

LCDC 架构

接口信号

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 接口

数据同步与处理

帧同步模式

提供两种帧同步模式,可依据 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 转板将 EVB 与 LCD 进行连接。

../../_images/lcdc_pannel_connect.png

软件开发

编程要点

  • 引脚复用配置

  • 使能 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 文件。

要详细了解和使用相关 API,请参阅 {SDK}\component\soc\amebaxxxx\fwlib\include\ameba_lcdc.h

常见问题排查

LCD 没有显示内容

现象

可能原因

解决方法

LCD无显示

  1. 背光电压异常

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

  1. 色深与位宽不匹配

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

  1. 帧率过低

确保帧率达到LCD最低要求

  1. 初始化序列错误

(仅MCU LCD)

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

LCD 显示色调异常

现象

可能原因

解决方法

显示色调异常

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

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

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

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

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

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

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

LCD 显示内容异常

现象

可能原因

解决方法

显示图案不符预期

内存像素数据错误

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

LCD 显示抖动较严重

现象

可能原因

解决方法

LCD 显示抖动较严重

帧率过快

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