yangjiaxu 发表于 2022-9-26 00:38

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

本帖最后由 yangjiaxu 于 2022-9-26 00:42 编辑

#申请原创# @21小跑堂 @21ic小管家 大家好,我是豆包,今天我又叕带来了新的RT1021的小工程啦,从题目可以看出,今天要玩耍的主题就是RTC了,说到RTC想必大家应该不会陌生,它是实时时钟的英文缩写,是日常生活应用之中,最为广泛的时钟获取的方式之一,它可以为单片机提供精准的实时时间,可以让系统实现一些计时,闹钟,定时唤醒等等功能,让系统可以多样化的运行。接下来,我们就基于imRT1021开发板实现RTC实时时钟的功能。从开发板中可以看到,标注的是RTC的电池供电和RTC晶振部分,因为imRT1021是有内置的RTC功能的,所以这样在时钟要求不高,应用环境良好的情况下可以直接使用内置的RTC来降低一些硬件成本。
硬件部分我们准备完成,接下来我们准备软件部分。首先我们要准备一个工程,自己创建或者找个好用的工程都是可以的,本次我们选择上次的点灯例程。接下来需要添加两个文件,是关于RTC的库文件“fsl_snvs_hp.c和fsl_snvs_hp.h”接下来就是业务文件了,这个也是需要自己编写的,本次我通过野火的RT1052的demo进行修改的,这样能快速的实现RTC的功能。主要RTC初始化代码如下:void RTC_Config(void)

{

       /*------------------------------第一部分----------------------------*/

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

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



    /* 初始化SNVS */

    /*

   * snvsConfig->rtccalenable = false;

   * snvsConfig->rtccalvalue = 0U;

   * snvsConfig->srtccalenable = false;

   * snvsConfig->srtccalvalue = 0U;

   * snvsConfig->PIFreq = 0U;

   */

    /* 获取默认配置 */

    SNVS_HP_RTC_GetDefaultConfig(&snvsRtcConfig);

    /* 初始化RTC */

    SNVS_HP_RTC_Init(SNVS, &snvsRtcConfig);



       /*------------------------------第二部分----------------------------*/

    /* 设置日期 */

    rtcDate.year = YEAR;

    rtcDate.month = MONTH;

    rtcDate.day = DATE;

    rtcDate.hour = HOURS;

    rtcDate.minute = MINUTES;

    rtcDate.second = SECONDS;



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

    SNVS_HP_RTC_SetDatetime(SNVS, &rtcDate);

    SNVS_HP_RTC_StartTimer(SNVS);

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

{

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

    if (SNVS_HP_RTC_GetStatusFlags(SNVS) & kSNVS_RTC_AlarmInterruptFlag)

    {

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

      busyWait = false;



      /* 清除报警标志 */

      SNVS_HP_RTC_ClearStatusFlags(SNVS, kSNVS_RTC_PeriodicInterrupt);

    }

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

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

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

    __DSB();

#endif

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

{

    /*------------------------------第一部分----------------------------*/

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

    char LCDTemp;//定义字符串缓存数组

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

    while(1)

            {

    /*------------------------------第二部分----------------------------*/

      /* 获取日期 */

      SNVS_HP_RTC_GetDatetime(SNVS, &rtcDate);

      /* 每秒打印一次 */

      if(Rtctmp != rtcDate.second)

      {

    /*------------------------------第三部分----------------------------*/

      

            /* 打印日期 */

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

            rtcDate.year,

            rtcDate.month,

            rtcDate.day

            );

            /* 打印时间 */

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

            rtcDate.hour,

            rtcDate.minute,

            rtcDate.second);      

      }

      Rtctmp = rtcDate.second;

    }

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

页: [1]
查看完整版本: 【自选开发板活动】imxRT1021-你好,RTC