本实验的源码工程在开发板光盘资料的:i.MX6UL终结者光盘资料\04_裸机例程源码\15_rtc 目录下。我们在Ubuntu系统下使用命令“mkdir 15_rtc”建立“15_rtc”文件夹,如图1所示:
然后使用“cd 15_rtc”命令进入到15_rtc文件夹,如图 2所示:
然后使用命令“cp -r …/14_lcd/* ./”将上一章试验中的所有内容拷贝到刚刚新建的“15_rtc”里面,如图 3所示:
首先我们需要添加SNVS_Type结构体定义,打开“core/MCIMX6Y2.h”文件,在36308行添加下面的代码:
36308 /** SNVS - Register Layout Typedef */
36309 /* zuozhongkai 2018/12/13 */
36310 typedef struct {
36311 __IO uint32_t HPLR; /**< SNVS_HP Lock register, offset: 0x0 */
36312 __IO uint32_t HPCOMR; /**< SNVS_HP Command register, offset: 0x4 */
36313 __IO uint32_t HPCR; /**< SNVS_HP Control register, offset: 0x8 */
36314 __IO uint32_t HPSICR; /**< SNVS_HP Control register, offset: 0x8 */
36315 __IO uint32_t HPSVCR;
36316 __IO uint32_t HPSR;
36317 __IO uint32_t HPSVSR;
36318 __IO uint32_t HPHACIVR;
36319 __IO uint32_t HPHACR;
36320 __IO uint32_t HPRTCMR;
36321 __IO uint32_t HPRTCLR;
36322 __IO uint32_t HPTAMR;
36323 __IO uint32_t HPTALR;
36324 __IO uint32_t LPLR;
36325 __IO uint32_t LPCR;
36326 __IO uint32_t LPMKCR;
36327 __IO uint32_t LPSVCR;
36328 __IO uint32_t LPTGFCR;
36329 __IO uint32_t LPTDCR;
36330 __IO uint32_t LPSR;
36331 __IO uint32_t LPSRTCMR;
36332 __IO uint32_t LPSRTCLR;
36333 __IO uint32_t LPTAR;
36334 __IO uint32_t LPSMCMR;
36335 __IO uint32_t LPSMCLR;
36336 }SNVS_Type;
然后在drivers目录下建立rtc文件夹,用来保存rtc的驱动文件,然后在“drivers/rtc”目录中新建rtc.h和rtc.c两个文件,然后在rtc.h文件输入下面的代码:
1 #ifndef _BSP_RTC_H
2 #define _BSP_RTC_H
3
4 #include "imx6ul.h"
5
6 /* 相关宏定义 */
7 #define SECONDS_IN_A_DAY (86400) /* 一天86400秒 */
8 #define SECONDS_IN_A_HOUR (3600) /* 一个小时3600秒 */
9 #define SECONDS_IN_A_MINUTE (60) /* 一分钟60秒 */
10 #define DAYS_IN_A_YEAR (365) /* 一年365天 */
11 #define YEAR_RANGE_START (1970) /* 开始年份1970年 */
12 #define YEAR_RANGE_END (2099) /* 结束年份2099年 */
13
14
15 /* 时间日期结构体 */
16 struct rtc_datetime
17 {
18 unsigned short year; /* 范围为:1970 ~ 2099 */
19 unsigned char month; /* 范围为:1 ~ 12 */
20 unsigned char day; /* 范围为:1 ~ 31 (不同的月,天数不同).*/
21 unsigned char hour; /* 范围为:0 ~ 23 */
22 unsigned char minute; /* 范围为:0 ~ 59 */
23 unsigned char second; /* 范围为:0 ~ 59 */
24 };
25
26
27 /* 函数声明 */
28 void rtc_init(void);
29 void rtc_enable(void);
30 void rtc_disable(void);
31 unsigned int rtc_coverdate_to_seconds(struct rtc_datetime *datetime);
32 unsigned int rtc_getseconds(void);
33 void rtc_setdatetime(struct rtc_datetime *datetime);
34 void rtc_getdatetime(struct rtc_datetime *datetime)
35 ;
36
37 #endif
第7行到第12行定义了一些和时间有关的宏,比如一天有多少秒,一小时有多少秒,一年有多少天等等。第16行定义了一个结构体,用来描述时间日期,然后28行到34行是一些函数的声明。
然后打开rtc.c文件,在里面输入下面的代码:
1 #include "rtc.h"
2 #include "stdio.h"
3
4 /*
5 * 描述:初始化RTC
6 */
7 void rtc_init(void)
8 {
9 /*
10 * 设置HPCOMR寄存器
11 * bit[31] 1 : 允许访问SNVS寄存器,一定要置1
12 * bit[8] 1 : 此位置1,需要签署NDA协议才能看到此位的详细说明,
13 * 这里不置1也没问题
14 */
15 SNVS->HPCOMR |= (1 << 31) | (1 << 8);
16
17 #if 0
18 struct rtc_datetime rtcdate;
19
20 rtcdate.year = 2018U;
21 rtcdate.month = 12U;
22 rtcdate.<