嵌入式linux驱动之路10: 裸机开发之RGBLCD 显示,RTC 实时时钟

RGBLCD 显示

一般一个 R、G、B 这三部分分别使用 8bit 的数据,那么一个像素点就是 8bit3=24bit,也就是说一个像素点3 个字节,这种像素格式称为 RGB888。如果再加入 8bit 的 Alpha(透明)通道的话一个像素点就是 32bit,也就是 4 个字节,这种像素格式称为 ARGB8888。。I.MX6U-ALPHA支持RGB接口的LCD
在这里插入图片描述
LCD 是怎么扫描显示一帧图像的。一帧图像也是由一行一行组成的。HSYNC 是水平同步信号,也叫做行同步信号,当产生此信号的话就表示开始显示新的一行了,当 VSYNC 信号是垂直同步信号,也叫做帧同步信号,当产生此信号的话就表示开始显示新的一帧图像了.为何还会有黑边呢?这是因为 RGB LCD,屏幕内部是有一个 IC 的,发送一行或者一帧数据给 IC,IC 是需要反应时间的。通过这段反应
时间可以让 IC 识别到一行数据扫描完了,要换行了,或者一帧图像扫描完了,要开始下一帧图像显示了。
一个像素需要 4 个字节的内存来存放像素数据,那么 1024
600 分辨率就需要 10246004=2457600B≈2.4MB 内存。但是 RGB LCD 内部是没有内存的,所以就需要在开发板上的 DDR3 中分出一段内存作为 RGB LCD 屏幕的显存,我们如果要在屏幕上显示什么图像的话直接操作这部分显存即可。
eLCDIF 是 I.MX6U 自带的液晶屏幕接口,用于连接 RGB LCD 接口的屏幕配置步骤如下:
1、初始化 LCD 所使用的 IO
首先肯定是初始化 LCD 所示使用的 IO,将其复用为 eLCDIF 接口 IO。
2、设置 LCD 的像素时钟
查阅所使用的 LCD 屏幕数据手册,或者自己计算出的时钟像素,然后设置 CCM 相应的寄存器(主要是时钟源选择与分频设置)。
3、配置 eLCDIF 接口
设置 LCDIF 的寄存器 CTRL、CTRL1、TRANSFER_COUNT、VDCTRL0~4、CUR_BUF 和NEXT_BUF。根据 LCD 的数据手册设置相应的参数。
4、编写 API 函数
驱动 LCD 屏幕的目的就是显示内容,所以需要编写一些基本的 API 函数,比如画点、画线、画圆函数,字符串显示函数等。画点函数就是将对应的点转化为显存中的地址tftlcd_dev.framebuffer +tftlcd_dev.pixsize * (tftlcd_dev.width * y + x),将对应的颜色赋给该地址中的内容。
附加:个了解一下字符(ASCII 字符集)在 LCD 上的显示原理。要显示字符,我们先要有字符的点阵数据,以某款字模提取软件为例:
在这里插入图片描述
即:从第一列开始向下每取 8 个点作为一个字节,如果最后不足 8 个点就补满 8 位。取模顺序是从高到低,即第一个点作为最高位。如*-------取为 10000000。
在这里插入图片描述
从上到下,从左到右,高位在前。我们按这样的取模方式,每个 16*8 的字符占用 16 个字节。
LCD_R7/G7/B7 则用来设置 LCD 的 ID,由于RGBLCD 没有读写寄存器,也就没有所谓的 ID,这里我们通过在模块上面,控制 R7/G7/B7 的上/下拉,来自定义 LCD 模块的 ID,帮助 MCU 判断当前 LCD 面板的分辨率和相关参数.在未使用 RGBLCD 的时候将 LCD_DATA7、LCD_DATA15 和 LCD_DATA23 这三个线隔离开来,因为 ALIENTEK 的屏幕的 LCD_R7/G7/B7这几个线用来设置 LCD 的 ID,所以这几根线上有上拉/下拉电阻。但是 I.MX6U 的 BOOT 设置
也用到了 LCD_DATA7、LCD_DATA15 和 LCD_DATA23 这三个引脚,所以接上屏幕以后屏幕上的 ID 电阻就会影响到 BOOT 设置,会导致代码无法运行,所以先将其隔离开来,如果要使用 RGB LCD 屏幕的时候再通过 LCD_DE 将其“连接”起来.

RTC 实时时钟

I.MX6U 内部有个 RTC 模块,但是不叫作“RTC”,而是叫做“SNVS“SNVS 直译过来就是安全的非易性存储,SNVS 里面主要是一些低功耗的外设,包括一个安全的实时计数器(RTC)、一个单调计数器(monotonic counter)和一些通用的寄存器,只使用实时计数器(RTC)。SNVS 里面的外设在芯片掉电以后由电池供电继续运行。
其本质就是一个定时器,只要给它提供时钟,它就会一直运行。SRTC 需要外界提供一个 32.768KHz 的时钟,I.MX6U-ALPHA 核心板上的 32.768KHz 的晶振就是提供这个时钟的。寄存器 SNVS_LPSRTCMR 和SNVS_LPSRTCLR 保存着秒数,直接读取这两个寄存
器的值就知道过了多长时间了。一般以 1970 年 1 月 1 日为起点,加上经过的秒数即可得到现在的时间和日期,原理还是很简单的。SRTC 也是带有闹钟功能的,可以在寄存器 SNVS_LPAR 中写入闹钟时间值,当时钟值和闹钟值匹配的时候就会产生闹钟中断。SNVS_SRTCMR 的 bit14:0 这 15 位是 SRTC 计数器的高 15 位。SNVS_SRTCLR 的 bit31:bit15 这 17 位是 SRTC 计数器的低 17 位。
按照上面的解释去读取这两个寄存器就可以得到正确的时间,如果要调整时间的话也是向这两个寄存器写入要设置的时间值对应的秒数就可以了,但是要修改这两个寄存器的话要先关闭 SRTC。
配置步骤如下:
1、初始化 SNVS_SRTC
初始化 SNVS_LP 中的 SRTC。
2、设置 RTC 时间
第一次使用 RTC 肯定要先设置时间。
3、使能 RTC
配置好 RTC 并设置好初始时间以后就可以开启 RTC 了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值