扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

RT1170 LCDIFv2 驱动并口屏实操:从配置到点亮全流程

3小时前
367
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

NXP i.MX RT1170 作为高性能跨界 MCU,搭载了增强型显示接口 LCDIFv2,支持多层混合显示与高速并行 RGB 数据传输,相比前代 RT1060 的 eLCDIF 功能更丰富。官方 SDK 默认仅提供 MIPI DSI 串口屏示例,缺乏并口屏驱动参考,本文基于 RT1060 eLCDIF 驱动逻辑,详解 RT1170 通过 LCDIFv2 接口驱动并口 RGB 屏的完整流程,包含引脚配置、时钟校准、接口初始化等关键步骤,帮助开发者快速实现并口屏点亮与显示。

资料获取:RT1170 通过LCDIFv2接口驱动并口屏

1. 核心基础:RT1170 显示接口与 LCDIFv2 优势

1.1 RT1170 显示接口资源对比

RT1170 相比 RT1060 新增 LCDIFv2、MIPI DSI 等接口,显示相关核心资源包括:
  • LCDIFv2:支持 8/16/18/24 位并行 RGB 接口,具备多层混合功能,适配中高端并口屏;
  • eLCDIF:兼容传统并行 RGB 接口,功能简化,适用于基础显示场景;
  • MIPI DSI:串行显示接口,适配高清串口屏;
  • 辅助模块:PXP 像素流水线(2D 图像处理)、GPU2D(图形加速)、VIDEO_MUX(接口复用控制)。

1.2 LCDIFv2 核心优势

  • 高速传输:支持更高像素时钟,满足高分辨率、高刷新率显示需求;
  • 多层混合:支持多个帧缓冲层叠加显示,简化图形界面开发;
  • 灵活适配:兼容不同数据总线宽度(8~24 位)与时序参数,适配多数并口 RGB 屏;
  • CPU 开销:支持 DMA 数据传输,无需 CPU 干预帧缓冲刷新。

2. 硬件与环境准备

2.1 硬件配置

  • 主控:i.MX RT1170 EVK 开发板(Cortex-M7 核心);
  • 显示设备:并行 RGB 并口屏(示例分辨率 480×272,24 位 RGB 接口);
  • 关键引脚:LCD_CLK(像素时钟)、LCD_HSYNC(行同步)、LCD_VSYNC(场同步)、LCD_ENABLE(显示使能)、16/24 位 RGB 数据线、LCD_RST(复位)、Backlight(背光控制)。

2.2 软件环境

  • 开发工具:MCUXpresso IDE、ConfigTool(时钟与引脚配置);
  • 软件资源:RT1170 SDK(含 LCDIFv2 驱动库)、并口屏数据手册(时序参数关键)。

3. 分步实现流程

步骤 1:引脚配置(含复用与电气属性)

LCDIFv2 的并口引脚需通过 PinMux 配置为显示功能,关键引脚映射与配置如下:

(1)核心引脚映射(示例)

功能 RT1170 引脚 配置模式
LCD_CLK GPIO_DISP_B1_00 LCDIFv2_CLK
LCD_HSYNC GPIO_DISP_B1_02 LCDIFv2_HSYNC
LCD_VSYNC GPIO_DISP_B1_03 LCDIFv2_VSYNC
LCD_ENABLE GPIO_DISP_B1_01 LCDIFv2_ENABLE
LCD_R0~R7 GPIO_DISP_B2_08~15 LCDIFv2_R0~R7
LCD_G0~G7 GPIO_DISP_B2_00~07 LCDIFv2_G0~G7
LCD_B0~B7 GPIO_DISP_B1_04~11 LCDIFv2_B0~B7
LCD_RST GPIO1_IO02 普通 GPIO 输出
Backlight GPIO2_IO31 普通 GPIO 输出

(2)配置方法

  1. 打开 ConfigTool,选择 RT1170 芯片型号;
  2. 引脚配置:在 “Pin Configuration” 中,找到目标引脚,设置为对应 LCDIFv2 功能;
  3. 电气属性配置:设置驱动强度(高驱动)、斜率(慢斜率)、上拉 / 下拉(禁用,避免信号干扰);
  4. 生成代码:点击 “Generate Code”,自动生成引脚初始化代码(BOARD_InitPins(void))。

步骤 2:时钟配置(关键:像素时钟校准)

LCDIFv2 的时钟需精准匹配并口屏时序,核心是计算并配置像素时钟。

(1)时钟架构与配置路径

  • 时钟源:选择 PLL5(Video Fractional-N PLL),支持精准分频;
  • 配置路径:PLL5 → VIDEO_MUX → LCDIFv2_CLKROOT → 像素时钟。

(2)像素时钟计算

