嵌入式开发基础学习笔记(RGB LCD 驱动开发)

RGB LCD 驱动开发学习笔记

1. LCD 硬件接口与信号线

RGB LCD 采用并行接口,主要包含以下信号线:

  • 数据线:R[7:0](8根)、G[7:0](8根)、B[7:0](8根),共24根数据线(也可配置为16位模式)。
  • 控制信号线
    • DE (Data Enable):数据使能信号。
    • VSYNC:垂直同步信号(帧同步信号)。
    • HSYNC:水平同步信号(行同步信号)。
    • PCLK (Pixel Clock):像素时钟信号。
2. LCD 像素格式 (Pixel Format)
  • ARGB8888 格式 :一个像素点占用 4 个字节 (32位)。
    • A (Alpha):透明度通道 (bit 31-24)。
    • R (Red):红色通道 (bit 23-16)。
    • G (Green):绿色通道 (bit 15-8)。
    • B (Blue):蓝色通道 (bit 7-0)。
  • 显存 (Frame Buffer):需要在 DDR 中开辟一段内存空间用于存放像素数据,eLCDIF 控制器会自动从该地址读取数据发送给 LCD。
3. LCD 时序详解 (重点)

LCD 显示一帧图像的过程类似于"画图",电子枪从左到右、从上到下扫描像素点。为了锁定有效的像素数据,需要设置特定的时序参数(包含"黑边"时间)。

A. 行显示时序 (Horizontal Timing)

行时序决定了每一行的扫描过程。

  • HSYNC:行同步信号(低电平有效)。

  • HSPW (Horizontal Sync Pulse Width):行同步信号宽度(Thp),单位为 CLK。

  • HBP (Horizontal Back Porch):行同步信号后肩(Thb)。

  • HOZVAL:显示一行有效数据所需的时间(即屏幕宽度)。

  • HFP (Horizontal Front Porch) :行同步信号前肩(Thf)。

  • 关键计算公式:

  • 显示一行所需时间 = HSPW + HBP + HOZVAL + HFP

  • 有效像素开始位置 = 等待 HSPW + HBP 个 CLK 时间后开始。

B. 帧显示时序 (Vertical Timing)

帧时序决定了每一帧(画面)的扫描过程。

  • VSYNC:帧同步信号(低电平有效)。
  • VSPW (Vertical Sync Pulse Width):帧同步信号宽度(Tvp)。
  • VBP (Vertical Back Porch):帧同步信号后肩(Tvb)。
  • LINE (或 VERVAL):显示一帧有效数据所需的时间(即屏幕高度)。
  • VFP (Vertical Front Porch):帧同步信号前肩(Tvf)。

关键计算公式:

  • 显示一帧所需时间 = (VSPW + VBP + LINE + VFP) 个行时间。
  • 总像素时钟频率 = 1 / (显示一帧所需时间 * 显示一行所需时间)

C. 时序参数对照表

参数缩写 全称 中文含义 说明
HSPW Horizontal Sync Pulse Width 行同步脉宽 HSYNC 信号持续时间
HBP Horizontal Back Porch 行后肩 同步信号结束后到有效数据开始的时间
HFP Horizontal Front Porch 行前肩 有效数据结束后到下一次同步信号的时间
VSPW Vertical Sync Pulse Width 帧同步脉宽 VSYNC 信号持续时间
VBP Vertical Back Porch 帧后肩 帧同步信号结束后到有效数据开始的时间
VFP Vertical Front Porch 帧前肩 有效画面结束后到下一次帧同步的时间
4. eLCDIF 控制器配置

I.MX6U 的 LCD 控制器称为 eLCDIF (Enhanced LCD Interface)

A. 像素时钟配置 (Pixel Clock)

eLCDIF 的工作频率需要根据屏幕参数精确配置。

  • 时钟源选择 :通常选择 PLL5 (Video PLL)
  • 分频流程
    1. 选择 PLL5 作为时钟源(设置 CSCDR2[LCDIF1_PRE_CLK_SEL])。
    2. 经过预分频器(设置 CSCDR2[LCDIF1_PODF])。
    3. 最终到达 eLCDIF 外设。
  • 计算示例
    • 目标频率:31.5 MHz。
    • 设置 PLL5 为 1008 MHz -> 4分频 -> 8分频 -> 31.5 MHz。

B. 关键寄存器配置

在代码中,需要初始化 LCDIF_CTRLLCDIF_VDCTRL0-4 等寄存器。

寄存器 关键位域 (BitFields) 说明
LCDIF_CTRL CLKGATE, SFTRST 复位和时钟门控
DOTCLK_MODE 必须置 1,工作在 DOTCLK 模式
WORD_LENGTH 像素位宽 (3=24位)
LCDIF_VDCTRL0 HSYNC_POL, VSYNC_POL 同步信号极性设置
ENABLE_POL DE 信号极性
VSYNC_PULSE_WIDTH VSPW 值设置
LCDIF_VDCTRL2 HSYNC_PULSE_WIDTH HSPW 值设置
HSYNC_PERIOD 一行的总周期 (HSPW+HBP+WIDTH+HFP)
LCDIF_VDCTRL3 VERTICAL_WAIT_CNT VSPW + VBP
HORIZONTAL_WAIT_CNT HSPW + HBP
LCDIF_VDCTRL4 DOTCLK_H_VALID_DATA_CNT 设置屏幕宽度 (WIDTH)
5. 驱动初始化流程
  1. 初始化 IO 引脚 :将 LCD 相关引脚复用为 LCDIF 功能,并配置电气属性(如驱动能力、压摆率)。
  2. 初始化像素时钟:配置 CCM 模块,设置 PLL5 和分频器,生成所需的像素时钟(如 31.5MHz)。
  3. 配置 eLCDIF 寄存器
    • 复位控制器。
    • 设置屏幕分辨率(TRANSFER_COUNT)。
    • 配置时序参数(VSPW, VBP, VFP, HSPW, HBP, HFP)。
    • 设置显存地址(CUR_BUF, NEXT_BUF)。
  4. 开启显示:使能 eLCDIF 控制器,之后显存中的数据会自动显示在屏幕上。
相关推荐
嵌入式-老费2 小时前
Linux camera驱动开发(开篇)
linux·运维·驱动开发
caoxiaoye2 小时前
SDD规范驱动开发新范式:软件工程的未来变革与落地实践
驱动开发·软件工程
youcans_2 小时前
【动手学STM32G4】(16)PWM 触发 ADC 精确同步采样
stm32·单片机·嵌入式硬件·pwm·adc
松涛和鸣16 小时前
DAY63 IMX6ULL ADC Driver Development
linux·运维·arm开发·单片机·嵌入式硬件·ubuntu
测试人社区—667917 小时前
2025区块链分层防御指南:AI驱动的安全测试实战策略
开发语言·驱动开发·python·appium·pytest
想放学的刺客19 小时前
单片机嵌入式试题(第23期)嵌入式系统电源管理策略设计、嵌入式系统通信协议栈实现要点两个全新主题。
c语言·stm32·单片机·嵌入式硬件·物联网
猫猫的小茶馆20 小时前
【Linux 驱动开发】五. 设备树
linux·arm开发·驱动开发·stm32·嵌入式硬件·mcu·硬件工程
jghhh0121 小时前
基于上海钜泉科技HT7017单相计量芯片的参考例程实现
科技·单片机·嵌入式硬件
春日见21 小时前
Docker中如何删除镜像
运维·前端·人工智能·驱动开发·算法·docker·容器