支持的芯片

概述

RTL8721F 集成了液晶显示控制器 (LCDC) , 支持标准 RGB 并行和 I80 (MCU) 接口。其高度可配置性和内置的像素格式转换器,使其能够适应多种显示面板和分辨率,简化了设计和应用。

功能特性

接口支持

  • RGB 接口

    • 6 位 RGB (RGB565)

    • 8 位 RGB (RGB888)

    • 16 位 RGB (RGB565)

    • 24 位 RGB (RGB888)

  • I80 接口

    • 8 位 RGB (RGB565)

    • 8 位 RGB (RGB888)

    • 16 位 RGB (RGB565)

    • 24 位 RGB (RGB888)

像素格式转换器

支持在内存中的像素格式与接口数据格式之间的实时转换。

可编程的面板时序控制

具有可调节的时序及极性参数,满足不同时序需求。

  • RGB 接口时序 :

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

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

  • MCU 接口时序 :

    • 时序参数:RD 宽度, WR 宽度, TE 延迟, VSYNC 周期

    • 极性参数:RD, WR, RS, CS, TE, VSYNC

多种中断类型支持

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

  • 帧开始中断

  • 帧结束中断

  • 行命中中断

  • TE (Tearing Effect)信号中断

  • FIFO 欠载中断 (underflow)

LCDC 工作模式

RGB/SRGB 接口模式

  • RGB LCD 与 SRGB LCD 的区别

    在传输一组像素时,所需的时钟周期数量有所不同。以 RGB888 颜色格式为例进行说明:

    • RGB LCD : 在 24-bit 接口宽度时,传输一组 RGB888 像素仅需 一个 DCLK 周期 。

    • SRGB LCD : 在 8-bit 接口宽度时,传输一组 RGB888 像素需要 三个 DCLK 周期 。

    除此之外,RGB LCD 和 SRGB LCD 之间无其他显著区别。在后续内容中,将统一采用“RGB LCD”进行表述,除非特别说明。

  • 帧同步方式

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

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

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

备注

  • RGB LCD 初始化 :通常无需额外初始化;如需初始化,则需要使用额外接口(如 SPI )来配置命令及参数。

  • GRAM 存储位置:通常,RGB LCD 不具备内置 GRAM;因此需要主控设备提供 GRAM 来存储像素数据。

MCU 接口模式

  • 支持 IO 和 DMA 模式

    • IO 模式:用于 LCD 的初始化操作。

    • DMA 模式:用于高效的像素数据传输。

  • 预设命令

    在每次通过 DMA 发送像素数据前,LCDC 自动发送预设命令:

    • 支持最多 16 条预设命令。

    备注

    • 仅支持 8-bit 且不含参数的命令。

  • 帧同步方式

    • TE 模式 :LCDC 在接收到 LCD 的 TE 信号后,会在预设的 TE 延迟时间之后发送像素数据,以减少或防止屏幕撕裂现象。

    • VSYNC 模式 :LCDC 基于内部的 VSYNC 信号,根据此信号的节奏发送像素数据到 LCD。

DMA 模式

RGB 与 MCU 接口模式,均支持以下两种 DMA 模式:

  • 自动 DMA 模式

    • LCDC 自动从 GRAM 获取像素数据,将其发送至 LCD,无需软件参与。

  • 触发 DMA 模式

    • 通过软件操作寄存器,触发 LCDC 从 GRAM 中提取并传输像素数据到 LCD,提供灵活的数据传输控制。

开发流程

首先,需要查阅 LCD 手册以确认其接口类型,从而确定 LCDC 的接口模式。

RGB LCD 开发流程

硬件配置

  1. 确认关键参数

    • 查阅 LCD 手册,以确认 接口位宽颜色格式 以及 同步方式 等关键信息。

  2. 选择可用引脚

    • 根据引脚复用表,选择合适的引脚用于连接。

  3. 连接信号线

    • 将选定的引脚连接至 LCD 的对应信号线上。视 LCD 具体型号需要连接的信号可能有所不同。以下是一个可能的引脚连接示例:

    PIN

    Description

    PB_28

    LCD_D0 (B0)

    PB_30

    LCD_D1

    ...

    ...

    PA_19

    LCD_D6

    PA_28

    LCD_D7 (B7)

    PA_29

    LCD_D8 (G0)

    PB_15

    LCD_D9

    ...

    ...

    PA_27

    LCD_D14

    PB_26

    LCD_D15 (G7)

    PA_16

    LCD_D16 (R0)

    PA_17

    LCD_D17

    ...

    ...

    PA_31

    LCD_D23 (R7)

    PB_14

    LCD_HSYNC

    PB_18

    LCD_VSYNC

    PB_0

    LCD_DCLK

    PB_23

    LCD_DE

    PC_1

    LCD_BLE

