[ARM7] 【自选开发板活动】imxRT1021-你好,RTC

[复制链接]
1179|0
 楼主| yangjiaxu 发表于 2022-9-26 00:38 | 显示全部楼层 |阅读模式
本帖最后由 yangjiaxu 于 2022-9-26 00:42 编辑
#申请原创#
大家好,我是豆包,今天我又叕带来了新的RT1021的小工程啦,从题目可以看出,今天要玩耍的主题就是RTC了,说到RTC想必大家应该不会陌生,它是实时时钟的英文缩写,是日常生活应用之中,最为广泛的时钟获取的方式之一,它可以为单片机提供精准的实时时间,可以让系统实现一些计时,闹钟,定时唤醒等等功能,让系统可以多样化的运行。接下来,我们就基于imRT1021开发板实现RTC实时时钟的功能。从开发板中可以看到,标注的是RTC的电池供电和RTC晶振部分,因为imRT1021是有内置的RTC功能的,所以这样在时钟要求不高,应用环境良好的情况下可以直接使用内置的RTC来降低一些硬件成本。

硬件部分我们准备完成,接下来我们准备软件部分。首先我们要准备一个工程,自己创建或者找个好用的工程都是可以的,本次我们选择上次的点灯例程。接下来需要添加两个文件,是关于RTC的库文件“fsl_snvs_hp.c和fsl_snvs_hp.h”接下来就是业务文件了,这个也是需要自己编写的,本次我通过野火的RT1052的demo进行修改的,这样能快速的实现RTC的功能。主要RTC初始化代码如下:
  1. void RTC_Config(void)

  2. {

  3.        /*------------------------------第一部分----------------------------*/

  4.               snvs_hp_rtc_datetime_t rtcDate;/* 定义 rtc 日期配置结构体 */

  5.     snvs_hp_rtc_config_t snvsRtcConfig;/* 定义 snvsRtc 配置结构体 */



  6.     /* 初始化SNVS */

  7.     /*

  8.      * snvsConfig->rtccalenable = false;

  9.      * snvsConfig->rtccalvalue = 0U;

  10.      * snvsConfig->srtccalenable = false;

  11.      * snvsConfig->srtccalvalue = 0U;

  12.      * snvsConfig->PIFreq = 0U;

  13.      */

  14.     /* 获取默认配置 */

  15.     SNVS_HP_RTC_GetDefaultConfig(&snvsRtcConfig);

  16.     /* 初始化RTC */

  17.     SNVS_HP_RTC_Init(SNVS, &snvsRtcConfig);



  18.        /*------------------------------第二部分----------------------------*/

  19.     /* 设置日期 */

  20.     rtcDate.year = YEAR;

  21.     rtcDate.month = MONTH;

  22.     rtcDate.day = DATE;

  23.     rtcDate.hour = HOURS;

  24.     rtcDate.minute = MINUTES;

  25.     rtcDate.second = SECONDS;



  26.     /* 将RTC时间设置为默认时间和日期并启动RTC */

  27.     SNVS_HP_RTC_SetDatetime(SNVS, &rtcDate);

  28.     SNVS_HP_RTC_StartTimer(SNVS);

  29. }

在YEAR,MONTH等此处是可以定义硬件初始化的时间,就是每次硬件开机的时候都会配置一下该时间,然后从这个时间开始进行计时。接下来配置RTC中断,需要将kSNVS_RTC_PeriodicInterrupt定义为1;
  1. void EXAMPLE_SNVS_IRQHandler(void)

  2. {

  3.          /* 判断中断条件是否满足 */

  4.     if (SNVS_HP_RTC_GetStatusFlags(SNVS) & kSNVS_RTC_AlarmInterruptFlag)

  5.     {

  6.                        /* 设置报警中断标志 */

  7.         busyWait = false;



  8.         /* 清除报警标志 */

  9.         SNVS_HP_RTC_ClearStatusFlags(SNVS, kSNVS_RTC_PeriodicInterrupt);

  10.     }

  11.     /* 添加为ARM勘误表838869,影响Cortex-M4,Cortex-M4F存储立即重叠

  12.        异常返回操作可能会导致错误的中断 */

  13. #if defined __CORTEX_M && (__CORTEX_M == 4U)

  14.     __DSB();

  15. #endif

  16. }

到此,RTC的初始配置就完成了,但是还没有结束,需要将RTC获取到的时间读出来并使用串口打印出来,这样方便我们对这个时间的使用。
  1. void RTC_TimeAndDate_Show(void)

  2. {

  3.     /*------------------------------第一部分----------------------------*/

  4.     uint8_t Rtctmp=0;//定义临时变量用于刷新屏幕显示

  5.     char LCDTemp[100];//定义字符串缓存数组

  6.     snvs_hp_rtc_datetime_t rtcDate;//定义全局RTC时间结构体  

  7.     while(1)

  8.               {

  9.     /*------------------------------第二部分----------------------------*/

  10.         /* 获取日期 */

  11.         SNVS_HP_RTC_GetDatetime(SNVS, &rtcDate);

  12.         /* 每秒打印一次 */

  13.         if(Rtctmp != rtcDate.second)

  14.         {

  15.     /*------------------------------第三部分----------------------------*/

  16.       

  17.             /* 打印日期 */

  18.             PRINTF("The Date :  %0.2d年 - %0.2d月 - %0.2d日\r\n",

  19.             rtcDate.year,

  20.             rtcDate.month,

  21.             rtcDate.day

  22.             );

  23.             /* 打印时间 */

  24.             PRINTF("The Time :  %0.2d:%0.2d:%0.2d \r\n\r\n",

  25.             rtcDate.hour,

  26.             rtcDate.minute,

  27.             rtcDate.second);      

  28.         }

  29.         Rtctmp = rtcDate.second;

  30.     }

  31. }

主函数直接在while(1)中调用RTC_TimeAndDate_Show();就可以了。
之后我们就可以编译和烧录了,烧录完成之后就可以打开串口看功能是否正常,如下图所示。
至此,RTC演示就结束了,通过这几天对imRT系列开发板的学习,发现还是很容易上手的,资料可以参考imRT1052的,还算很方便。
最后,感谢21ic举办的【自选开发板活动】,下帖继续~


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:擅长电路设计、物联网产品开发、射频产品开发,喜欢打篮球,技术交流,欢迎各位来聊~

794

主题

3350

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部