|
Learn-lumit-Step-20 : 实时时钟实验
++++++++++++++++++++++++++++++++++++++++++++++++++++++
实时时钟的代码相比之前实现的设备驱动在文件命名上有一点点小的改动,主要是
因为 rtc 的底层驱动其实是 iic 的 iic_driver.c ,但为了和实际情况相一致,我们
没有采用 rtc_driver.c[h] 的文件命名,用户接口层则还是采用了 rtc_api.c[h] 。
除此之外,iic 的驱动需要借助中断来完成,因此我们引入了 irq 目录并使用了
其中的 request_irq 和 free_irq 接口。为了便于将获得的时钟参数信息显示出来,
我们还引入了 uart 目录,通过 uart0 将当前的时钟信息字符串显示给用户。
目前 rtc 实现的用户接口最重要的是如下这两个:
void rtc_get(int *year, int *month, int *day, int *hour, int *min, int *sec);
void rtc_set(int year, int month, int day, int hour, int min, int sec);
其中一个完成获取实时时钟相关信息,另一个完成设置实时时钟相关数据。
因为所有的时钟信息在 PCF8563 内部采用的是 BCD 码,因此要对其进行加减操作,
必须先进行转化。为此,我们在代码中定义了如下两个宏:
#define num2bcd(x) (( (x) / 10 ) * 0x10 + (x) % 10)
#define bcd2num(x) (( (x) / 0x10 ) * 10 + (x) % 0x10)
前者完成从十进制数表示到 bcd 数的转换;后者完成从 bcd 数表示到十进制表示。
举例来说,如果要设置月份为 11 月份,则我们传递给 rtc_set 的参数是 month = 11 ,
其中 month 是一个十进制表示,在 iic_write_int 中需要写入的是一个bcd表示的 0x11,
也就是 month 的 低4个bit为1,高4个bit也为1才对(即 0b 0001 0001),这样就需要把
11 转换为 0x11 ,即 num2bcd(11)。
同理,通过 iic_read_int 读出的时间信息也是用 bcd 码表示的,需要通过 bcd2num
转换成真正的十进制数才能进行加减操作。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|