像素时钟由并口屏时序参数决定,公式如下:

  • 参数说明:
    • 屏幕分辨率:480(宽)×272(高);
    • 同步参数(来自屏手册):HSW(行同步宽度)=10、HFP(行前肩)=4、HBP(行后肩)=2;VSW(场同步宽度)=41、VFP(场前肩)=4、VBP(场后肩)=18;
    • 刷新率:60Hz;
  • 计算结果:
  • 实际配置:通过 ConfigTool 将像素时钟设为最接近的 9.3MHz。

(3)ConfigTool 时钟配置步骤

  1. 打开 ConfigTool 的 “Clock Configuration”;
  2. 启用 PLL5:设置 PLL5 主频率为 744MHz,分频系数配置为:
    • PLL5_POST_DIV=4 → 744MHz÷4=186MHz;
    • 再经 10 分频 → 186MHz÷20=9.3MHz(像素时钟);
  3. 配置 VIDEO_MUX:选择 LCDIFv2 作为并行显示输出;
  4. 启用 LCDIFv2 时钟:确保 LCDIFv2_CLKROOT 时钟使能。

步骤 3:背光与复位初始化

(1)背光控制(GPIO 输出)

#include "fsl_gpio.h"

#define LCD_BL_GPIO GPIO2
#define LCD_BL_GPIO_PIN 31

void BOARD_InitBacklight(void) {
    gpio_pin_config_t bl_config = {
        kGPIO_DigitalOutput,  // 输出模式
        1,                    // 初始电平高(点亮背光)
        kGPIO_NoIntmode       // 无中断
    };
    GPIO_PinInit(LCD_BL_GPIO, LCD_BL_GPIO_PIN, &bl_config);
}

(2)屏幕复位(可选)

#define LCD_RST_GPIO GPIO1
#define LCD_RST_GPIO_PIN 2

void BOARD_ResetLcdPanel(void) {
    gpio_pin_config_t rst_config = {
        kGPIO_DigitalOutput,
        0,  // 复位电平低
        kGPIO_NoIntmode
    };
    GPIO_PinInit(LCD_RST_GPIO, LCD_RST_GPIO_PIN, &rst_config);
    
    GPIO_PinWrite(LCD_RST_GPIO, LCD_RST_GPIO_PIN, 0);  // 拉低复位
    SDK_DelayAtLeastUs(10000, CLOCK_GetCoreSysClkFreq());  // 延时10ms
    GPIO_PinWrite(LCD_RST_GPIO, LCD_RST_GPIO_PIN, 1);  // 释放复位
}

步骤 4:LCDIFv2 接口初始化

通过配置 LCDIFv2 的时序参数、帧缓冲地址等,完成接口初始化。

(1)定义时序与显示参数(宏定义)

// 屏幕参数(来自屏手册)
#define DEMO_PANEL_WIDTH  480    // 屏幕宽度
#define DEMO_PANEL_HEIGHT 272   // 屏幕高度
#define DEMO_HSW          10     // 行同步宽度
#define DEMO_HFP          4      // 行前肩
#define DEMO_HBP          2      // 行后肩
#define DEMO_VSW          41     // 场同步宽度
#define DEMO_VFP          4      // 场前肩
#define DEMO_VBP          18     // 场后肩
#define DEMO_LCDIF_POL_FLAGS (kELCDIF_HsyncActiveLow | kELCDIF_VsyncActiveLow)  // 同步信号极性
#define DEMO_LCDIF        LCDIF2  // 使用LCDIFv2模块

(2)LCDIFv2 配置结构体与初始化代码

#include "fsl_lcdifv2.h"

// 帧缓冲(需分配在可访问内存区域,示例使用24位RGB888格式)
static uint32_t s_frameBuffer[DEMO_PANEL_HEIGHT][DEMO_PANEL_WIDTH] __attribute__((aligned(64)));

// LCDIFv2配置结构体
static const dc_fb_lcdifv2_config_t s_lcdifv2Config = {
    .lcdifv2 = DEMO_LCDIF,
    .width = DEMO_PANEL_WIDTH,
    .height = DEMO_PANEL_HEIGHT,
    .hsw = DEMO_HSW,
    .hfp = DEMO_HFP,
    .hbp = DEMO_HBP,
    .vsw = DEMO_VSW,
    .vfp = DEMO_VFP,
    .vbp = DEMO_VBP,
    .polarityFlags = DEMO_LCDIF_POL_FLAGS,
    .lineOrder = kLCDIFV2_LineOrderRGB,  // RGB顺序
    .domain = 0,  // Cortex-M7核心对应domain 0(M4为1)
};

