当前位置: 首页 > news >正文

ARM-12-I.MX6U LCD

一、基础概念

LCD(液晶显示器)是纯输出设备,只负责显示,不含触摸功能。触摸由独立的触摸控制器实现。本项目使用 ATK4384,分辨率 800×480,RGB 接口。

分辨率

规格像素点数量
1080P1920×1080
2K2560×1440
4K3840×2160
本项目800×480

尺寸不变 → 分辨率越高越清晰;分辨率不变 → 尺寸越小越清晰(手机比显示器细腻的原因)

像素格式(本项目使用 ARGB8888)

格式位数字节数说明
RGB56516bit2字节R5G6B5
RGB88824bit3字节无透明通道
ARGB888832bit4字节A透明+RGB,本项目使用

ARGB8888 内存布局:

bit31~24: Alpha(透明度) bit23~16: RED bit15~8: GREEN bit7~0: BLUE

常用颜色值:

红色0x00FF0000绿色0x0000FF00蓝色0x000000FF黄色0x00FFFF00白色0x00FFFFFF黑色0x00000000紫色0x00FF00FF// lcd_fill() 中使用的颜色

显存大小

显存大小 = 800 × 480 × 4字节 = 1,536,000 字节 ≈ 1.5MB

从 DDR3 中划出,首地址写入LCDIF_CUR_BUF,修改显存内容即可改变屏幕显示。


二、RGB LCD 硬件接口

I.MX6U-Mini 支持 RGB 接口 LCD,信号线如下:

信号线数量说明
R[7:0]8根红色数据线
G[7:0]8根绿色数据线
B[7:0]8根蓝色数据线
DE1根数据使能线(Data Enable)
VSYNC1根帧同步信号(垂直同步)
HSYNC1根行同步信号(水平同步)
PCLK1根像素时钟

