ARM-12-I.MX6U LCD

张开发
2026/5/21 7:32:57 15 分钟阅读
ARM-12-I.MX6U LCD
一、基础概念LCD液晶显示器是纯输出设备只负责显示不含触摸功能。触摸由独立的触摸控制器实现。本项目使用 ATK4384分辨率 800×480RGB 接口。分辨率规格像素点数量1080P1920×10802K2560×14404K3840×2160本项目800×480尺寸不变 → 分辨率越高越清晰分辨率不变 → 尺寸越小越清晰手机比显示器细腻的原因像素格式本项目使用 ARGB8888格式位数字节数说明RGB56516bit2字节R5G6B5RGB88824bit3字节无透明通道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 EnableVSYNC1根帧同步信号垂直同步HSYNC1根行同步信号水平同步PCLK1根像素时钟驱动模式DE 模式需要 DE 信号可以不接 HSYNC 也能正常工作本项目使用HV 模式不需要 DE 信号依赖 HSYNC/VSYNC三、LCD 时序参数最核心知识点显示一帧图像就像用一支笔从左到右、从上到下扫描每个像素点扫描完最后一个点就是一帧。3.1 行时序参数水平方向|--HSPW--|---HBP---|------HOZVAL有效像素-----|--HFP--|参数全称说明本项目值HSPWHorizontal Sync Pulse WidthHSYNC 脉冲宽度单位CLK48HBPHorizontal Back Porch行同步后肩等待时间88HOZVALHorizontal Valid有效像素宽度屏幕宽度800HFPHorizontal Front Porch行同步前肩40一行时间 HSPW HBP HOZVAL HFP 48 88 800 40 976 个像素时钟3.2 帧时序参数垂直方向|-VSPW-|--VBP--|--------LINE有效行--------|-VFP-|参数全称说明本项目值VSPWVertical Sync Pulse WidthVSYNC 脉冲宽度单位行3VBPVertical Back Porch帧同步后肩32LINEVertical Valid有效行数屏幕高度480VFPVertical 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 MHzHBP/HFP/VBP/VFP 存在的原因源自 CRT 电子枪的历史设计。在 LCD 中是给屏幕内部 IC 的反应时间让其识别换行/换帧信号锁定有效像素数据的开始位置。不同屏幕参数不同必须查屏幕手册不能随意填写。四、像素时钟配置时钟路径24MHz 晶振 ↓ PLL5VIDEO_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×421008MHzCCM_ANALOG_PLL_VIDEObit20:19 POST_DIV_SELECT后分频0 → 1分频CCM_ANALOG_PLL_VIDEObit13 ENABLEPLL5 使能1CCM_ANALOG_MISC2bit31:30 VIDEO_DIV视频分频0 → 1分频CCM_CSCDR2bit17:15 LCDIF1_PRE_CLK_SEL时钟源选择选 PLL5CCM_CSCDR2bit14:12 LCDIF1_PRED预分频3 → ÷4CCM_CBCMRbit25:23 LCDIF1_PODF后分频7 → ÷8CCM_CSCDR2bit11:9 LCDIF1_CLK_SEL最终时钟选择pre-muxed五、eLCDIF 控制器寄存器详解I.MX6U 的 LCD 控制器全称 Enhanced LCD InterfaceeLCDIF使用 DOTCLK 模式驱动 RGB LCD。LCDIF_CTRL — 主控制寄存器位名称说明本项目设置bit31SFTRST软复位为1强制复位初始化时先复位再清零bit30CLKGATE时钟门控正常运行必须为00bit19BYPASS_COUNTDOTCLK模式必须为11bit17DOTCLK_MODE为1 → DOTCLK模式1bit11:10LCD_DATABUS_WIDTH数据总线宽度324位3bit9:8WORD_LENGTH像素数据宽度324位/像素3bit5MASTER主模式使能1bit0RUNeLCDIF 使能最后置1最后置1// 代码中的写法LCDIF-CTRL(119)|(118)|(0x310)|(0x38)|(15);// 最后使能LCDIF-CTRL|(10);LCDIF_CTRL1只用到BYTE_PACKING_FORMAT(bit19:16)0xF 32位像素数据全有效默认值0x7 仅低24位有效A通道不传输本项目使用tmpLCDIF-CTRL1;tmp~(0xf16);tmp|(0x716);LCDIF-CTRL1tmp;LCDIF_TRANSFER_COUNT — 分辨率寄存器bit31:16 V_COUNT 屏幕高度480 bit15:0 H_COUNT 屏幕宽度800LCDIF-TRANSFER_COUNT(48016)|800;LCDIF_VDCTRL0 — VSYNC 控制位名称说明bit28ENABLE_PRESENTDE 信号使能1使能bit24ENABLE_POLDE 极性1高有效bit21VSYNC_PERIOD_UNITDOTCLK 模式必须为1单位行bit20VSYNC_PULSE_WIDTH_UNITDOTCLK 模式必须为1bit17:0VSYNC_PULSE_WIDTHVSPW 参数值 3LCDIF-VDCTRL0(128)|(124)|(121)|(120)|3;LCDIF_VDCTRL1 — VSYNC 总周期值 高度 VSPW VBP VFP 480 3 32 13 528LCDIF_VDCTRL2 — HSYNC 控制bit31:18 HSYNC_PULSE_WIDTH HSPW 48 bit17:0 HSYNC_PERIOD 宽度 HSPW HBP HFP 800 48 88 40 976LCDIF-VDCTRL2(4818)|976;LCDIF_VDCTRL3 — 等待计数bit27:16 HORIZONTAL_WAIT_CNT HSPW HBP 48 88 136 bit15:0 VERTICAL_WAIT_CNT VSPW VBP 3 32 35LCDIF-VDCTRL3(13616)|35;LCDIF_VDCTRL4bit18 SYNC_SIGNALS_ON 1使能 VSYNC/HSYNC/DOTCLK bit15:0 DOTCLK_H_VALID_DATA_CNT 屏幕宽度 800LCDIF-VDCTRL4(118)|800;显存寄存器寄存器说明LCDIF_CUR_BUF当前帧显存地址eLCDIF 自动读取并显示LCDIF_NEXT_BUF下一帧显存地址双缓冲用也可与 CUR_BUF 相同#defineLCD_CUR_BUF0x88000000LCDIF-CUR_BUFLCD_CUR_BUF;LCDIF-NEXT_BUFLCD_CUR_BUF;六、lcd_init() 完整初始化流程1. lcd_io_init() 初始化 IO 引脚 ↓ 24根数据线 DATA00~DATA23CLK/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 ↓ SFTRST1 → delay_ms(20) → SFTRST0, CLKGATE0 4. 配置 LCDIF_CTRL DOTCLK模式24位总线主模式RUN 暂不置1 5. 配置 LCDIF_CTRL1 BYTE_PACKING_FORMAT 0x7 6. 配置 LCDIF_TRANSFER_COUNT (48016)|800 7. 配置 LCDIF_VDCTRL0 信号极性VSPW3 8. 配置 LCDIF_VDCTRL1 VSYNC总周期528 9. 配置 LCDIF_VDCTRL2 HSPW48HSYNC总周期976 10. 配置 LCDIF_VDCTRL3 水平等待136垂直等待35 11. 配置 LCDIF_VDCTRL4 使能同步信号有效宽度800 12. 设置显存地址 CUR_BUF NEXT_BUF 0x88000000 13. LCDIF_CTRL | (10) RUN1开始输出像素时钟 14. GPIO1_IO08 高电平 开启背光屏幕点亮 ✓七、显存机制与 lcd_fill()LCD 内部没有显存。需要从 DDR3 中划出一块内存约 1.5MB作为显存把首地址写入LCDIF_CUR_BUFeLCDIF 控制器自动循环读取这块内存按像素格式输出到屏幕。要显示什么直接修改显存内容即可。intlcd_fill(void){uint32_t*p(uint32_t*)LCD_CUR_BUF;// 指向显存起始地址inti0;for(i0;i800*300;i)// 填充前 300 行{*(pi)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,y1voidlcd_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 模式必须11LCDIF_CTRLbit17 DOTCLK_MODEDOTCLK 模式使能1LCDIF_CTRLbit11:10 LCD_DATABUS_WIDTH总线宽度324位3LCDIF_CTRLbit9:8 WORD_LENGTH像素位数324位3LCDIF_CTRLbit5 MASTER主模式1LCDIF_CTRLbit0 RUNeLCDIF 使能最后置1LCDIF_CTRL1bit19:16 BYTE_PACKING_FORMAT有效字节掩码0x724位0x7LCDIF_TRANSFER_COUNTbit31:16 V_COUNT垂直分辨率480LCDIF_TRANSFER_COUNTbit15:0 H_COUNT水平分辨率800LCDIF_VDCTRL0bit28 ENABLE_PRESENTDE 信号使能1LCDIF_VDCTRL0bit17:0 VSYNC_PULSE_WIDTHVSPW 值3LCDIF_VDCTRL1全部VSYNC总周期528LCDIF_VDCTRL2bit31:18HSPW 值48LCDIF_VDCTRL2bit17:0HSYNC总周期976LCDIF_VDCTRL3bit27:16HSPWHBP水平等待136LCDIF_VDCTRL3bit15:0VSPWVBP垂直等待35LCDIF_VDCTRL4bit18 SYNC_SIGNALS_ON同步信号使能1LCDIF_VDCTRL4bit15:0有效宽度水平像素数800LCDIF_CUR_BUF全部当前帧显存首地址0x88000000LCDIF_NEXT_BUF全部下一帧显存首地址0x88000000十一、面试常问 QAQ1LCD 的 HBP/HFP/VBP/VFP 是什么为什么存在源自 CRT 电子枪的历史设计。在 LCD 中这段时间是给屏幕内部 IC 的反应时间让其识别换行/换帧信号锁定有效像素数据的开始位置。不同屏幕的这四个参数不同必须查屏幕手册获取不能随意填写。Q2显存在哪里如何显示图像LCD 内部没有显存需要从 DDR3 中划出一块内存约 1.5MB作为显存把首地址写入LCDIF_CUR_BUFeLCDIF 控制器自动把这块内存按像素格式输出到屏幕。要显示什么直接修改显存内容即可。Q3像素时钟 31 MHz 是怎么来的由屏幕分辨率和刷新率决定(VSPWVBPHEIGHTVFP) × (HSPWHBPWIDTHHFP) × fps (33248013) × (488880040) × 60 528 × 976 × 60 ≈ 31 MHz实际通过 PLL5 配置为 31.5MHz。Q4为什么用 DOTCLK 模式而不是 VSYNC 或 MPU 模式DOTCLK 模式就是 RGB 接口适合直接驱动带 RGB 信号线的 LCD 屏幕24根数据线 控制信号。本项目搭载的 ATK4384 就是 RGB 接口屏幕。与 MPU 模式相比DOTCLK 模式由控制器自动刷新CPU 无需干预。Q5BYTE_PACKING_FORMAT 为什么设置为 0x7像素格式虽然是 ARGB8888每像素 4字节但 A透明度通道不需要输出到屏幕。BYTE_PACKING0x7表示每个 32bit 数据中bit[23:0]RGB 三通道有效bit[31:24]A通道无效控制器只传输 24 位有效数据。

更多文章