【ARM嵌入式开发】LCD液晶屏显示原理、色彩模式与显存地址映射详解

一、LCD 屏幕基础概念

1. 分辨率与屏幕尺寸

屏幕分辨率 :指屏幕横向与纵向的像素点个数。例如 800×480、1920×1080(1080P)、2560×1440(2K)等。

屏幕尺寸 :以英寸(inch)为单位,测量的是屏幕对角线的长度(1 inch=2.54cm)。

清晰度关系 :

分辨率相同 ,尺寸越小 -> 像素密度(PPI)越高 -> 显示效果越细腻。

尺寸相同 ,分辨率越高 -> 显示效果越好。

二、像素点与色彩模式

每个像素点通过 红(R)、绿(G)、蓝(B) 三原色按不同比例混合来呈现丰富的颜色。

|-------------------|-----------------|---------------------------------------------------|
| 色彩模式 | 每像素所占字节 | 颜色深度 / 特点 |
| RGB565 | 2 字节 (16bit) | R: 5bit (0~31), G: 6bit (0~63), B: 5bit (0~31) |
| RGB888 | 3 字节 (24bit) | R, G, B 各占 8bit (0~255),8bit 面板,支持 1670 万色 |
| ARGB8888 | 4 字节 (32bit) | A (透明度), R, G, B 各占 8bit |
| RGB101010 | 4 字节 (32bit) | 10bit 面板,支持 10 亿色(常用于专业视频剪辑) |

三、显存(Framebuffer)与内存映射

1. 什么是显存?

显存(Framebuffer)是 RAM 中专门用来存放图像数据的内存区域。液晶驱动芯片会按固定的刷新率读取该区域的数据,并转换为电信号驱动 LCD 屏点亮对应的像素点。

2. 显存大小计算

对于分辨率为 800×480,采用 ARGB8888 (每像素 4 字节)模式的屏幕:

假设开发板物理内存起始地址为 0x80000000(大小 512MB,范围 0x80000000 - 0xA0000000),我们可以划分 0x89000000 作为显存起始首地址。

四、LCD 点阵寻址与 C 语言指针操作

LCD 的坐标系通常以左上角为原点 ( 0,0 ) ,x 轴向右递增,y 轴向下递增。

坐标定位算法

对于一块800×480的屏幕,如果显存起始地址为 0x89000000,要在坐标 (x,y) 处绘制一个颜色值为 color 的像素点,其物理内存偏移量为:

C 语言代码实现

方法 1:一级指针寻址

#define LCD_BASE 0x89000000

// 将首地址强转为 unsigned int* 指针(ARGB8888)

unsigned int *p = (unsigned int *)LCD_BASE;

// 在 (x, y) 位置画点

void draw_pixel(int x, int y, unsigned int color) {

*(p + y * 800 + x) = color;

}

方法 2:二维数组与数组指针寻址

// 定义数组指针,指向一行包含 800 个元素的数组

unsigned int (*p)800 = (unsigned int (*)800)0x89000000;

// 直接像二维数组一样访问 pyx

void draw_pixel_2d(int x, int y, unsigned int color) {

pyx = color;

}

五、LCD 控制器关键时序信号

LCD 控制器与屏幕之间通过以下几根核心时钟与数据线完成通信:

1.PCLK (Pixel Clock,像素时钟) :同步像素点发送的时间间隔。

2.HSYNC (Horizontal Sync,行/水平同步信号) :指示一行像素数据发送完毕,准备换行。

3.VSYNC (Vertical Sync,帧/垂直同步信号) :指示一帧图像发送完毕,准备绘制下一帧。

4.DE (Data Enable,数据使能信号) :指示当前传输的数据为有效的图像像素数据。

5.R0-R7 / G0-G7 / B0-B7 :并行RGB数据总线。

屏幕刷新率 :即每秒绘制的图像帧数,常见的标准刷新率为 60Hz 。

六、LCD 驱动配置三步法

在嵌入式裸机开发或驱动编写中,配置 LCD 通常包含以下三个步骤:

1.GPIO 引脚复用与电气属性配置 :将芯片对应的引脚配置为 LCD 功能(RGB数据线、PCLK、HSYNC、VSYNC等),并配置驱动能力。

2.配置 LCD 时钟源(PCLK) :根据屏幕 Handbook 计算并设置时钟分频,如将像素时钟配置为 31MHZ。

3.配置 LCD 控制器寄存器 :设置分辨率(如 800×480)、前廊/后廊时间(HBP/HFP/VBP/VFP)、显存首地址(0x89000000)等。

七、总结

掌握 LCD 的显存映射与时序原理是嵌入式图形显示的根基。在后续的开发中,无论是在裸机上绘制线段/图形,还是在 Linux 系统下基于 /dev/fb0 编写 UI,亦或是移植 LVGL 等图形库,底层都离不开对 Framebuffer 的直接或间接操作。

相关推荐
Hespethorn4 小时前
洪泛、路由、网络栈:LoRa 自组网三条路线的设计取舍与量化对比
物联网·嵌入式
用户0510122572967 小时前
RGA(二)——RK3588 的核拓扑与能力差异
linux·嵌入式
用户0510122572967 小时前
RGA(一)——基础知识
linux·嵌入式
用户0510122572967 小时前
RGA(三)——实宽高、虚宽高与对齐约束
linux·嵌入式
燕卫博8 小时前
SSD201 BSP 开发教程
嵌入式·bsp·ssd201
一直C8 小时前
【嵌入式 ARM 驱动开发】PWM 脉宽调制原理与 GT9147 电容触控屏驱动开发详解
嵌入式硬件·lcd·嵌入式·arm汇编·imx6ull·cortex-a7
susplus9 小时前
【ARM 裸机开发 (IMX6ULL-mini)】PWM 背光调节与 GT9147 多点触摸驱动
lcd·arm·多点触控·pwm背光调节
haliu9 小时前
【FHE 同态加密】我们如何实现同态加密推理(十四):为什么 `RESULT=PASS` 不是判据(纯 C11 · 零依赖)
人工智能·嵌入式·c·fhe·推理引擎·c11·边缘推理·同态加密推理
jianqiang.xue21 小时前
【CStackGUI 实战】深色主题终端:app.dark 默认深色 + 顶层命名样式表 + 运行时切换
单片机·嵌入式·cstackgui·c语言gui·可视化拖拽