驱动模式:

  • DE 模式:需要 DE 信号,可以不接 HSYNC 也能正常工作(本项目使用
  • HV 模式:不需要 DE 信号,依赖 HSYNC/VSYNC

三、LCD 时序参数(最核心知识点)

显示一帧图像就像用一支"笔"从左到右、从上到下扫描每个像素点,扫描完最后一个点就是一帧。

3.1 行时序参数(水平方向)

|<--HSPW-->|<---HBP--->|<------HOZVAL(有效像素)----->|<--HFP-->|
参数全称说明本项目值
HSPWHorizontal Sync Pulse WidthHSYNC 脉冲宽度,单位:CLK48
HBPHorizontal Back Porch行同步后肩(等待时间)88
HOZVALHorizontal Valid有效像素宽度(屏幕宽度)800
HFPHorizontal Front Porch行同步前肩40
一行时间 = HSPW + HBP + HOZVAL + HFP = 48 + 88 + 800 + 40 = 976 个像素时钟

3.2 帧时序参数(垂直方向)

|<-VSPW->|<--VBP-->|<--------LINE(有效行)-------->|<-VFP->|
参数全称说明本项目值
VSPWVertical Sync Pulse WidthVSYNC 脉冲宽度,单位:行3
VBPVertical Back Porch帧同步后肩32
LINEVertical Valid有效行数(屏幕高度)480
VFPVertical Front Porch帧同步前肩13
一帧行数 = VSPW + VBP + LINE + VFP = 3 + 32 + 480 + 13 = 528 行

3.3 像素时钟计算

一帧时钟数 = 528 × 976 = 515,328 60帧/秒 = 515,328 × 60 = 30,919,680 ≈ 31 MHz → 实际配置 PLL5 输出 31.5 MHz

HBP/HFP/VBP/VFP 存在的原因:源自 CRT 电子枪的历史设计。在 LCD 中是给屏幕内部 IC 的反应时间,让其识别换行/换帧信号,锁定有效像素数据的开始位置。不同屏幕参数不同,必须查屏幕手册,不能随意填写。


四、像素时钟配置

时钟路径

24MHz 晶振 ↓ PLL5(VIDEO_PLL)×42 → 1008 MHz ↓ LCDIF1_PRE_CLK_SEL 选 PLL5 ↓ LCDIF1_PRED = 3 → ÷4 → 252 MHz ↓ LCDIF1_PODF = 7 → ÷8 ↓ LCDIF1_CLK_ROOT = 1008 ÷ 4 ÷ 8 = 31.5 MHz

涉及的寄存器

寄存器说明设置值
CCM_ANALOG_PLL_VIDEObit6:0 DIV_SELECTPLL5 倍频42(×42=1008MHz)
CCM_ANALOG_PLL_VIDEObit20:19 POST_DIV_SELECT后分频0 → 1分频
CCM_ANALOG_PLL_VIDEObit13 ENABLEPLL5 使能1
CCM_ANALOG_MISC2bit31:30 VIDEO_DIV视频分频0 → 1分频
CCM_CSCDR2bit17:15 LCDIF1_PRE_CLK_SEL时钟源选择选 PLL5
CCM_CSCDR2bit14:12 LCDIF1_PRED预分频3 → ÷4
CCM_CBCMRbit25:23 LCDIF1_PODF后分频7 → ÷8
CCM_CSCDR2bit11:9 LCDIF1_CLK_SEL最终时钟选择pre-muxed

五、eLCDIF 控制器寄存器详解

I.MX6U 的 LCD 控制器全称 Enhanced LCD Interface(eLCDIF),使用 DOTCLK 模式驱动 RGB LCD。

LCDIF_CTRL — 主控制寄存器

名称说明本项目设置
bit31SFTRST软复位,为1强制复位初始化时先复位再清零
bit30CLKGATE时钟门控,正常运行必须为00
bit19BYPASS_COUNTDOTCLK模式必须为11
bit17DOTCLK_MODE为1 → DOTCLK模式1
bit11:10LCD_DATABUS_WIDTH数据总线宽度,3=24位3
bit9:8WORD_LENGTH像素数据宽度,3=24位/像素3
bit5MASTER主模式使能1
bit0RUNeLCDIF 使能,最后置1最后置1
// 代码中的写法LCDIF->CTRL=(1<<19)|(1<<18)|(0x3<<10)|(0x3<<8)|(1<<5);// 最后使能LCDIF->CTRL|=(1<<0);

LCDIF_CTRL1

只用到BYTE_PACKING_FORMAT(bit19:16)

  • 0xF= 32位像素数据全有效(默认值)
  • 0x7= 仅低24位有效(A通道不传输,本项目使用)
tmp=LCDIF->CTRL1;tmp&=~(0xf<<16);tmp|=(0x7<<16);LCDIF->CTRL1=tmp;

LCDIF_TRANSFER_COUNT — 分辨率寄存器

bit31:16 V_COUNT = 屏幕高度(480) bit15:0 H_COUNT = 屏幕宽度(800)
LCDIF->TRANSFER_COUNT=(480<<16)|800;

LCDIF_VDCTRL0 — VSYNC 控制

名称说明
bit28ENABLE_PRESENTDE 信号使能:1=使能
bit24ENABLE_POLDE 极性:1=高有效
bit21VSYNC_PERIOD_UNITDOTCLK 模式必须为1(单位=行)
bit20VSYNC_PULSE_WIDTH_UNITDOTCLK 模式必须为1
bit17:0VSYNC_PULSE_WIDTHVSPW 参数值 = 3
LCDIF->VDCTRL0=(1<<28)|(1<<24)|(1<<21)|(1<<20)|3;

LCDIF_VDCTRL1 — VSYNC 总周期

值 = 高度 + VSPW + VBP + VFP = 480 + 3 + 32 + 13 = 528

LCDIF_VDCTRL2 — HSYNC 控制

bit31:18 HSYNC_PULSE_WIDTH = HSPW = 48 bit17:0 HSYNC_PERIOD = 宽度 + HSPW + HBP + HFP = 800 + 48 + 88 + 40 = 976
LCDIF->VDCTRL2=(48<<18)|976;

LCDIF_VDCTRL3 — 等待计数

bit27:16 HORIZONTAL_WAIT_CNT = HSPW + HBP = 48 + 88 = 136 bit15:0 VERTICAL_WAIT_CNT = VSPW + VBP = 3 + 32 = 35
LCDIF->VDCTRL3=(136<<16)|35;

LCDIF_VDCTRL4

bit18 SYNC_SIGNALS_ON = 1(使能 VSYNC/HSYNC/DOTCLK) bit15:0 DOTCLK_H_VALID_DATA_CNT = 屏幕宽度 = 800
LCDIF->VDCTRL4=(1<<18)|800;

显存寄存器

寄存器说明
LCDIF_CUR_BUF当前帧显存地址,eLCDIF 自动读取并显示
LCDIF_NEXT_BUF下一帧显存地址(双缓冲用,也可与 CUR_BUF 相同)
#defineLCD_CUR_BUF0x88000000LCDIF->CUR_BUF=LCD_CUR_BUF;LCDIF->NEXT_BUF=LCD_CUR_BUF;

六、lcd_init() 完整初始化流程

1. lcd_io_init() 初始化 IO 引脚 ↓ 24根数据线 DATA00~DATA23,CLK/HSYNC/VSYNC/ENABLE ↓ 引脚复用:IOMUXC 配置为 LCDIF,电气特性 0x10f9 ↓ 背光控制:GPIO1_IO08 → 输出高电平点亮 2. lcd_clk_init() 初始化像素时钟 ↓ PLL5 × 42 = 1008MHz ↓ PRED ÷ 4 = 252MHz ↓ PODF ÷ 8 = 31.5MHz 3. lcd_reset() 复位 eLCDIF ↓ SFTRST=1 → delay_ms(20) → SFTRST=0, CLKGATE=0 4. 配置 LCDIF_CTRL DOTCLK模式,24位总线,主模式(RUN 暂不置1) 5. 配置 LCDIF_CTRL1 BYTE_PACKING_FORMAT = 0x7 6. 配置 LCDIF_TRANSFER_COUNT (480<<16)|800 7. 配置 LCDIF_VDCTRL0 信号极性,VSPW=3 8. 配置 LCDIF_VDCTRL1 VSYNC总周期=528 9. 配置 LCDIF_VDCTRL2 HSPW=48,HSYNC总周期=976 10. 配置 LCDIF_VDCTRL3 水平等待=136,垂直等待=35 11. 配置 LCDIF_VDCTRL4 使能同步信号,有效宽度=800 12. 设置显存地址 CUR_BUF = NEXT_BUF = 0x88000000 13. LCDIF_CTRL |= (1<<0) RUN=1,开始输出像素时钟 14. GPIO1_IO08 = 高电平 开启背光,屏幕点亮 ✓

七、显存机制与 lcd_fill()

LCD 内部没有显存。需要从 DDR3 中划出一块内存(约 1.5MB)作为显存,把首地址写入LCDIF_CUR_BUF,eLCDIF 控制器自动循环读取这块内存,按像素格式输出到屏幕。要显示什么,直接修改显存内容即可。

intlcd_fill(void){uint32_t*p=(uint32_t*)LCD_CUR_BUF;// 指向显存起始地址inti=0;for(i=0;i<800*300;i++)// 填充前 300 行{*(p+i)=0xff00ff;// 紫色}return0;}

八、图形库移植接口

移植graphics.c / graphics.h / font.h需要先实现三个底层接口:

// 1. 在指定坐标画一个像素点voidlcd_draw_point(intx,inty,uint32_tcolor);// 2. 读取指定坐标的像素值uint32_tlcd_read_point(intx,inty);// 3. 画一个矩形(左上角x0,y0,右下角x1,y1)voidlcd_draw_rect(intx0,inty0,intx1,inty1,uint32_tcolor);

图形库提供的常用函数:

// 在指定位置显示字符串(最常用)lcd_show_string(intx,inty,char*str,uint32_tcolor);// 画线、画圆等lcd_draw_line(...);lcd_draw_circle(...);

九、LCD 设备结构体设计

将 LCD 参数封装进结构体,方便图形库调用:

typedefstruct{uint32_twidth;// 屏幕宽度(像素)uint32_theight;// 屏幕高度(像素)uint32_thspw;// HSYNC 脉冲宽度uint32_thbp;// 行后肩uint32_thfp;// 行前肩uint32_tvspw;// VSYNC 脉冲宽度uint32_tvbp;// 帧后肩uint32_tvfp;// 帧前肩uint32_t*framebuffer;// 显存首地址}Lcd_type;externLcd_type dev;// 全局变量,供图形库调用

十、关键寄存器速查表

寄存器关键位功能本项目值
LCDIF_CTRLbit19 BYPASS_COUNTDOTCLK 模式必须=11
LCDIF_CTRLbit17 DOTCLK_MODEDOTCLK 模式使能1
LCDIF_CTRLbit11:10 LCD_DATABUS_WIDTH总线宽度(3=24位)3
LCDIF_CTRLbit9:8 WORD_LENGTH像素位数(3=24位)3
LCDIF_CTRLbit5 MASTER主模式1
LCDIF_CTRLbit0 RUNeLCDIF 使能最后置1
LCDIF_CTRL1bit19:16 BYTE_PACKING_FORMAT有效字节掩码(0x7=24位)0x7
LCDIF_TRANSFER_COUNTbit31:16 V_COUNT垂直分辨率480
LCDIF_TRANSFER_COUNTbit15:0 H_COUNT水平分辨率800
LCDIF_VDCTRL0bit28 ENABLE_PRESENTDE 信号使能1
LCDIF_VDCTRL0bit17:0 VSYNC_PULSE_WIDTHVSPW 值3
LCDIF_VDCTRL1全部VSYNC总周期528
LCDIF_VDCTRL2bit31:18HSPW 值48
LCDIF_VDCTRL2bit17:0HSYNC总周期976
LCDIF_VDCTRL3bit27:16HSPW+HBP(水平等待)136
LCDIF_VDCTRL3bit15:0VSPW+VBP(垂直等待)35
LCDIF_VDCTRL4bit18 SYNC_SIGNALS_ON同步信号使能1
LCDIF_VDCTRL4bit15:0有效宽度(水平像素数)800
LCDIF_CUR_BUF全部当前帧显存首地址0x88000000
LCDIF_NEXT_BUF全部下一帧显存首地址0x88000000

十一、面试常问 Q&A

Q1:LCD 的 HBP/HFP/VBP/VFP 是什么,为什么存在?

源自 CRT 电子枪的历史设计。在 LCD 中,这段时间是给屏幕内部 IC 的反应时间,让其识别换行/换帧信号,锁定有效像素数据的开始位置。不同屏幕的这四个参数不同,必须查屏幕手册获取,不能随意填写。


Q2:显存在哪里,如何显示图像?

LCD 内部没有显存,需要从 DDR3 中划出一块内存(约 1.5MB)作为显存,把首地址写入LCDIF_CUR_BUF,eLCDIF 控制器自动把这块内存按像素格式输出到屏幕。要显示什么,直接修改显存内容即可。


Q3:像素时钟 31 MHz 是怎么来的?

由屏幕分辨率和刷新率决定:

(VSPW+VBP+HEIGHT+VFP) × (HSPW+HBP+WIDTH+HFP) × fps = (3+32+480+13) × (48+88+800+40) × 60 = 528 × 976 × 60 ≈ 31 MHz

实际通过 PLL5 配置为 31.5MHz。


Q4:为什么用 DOTCLK 模式而不是 VSYNC 或 MPU 模式?

DOTCLK 模式就是 RGB 接口,适合直接驱动带 RGB 信号线的 LCD 屏幕(24根数据线 + 控制信号)。本项目搭载的 ATK4384 就是 RGB 接口屏幕。与 MPU 模式相比,DOTCLK 模式由控制器自动刷新,CPU 无需干预。


Q5:BYTE_PACKING_FORMAT 为什么设置为 0x7?

像素格式虽然是 ARGB8888(每像素 4字节),但 A(透明度)通道不需要输出到屏幕。BYTE_PACKING=0x7表示每个 32bit 数据中,bit[23:0](RGB 三通道)有效,bit[31:24](A通道)无效,控制器只传输 24 位有效数据。

http://www.cnnetsun.cn/news/1663114.html

相关文章:

  • 忍者像素绘卷惊艳效果展示:鸣人螺旋丸像素绘卷作品集
  • UE5开发日志:个人足球游戏demo《SketchSoccer》——后期处理体积实现风格化素描
  • OpenClaw+百川2-13B:5分钟搭建个人微博自动回复机器人
  • 养虾之_给bytebot中Ubuntu系统配置系统国内镜像源_并且安装远程软件remmina/xfreerdp_直接让bytebot远程物理机器干活---AI大模型应用探索0018
  • Pixel Aurora Engine实际项目:像素化数据可视化看板生成技术实践
  • STEP3-VL-10B开源大模型:支持ONNX导出+边缘设备轻量化部署
  • 房屋建筑学-门窗
  • 别再死记硬背了!用PyTorch代码逐行拆解Transformer中的QKV矩阵计算
  • Riffusion 音频生成 API 集成指南
  • Hunyuan-MT-7B GPU部署:Pixel Language Portal在单卡A10上并发处理16路实时语音翻译压测报告
  • OpenClaw技能开发入门:为千问3.5-35B-A3B-FP8编写图片处理插件
  • 3D医学影像分割实战:从数据预处理到模型训练全流程解析
  • 告别黑箱预测:用TFT模型搞定电力负荷与销量预测,还能看懂模型在想什么
  • Wan2.2-I2V-A14B长视频拼接:多段10秒视频无缝衔接生成60秒方案
  • 开源大模型部署教程:Pixel Epic智识终端+AgentCPM-Report零基础搭建
  • Pixel Aurora Engine 提示词安全与内容过滤:构建负责任的AI应用
  • 【仅开放72小时】C++27实验性parallel_unstable_sort_view深度评测:多核排序吞吐达1.2GB/s的编译器flag调优矩阵(附Intel Xeon W9-3400实测数据)
  • SEO_快速见效的SEO实操技巧与工具推荐
  • intv_ai_mk11效果实测:技术面试题生成能力——覆盖算法/系统设计/行为问题
  • 百川2-13B-4bits量化版+OpenClaw:智能家居控制中心改造
  • AI开发效率翻倍:TensorFlow-v2.9镜像完整开发环境实测体验
  • Qwen3智能字幕对齐系统Mathtype公式识别挑战与解决方案
  • Phi-4-mini-reasoning助力VSCode开发:智能代码补全与问题诊断实战
  • 【bilibili-downloader】:突破4K画质限制的B站视频下载工具:给视频收藏爱好者的高效解决方案
  • 设计行业AI转型:从创意出图到落地交付的全流程效率提升
  • OpenClaw浏览器自动化:配合Phi-3-vision-128k-instruct实现网页图文抓取
  • 告别云端依赖!DeepSeek-R1-Distill-Qwen-1.5B离线运行全攻略
  • 该SSD固态硬盘告诉你:航天级芯片如何解决企业数据存储的卡顿与安全痛点?
  • SEO_ 2024年必须知道的7个核心SEO技巧与策略
  • 零代码美化Neeshck-Z-lmage_LYX_v2界面:Streamlit主题定制完整教程