打印
[ARM7]

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

[复制链接]
933|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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初始化代码如下:
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[100];//定义字符串缓存数组

    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举办的【自选开发板活动】,下帖继续~


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

624

主题

2596

帖子

5

粉丝