嵌入式开发基础学习笔记(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 控制器,之后显存中的数据会自动显示在屏幕上。
相关推荐
猫猫的小茶馆7 小时前
【Python】函数与模块化编程
linux·开发语言·arm开发·驱动开发·python·stm32
嵌入式小站8 小时前
STM32 零基础可移植教程 05:按键消抖,为什么按一次会触发好几次
chrome·stm32·嵌入式硬件
czhaii9 小时前
跟我动手学FX系列PLC GX2环境
嵌入式硬件
霞姐聊IT9 小时前
x86程序移植到arm平台的四种场景及解决方案简介
arm开发
2zcode10 小时前
基于STM32的智能扫地机器人设计与实现
stm32·嵌入式硬件·机器人
jllllyuz11 小时前
单相并网逆变器控制代码实现(STM32版)
stm32·单片机·嵌入式硬件
楼兰公子12 小时前
《深入理解Linux网络技术内幕》配套学习大纲 + 源码Demo + 进阶实战实例
linux·arm开发·学习
冉卓电子12 小时前
GD32C103RBT6 misc 内核驱动库极简解析
单片机·嵌入式硬件
yongui4783412 小时前
MAX6675 K型热电偶温度采集程序(Keil环境)
单片机·嵌入式硬件
豆包公子12 小时前
AUTOSAR CP XCP 移植到裸机 MCU-实践篇
单片机·嵌入式硬件