// 初始化LCDIFv2接口
status_t BOARD_InitLCDIFv2(void) {
    status_t status;
    
    // 启用VIDEO_MUX时钟
    CLOCK_EnableClock(kCLOCK_Video_Mux);
    
    // 配置VIDEO_MUX选择LCDIFv2输出
    VIDEO_MUX->VID_MUX_CTRL.SET = VIDEO_MUX_VID_MUX_CTRL_PARA_LCD_SEL_MASK;
    
    // 初始化LCDIFv2
    status = LCDIFV2_RgbModeInit(DEMO_LCDIF, &s_lcdifv2Config);
    if (status != kStatus_Success) {
        return status;
    }
    
    // 设置帧缓冲地址
    LCDIFV2_SetFrameBufferAddr(DEMO_LCDIF, (uint32_t)s_frameBuffer);
    
    // 启用LCDIFv2输出
    LCDIFV2_Enable(DEMO_LCDIF, true);
    
    return kStatus_Success;
}

步骤 5:帧缓冲填充与显示验证

初始化完成后,填充帧缓冲数据即可实现显示,示例填充纯色:
// 填充帧缓冲为红色(RGB888格式:0xFF0000)
void APP_FillFrameBufferRed(void) {
    for (uint32_t y = 0; y < DEMO_PANEL_HEIGHT; y++) {
        for (uint32_t x = 0; x < DEMO_PANEL_WIDTH; x++) {
            s_frameBuffer[y][x] = 0xFF0000;  // 红色
        }
    }
}

// 主函数调用流程
int main(void) {
    // 初始化系统时钟(含LCDIFv2时钟)
    BOARD_InitBootClocks();
    
    // 初始化引脚(LCDIFv2 + 背光 + 复位)
    BOARD_InitPins();
    BOARD_ResetLcdPanel();
    BOARD_InitBacklight();
    
    // 初始化LCDIFv2接口
    BOARD_InitLCDIFv2();
    
    // 填充帧缓冲并显示
    APP_FillFrameBufferRed();
    
    while (1) {
        // 循环刷新(若需动态显示,可在此更新帧缓冲)
    }
}

4. 关键避坑事项

  1. 时序参数匹配:必须严格按照并口屏数据手册配置 HSW/HFP/HBP/VSW/VFP/VBP,参数错误会导致显示花屏或无显示;
  2. 像素时钟精准度:像素时钟偏差过大会导致显示模糊,建议通过 ConfigTool 微调分频系数,接近计算值;
  3. VIDEO_MUX 配置:需确保 VIDEO_MUX 选择 LCDIFv2 输出,而非 eLCDIF,否则接口无数据输出;
  4. 帧缓冲地址对齐:帧缓冲需按 64 字节对齐,避免 DMA 传输错误;
  5. 同步信号极性:多数并口屏的 HSYNC/VSYNC 为低电平有效,需在polarityFlags中正确配置,否则无法同步。

5. 进阶优化:多层显示与 DMA 刷新

5.1 多层混合显示

LCDIFv2 支持 2 层帧缓冲叠加,示例配置前景层(图标)与背景层(纯色):
// 前景层帧缓冲
static uint32_t s_foregroundBuffer[DEMO_PANEL_HEIGHT][DEMO_PANEL_WIDTH] __attribute__((aligned(64)));

// 配置多层显示
LCDIFV2_SetLayerFrameBufferAddr(DEMO_LCDIF, 1, (uint32_t)s_foregroundBuffer);  // 层1(前景)
LCDIFV2_SetLayerEnable(DEMO_LCDIF, 1, true);  // 启用前景层

5.2 DMA 自动刷新

启用 LCDIFv2 的 DMA 功能,实现帧缓冲自动更新,减少 CPU 干预:
// 配置DMA传输
lcdifv2_dma_config_t dmaConfig = {
    .enable = true,
    .burstLength = kLCDIFV2_DmaBurstLength16Beats,  // 突发长度16拍
};
LCDIFV2_ConfigDma(DEMO_LCDIF, &dmaConfig);
RT1170 通过 LCDIFv2 驱动并口屏的核心是 “时序匹配 + 接口复用配置”,关键步骤包括引脚功能映射、像素时钟精准计算、VIDEO_MUX 选择 LCDIFv2 输出,以及帧缓冲初始化。相比 RT1060 的 eLCDIF,LCDIFv2 支持多层显示与更高性能,适配更复杂的显示场景。
开发过程中需重点关注并口屏时序参数与 RT1170 时钟配置的匹配度,通过 ConfigTool 简化时钟与引脚配置,再通过 SDK 提供的 LCDIFv2 驱动库快速实现显示功能。该方案适用于工业控制消费电子等需并行 RGB 显示的场景,可直接复用本文代码模板快速落地。

相关推荐