云计算百科
云计算领域专业知识百科平台

ARM学习(6)

I.MX6ULL裸机学习——LCD液晶屏

前面学习了 UART 串口通信,接下来开始学习 LCD。LCD 主要用于显示文字、图片以及一些运行数据。

一、LCD是什么

LCD 就是液晶显示屏,我们平时使用的显示器、手机屏幕等都属于显示设备。

从使用的角度来说,我们不需要去研究 LCD 内部液晶分子的具体工作原理,重点关注几个参数就可以。

1. 分辨率

LCD 是由一个一个像素点组成的。

比如常见的 1920×1080,表示:

横向:1920 个像素
纵向:1080 个像素

所以总像素数量就是:

1920 × 1080 = 2073600

分辨率越高,在屏幕尺寸相同的情况下,显示出来的图像通常越细腻。


二、RGB

LCD 中一个像素通常由 R、G、B 三种颜色组成:

R:红色
G:绿色
B:蓝色

通过这三种颜色不同的组合,就可以显示出各种颜色。

我们使用的 RGB LCD,本质上就是给 LCD 不断提供 RGB 像素数据。


三、LCD为什么需要时序

RGB LCD 不只是把 RGB 数据直接送过去就可以了,还需要一些控制信号。

主要包括:

CLK
HSYNC
VSYNC
EN
RGB数据

其中:

  • CLK:像素时钟

  • HSYNC:行同步信号

  • VSYNC:帧同步信号

  • EN:数据有效信号

  • RGB:实际的像素数据

可以简单理解成:

一行一行地发送像素数据
↓
发送完一行
↓
开始下一行
↓
发送完整个屏幕
↓
开始下一帧


四、LCD的行时序

一行 LCD 数据并不是只有有效的像素数据,中间还存在一些等待时间。

主要有:

HSPW
HBP
HOZVAL
HFP

其中:

  • HSPW:行同步信号宽度

  • HBP:行同步后肩

  • HOZVAL:一行有效像素的数量

  • HFP:行同步前肩

所以一行所需要的时间为:

HSPW + HBP + HOZVAL + HFP

例如屏幕分辨率为 1024×600,那么:

HOZVAL = 1024


五、LCD的帧时序

一帧就是完整显示一次整个屏幕。

帧时序主要包括:

VSPW
VBP
LINE
VFP

其中:

  • VSPW:帧同步信号宽度

  • VBP:帧同步后肩

  • LINE:一帧有效显示的行数

  • VFP:帧同步前肩

如果屏幕分辨率为 1024×600,那么:

LINE = 600

一帧所需要的时间就是:

VSPW + VBP + LINE + VFP

因此配置 RGB LCD 时,需要知道这些参数:

HOZVAL
LINE
HBP
HSPW
HFP
VSPW
VBP
VFP

这些参数一般可以从 LCD 屏幕的数据手册中找到。


六、I.MX6ULL如何驱动LCD

I.MX6ULL 内部提供了 eLCDIF 控制器,可以专门用来驱动 RGB LCD。

它负责按照我们设置好的时序,把显存中的数据发送给 LCD。

LCD 本身没有显存,所以我们需要在开发板的 DDR3 中划出一块内存作为 LCD 的显存。

比如使用 ARGB8888,一个像素需要 4 个字节。

假设屏幕是 800×480:

800 × 480 × 4
= 1536000 Bytes
≈ 1.5MB

然后把这块内存的首地址设置到 LCDIF 的当前缓冲寄存器中,LCDIF 就会自动读取这块内存的数据并显示出来。


七、LCD的初始化流程

根据这次实验,LCD 的初始化可以简单分成三步:

初始化IO引脚
↓
初始化LCD像素时钟
↓
初始化eLCDIF
↓
设置显存
↓
开始显示

1. 初始化IO

需要把 LCD 使用到的引脚配置成 LCDIF 功能。

除了 RGB 数据线,还包括:

EN
HSYNC
VSYNC
CLK

另外还需要控制 LCD 背光。

实验中使用:

GPIO1_IO08

作为 LCD 背光控制信号,设置为高电平后 LCD 才能正常“亮起来”。

2. 初始化像素时钟

LCD 对像素时钟有要求,需要根据 LCD 的时序参数配置对应的时钟。

本实验使用的 LCD 像素时钟配置为:

31.5MHz

3. 初始化eLCDIF

最后就是配置 I.MX6ULL 的 eLCDIF。

主要就是根据 LCD 的分辨率和时序参数,对 LCDIF 相关寄存器进行配置。

配置完成以后,LCDIF 就可以按照设定的时序不断读取显存中的数据并发送给 LCD。


八、显存

LCD 显示什么内容,实际上就是由显存中的数据决定的。

可以简单理解成:

显存
↓
LCDIF
↓
LCD
↓
显示图像

比如我们想让屏幕显示一个红色的点,只需要修改对应像素在显存中的数据即可。

LCDIF 还有两个缓冲寄存器:

LCDIF_CUR_BUF
LCDIF_NEXT_BUF

分别表示当前显示缓冲和下一帧显示缓冲。

如果两个地址设置成同一个地址,修改显存以后可以直接显示。

如果使用两个不同的缓冲区,就可以实现双缓冲,连续显示图像时可以减少画面撕裂。


九、附图片参考

赞(0)
未经允许不得转载:网硕互联帮助中心 » ARM学习(6)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!