问题描述
我正在使用 stm32f103RBT6,我想通过使用下面的代码每隔一小时设置一次 RTC 警报事件
RTC_Alarm_Time.Alarm = 1;
HAL_RTC_GetTime(&hrtc,&RTC_Time,RTC_FORMAT_BIN);
RTC_Alarm_Time.AlarmTime.Hours=RTC_Time.Hours+1;
if(RTC_Alarm_Time.AlarmTime.Hours>23)
{
RTC_Alarm_Time.AlarmTime.Hours=0;
}
RTC_Alarm_Time.AlarmTime.Minutes=RTC_Time.Minutes;
RTC_Alarm_Time.AlarmTime.Seconds=RTC_Time.Seconds;
HAL_RTC_SetAlarm_IT(&hrtc,&RTC_Alarm_Time,RTC_FORMAT_BIN);
我的问题是在 23 小时后警报在 1 小时出现并且它跳过了 0 小时。 我认为这是因为当我将闹钟时间设置为 0 RTC 日期仍然是前一天。 有没有人有任何代码示例,我可以使这个独立于日期或任何其他方式。 谢谢。
解决方法
更新答案:
您的代码中存在错误。您的代码设置 RTC_Alarm_Time.AlarmTime.Hours=RTC_Time.Hours+1
,然后使用 if(RTC_Time.Hours>23)
检查小时翻转。请注意,RTC_Time.Hours
没有增加,而是 RTC_Alarm_Time.AlarmTime.Hours
增加了。因此,当 RTC_Time.Hours == 23
、RTC_Alarm_Time.AlarmTime.Hours = 24
和 RTC_Alarm_Time.AlarmTime.Hours
不会因为 RTC_Time.Hours
不大于 23 而翻转为 0 时。那么对 HAL_RTC_SetAlarm_IT()
的调用将失败因为 Hours
= 24。如果您检查 HAL_RTC_SetAlarm_IT()
的返回值,您会发现这一点。
您可以通过像这样更改条件来修复您的代码。
if(RTC_Alarm_Time.AlarmTime.Hours>23)
原始答案(将解决 STM32F4 上的可疑问题):
我认为您跳过 0 小时是正确的,因为日期是前一天。您应该忽略日期/天,因为您需要每小时闹钟。而且我认为您可以通过设置 RTC_Alarm_Time.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY
来忽略日期/天。这应该屏蔽(即忽略)日期/日期,以便仅根据小时、分钟和秒发出警报。