STM32RTC秒中断--基于HAL库(一文看懂如何配置并使用)

文章目录

  • 前言
  • 一、CubeMX配置(RTC相关)
    • 1.使能RTC:
    • 2.进制配置:
    • 3.初始时间配置:
    • 4.日期配置:
    • 5.闹钟配置:
  • 二、代码
    • 1.获取时间
    • 2.设置闹钟
    • 3.闹钟中断函数
  • 三、实验结果
  • 总结


前言

相关说明:

开发板:CT117E-M4(STM32G431RB 蓝桥杯嵌入式比赛板)
开发环境: CubeMX+Keil5


CubeMX配置:

一、CubeMX配置(RTC相关)

1.使能RTC:

三个步骤(对应图中2、3、4):
a.使能RTC时钟源
b.使能日历(使能日历才能用闹钟)。
c.使能闹钟

STM32RTC秒中断--基于HAL库(一文看懂如何配置并使用)_第1张图片

2.进制配置:

有两个选项,Hourformat24对应24进制,Hourformat12对应12进制。
STM32RTC秒中断--基于HAL库(一文看懂如何配置并使用)_第2张图片

3.初始时间配置:

DataFormat选项分别为BIN(时间为10进制)BCD(时间为16进制)
Hours为初始时间的小时
Minutes为初始时间的分钟
Seconds为初始时间的秒数
STM32RTC秒中断--基于HAL库(一文看懂如何配置并使用)_第3张图片
时间进制不同体现在代码里面的区别如下,选择了16进制后续也可以使用10进制数来配置时间或闹钟,因为配置时可以重新选择时间进制
STM32RTC秒中断--基于HAL库(一文看懂如何配置并使用)_第4张图片STM32RTC秒中断--基于HAL库(一文看懂如何配置并使用)_第5张图片

4.日期配置:

配置秒中断可以不用关心日期的配置,初始值即可。
STM32RTC秒中断--基于HAL库(一文看懂如何配置并使用)_第6张图片

5.闹钟配置:

分为两步:
1.初始时直接将闹钟时间配置为初始时间(23:55:55)的下一秒(23:55:56)。
2.使能闹钟触发忽略日期忽略小时忽略分钟,但不忽略秒。这样每次中断发生只是根据秒数决定。STM32RTC秒中断--基于HAL库(一文看懂如何配置并使用)_第7张图片

二、代码

三个函数
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重新配置其他东西的时候,注意再次删除生成的代码!!!),定义为全局变量目的是用到上面配置好的闹钟(忽略日期,忽略小时……)。
STM32RTC秒中断--基于HAL库(一文看懂如何配置并使用)_第8张图片
然后在函数里面,将当前时间的秒数+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.配置下一秒的闹钟

三、实验结果

STM32RTC秒中断--基于HAL库(一文看懂如何配置并使用)_第9张图片


总结

以上就是全部内容,如有错误请批评指正。

你可能感兴趣的:(STM32G431RB,stm32,单片机,蓝桥杯)