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