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)配置方法
- 打开 ConfigTool,选择 RT1170 芯片型号;
- 引脚配置:在 “Pin Configuration” 中,找到目标引脚,设置为对应 LCDIFv2 功能;
- 电气属性配置:设置驱动强度(高驱动)、斜率(慢斜率)、上拉 / 下拉(禁用,避免信号干扰);
- 生成代码:点击 “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 时钟配置步骤
- 打开 ConfigTool 的 “Clock Configuration”;
- 启用 PLL5:设置 PLL5 主频率为 744MHz,分频系数配置为:
- PLL5_POST_DIV=4 → 744MHz÷4=186MHz;
- 再经 10 分频 → 186MHz÷20=9.3MHz(像素时钟);
- 配置 VIDEO_MUX:选择 LCDIFv2 作为并行显示输出;
- 启用 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. 关键避坑事项
- 时序参数匹配:必须严格按照并口屏数据手册配置 HSW/HFP/HBP/VSW/VFP/VBP,参数错误会导致显示花屏或无显示;
- 像素时钟精准度:像素时钟偏差过大会导致显示模糊,建议通过 ConfigTool 微调分频系数,接近计算值;
- VIDEO_MUX 配置:需确保 VIDEO_MUX 选择 LCDIFv2 输出,而非 eLCDIF,否则接口无数据输出;
- 帧缓冲地址对齐:帧缓冲需按 64 字节对齐,避免 DMA 传输错误;
- 同步信号极性:多数并口屏的 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 支持多层显示与更高性能,适配更复杂的显示场景。
阅读全文
版权声明:网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
侵权投诉
人工客服
(售后/吐槽/合作/交友)
人工客服(售后/吐槽/合作/交友)
367