i.MX6ULL终结者SRTC实时时钟例程程序设计

本实验的源码工程在开发板光盘资料的:i.MX6UL终结者光盘资料\04_裸机例程源码\15_rtc 目录下。我们在Ubuntu系统下使用命令“mkdir 15_rtc”建立“15_rtc”文件夹,如图1所示:
在这里插入图片描述

图 1

然后使用“cd 15_rtc”命令进入到15_rtc文件夹,如图 2所示:
在这里插入图片描述

图 2

然后使用命令“cp -r …/14_lcd/* ./”将上一章试验中的所有内容拷贝到刚刚新建的“15_rtc”里面,如图 3所示:
在这里插入图片描述

图 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.<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值