软件配置

  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 初始命令序列。

MCU LCD 开发流程

硬件配置

  1. 确认关键参数

    • 查阅 LCD 手册以确认 接口位宽颜色格式 以及 同步方式 等必要信息。

  2. 选择可用引脚

    • 参照引脚复用表,选择适合的引脚进行连接。

  3. 连接信号线

    • 将所选引脚连接到 LCD 的对应信号线上。根据所选 LCD,可能需要连接的信号会有所不同。以下是一个可能的引脚连接示例:

    PIN

    Description

    PB_31

    LCD_D0 (B0)

    PB_29

    LCD_D1

    ...

    ...

    PB_18

    LCD_D6

    PB_14

    LCD_D7 (B7)

    PB_13

    LCD_D8 (G0)

    PB_0

    LCD_D9

    ...

    ...

    PA_22

    LCD_D14

    PA_21

    LCD_D15 (G7)

    PC_0

    LCD_D16 (R0)

    PB_30

    LCD_D17

    ...

    ...

    PB_21

    LCD_D22

    PB_17

    LCD_D23 (R7)

    PA_30

    LCD_MCU_DCX

    PA_31

    LCD_MCU_WR

    PA_29

    LCD_MCU_RD

    PB_15

    LCD_MCU_CSX

    PC_1

    LCD_BLE

软件配置

  1. 引脚复用配置

    • 通用信号

      • 背光和硬件复位等通用信号可通过 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。

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

    • 记录分配到的内存首地址(如 0x60001000)以供后续配置给 LCDC。

  3. 使能 LCDC 功能和时钟

    LCDC_RccEnable()
    
  4. 初始化 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);
    
  5. 发送命令序列以初始化 LCD

    • 发送命令和参数的接口分别为:

    /* 发送命令 */
    LCDC_MCUIOWriteCmd(LCDC, cmd);
    
    /* 发送命令参数 */
    LCDC_MCUIOWriteData(LCDC, data);
    

    小心

    • 请设置正确的初始化序列,否则可能无法正常显示。

  6. 设置预设命令,以写 Ram 的命令码 0x2C 为例

    /* 设置预设命令: write_ram */
    u8 wram_cmd = 0x2C;
    LCDC_MCUSetPreCmd(LCDC, &wram_cmd, 1);
    
  7. 切换 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);
    
  8. 根据步骤 2 分配的地址,配置给 LCDC

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

    LCDC_Cmd(LCDC, ENABLE);
    
  10. 在需要更新像素数据时,触发 LCDC 发送像素数据

    LCDC_MCUDMATrigger(LCDC);
    

应用示例

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

备注

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

API 参考

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

常见问题排查

LCD 没有显示内容

  1. 背光电压检查

    • 确认背光电压是否符合 LCD 手册中的要求。

  2. 输出像素格式与接口位宽匹配

    • 确认配置的输出像素格式与接口位宽是否匹配 接口支持

  3. 帧率设置

    • 确保配置的帧率达到 LCD 的最低要求。

  4. RGB LCD 专用检查

    • 确认信号 HV 参数与信号极性符合 LCD 要求。

  5. MCU LCD 专用检查

    • 验证初始化命令序列是否正确发送并符合 LCD 手册的要求。

LCD 显示内容不符合预期

  1. 像素数据验证

  • 检查内存中存储的像素数据,通过 dump 方法确认其与预期写入的内容一致。

  1. 像素格式设定

  • 检查内存中的像素数据,与接口数据的转换是否符合预期。

LCD 显示抖动较严重

  1. 帧率调整

    • 如果帧率设置过快,尝试降低帧率,观察抖动现象是否得到改善。