前言
相关说明:
开发板:CT117E-M4(STM32G431RB 蓝桥杯嵌入式比赛板)
开发环境: CubeMX+Keil5
CubeMX配置:
一、CubeMX配置(RTC相关)
1.使能RTC:
三个步骤(对应图中2、3、4):
a.使能RTC时钟源。
b.使能日历(使能日历才能用闹钟)。
c.使能闹钟。
2.进制配置:
有两个选项,Hourformat24对应24进制,Hourformat12对应12进制。
3.初始时间配置:
DataFormat选项分别为BIN(时间为10进制)BCD(时间为16进制)
Hours为初始时间的小时
Minutes为初始时间的分钟
Seconds为初始时间的秒数
时间进制不同体现在代码里面的区别如下,选择了16进制后续也可以使用10进制数来配置时间或闹钟,因为配置时可以重新选择时间进制。
4.日期配置:
配置秒中断可以不用关心日期的配置,初始值即可。
5.闹钟配置:
分为两步:
1.初始时直接将闹钟时间配置为初始时间(23:55:55)的下一秒(23:55:56)。
2.使能闹钟触发忽略日期,忽略小时,忽略分钟,但不忽略秒。这样每次中断发生只是根据秒数决定。
二、代码
共三个函数:
1.GET_Time()
2.SET_Alarm()
3.HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
1.获取时间
获取时间时需注意,只调用HAL_RTC_GetTime()的话会出现闹钟不会继续走的问题(希望懂的大佬可以解释下原理,十分感激),因此需要在调用HAL_RTC_GetTime()后再调用HAL_RTC_GetDate(),即使用不到它。
RTC_TimeTypeDef Now_Time;//定义时间结构体
RTC_DateTypeDef Now_Date;//定义日期结构体
void GET_Time()//获取当前时间
{
HAL_RTC_GetTime(&hrtc,&Now_Time,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc,&Now_Date,RTC_FORMAT_BIN);
}
2.设置闹钟
首先将生成代码里面的闹钟结构体定义copy一下,定义为全局变量,再将生成的那句删除(用MX重新配置其他东西的时候,注意再次删除生成的代码!!!),定义为全局变量目的是用到上面配置好的闹钟(忽略日期,忽略小时……)。
然后在函数里面,将当前时间的秒数+1后的值赋值给闹钟结构体的秒数!(函数中的第一行代码);然后判断是否为60,为60则重新赋值0!;然后调用函数HAL_RTC_SetAlarm_IT()重新配置闹钟即可!
void SET_Alarm()
{
sAlarm.AlarmTime.Seconds = Now_Time.Seconds+1;
if(sAlarm.AlarmTime.Seconds==60)sAlarm.AlarmTime.Seconds=0;
HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);
}
3.闹钟中断函数
在到达原先配置好的中断时间后(23:55:56),会进入闹钟中断函数,在中断函数里做两件事:
1.获取当前时间GET_Time()。
2.设置下一秒钟的中断SET_Alarm()。
这样每次发生中断时都将重新配置闹钟,并在下一秒时再次发生中断,如此反复,即可达到秒中断的效果,再根据自己的需求在中断函数中添加代码(LCD更新时间,串口打印时间)。
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
GET_Time();
printf("%02d:%02d:%02d\n",Now_Time.Hours,Now_Time.Minutes,Now_Time.Seconds);//这句代码只是测试
SET_Alarm();
}
拓展(蓝桥杯第九届省赛真题):
根据EEPROM中存储的时间来配置闹钟分为三步:
1.读取在EEPROM中存储的时间,保存在时间结构体中。
2.调用Set_Time函数设置当前时间。
3.配置下一秒的闹钟。
三、实验结果
文章来源:https://www.toymoban.com/news/detail-402338.html
总结
以上就是全部内容,如有错误请批评指正。文章来源地址https://www.toymoban.com/news/detail-402338.html
到了这里,关于STM32RTC秒中断--基于HAL库(一文看懂如何配置并使用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!