stm32f1 RTC闹钟

stm32f1 RTC Alarm

我正在使用 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 == 23RTC_Alarm_Time.AlarmTime.Hours = 24RTC_Alarm_Time.AlarmTime.Hours不会回滚到0,因为RTC_Time.Hours不大于23。那么调用HAL_RTC_SetAlarm_IT()就会失败因为 Hours = 24。如果您正在检查 HAL_RTC_SetAlarm_IT().

的 return 值,您就会发现这一点

您可以通过像这样更改条件来修复您的代码。

if(RTC_Alarm_Time.AlarmTime.Hours>23)

原答案(将解决STM32F4上的疑似问题):

我认为您跳过第 0 小时是正确的,因为日期是前一天。你应该忽略 date/day 因为你想要每小时闹钟。我认为您可以通过设置 RTC_Alarm_Time.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY 来忽略 date/day。这应该屏蔽(即忽略)date/day,以便仅根据小时、分钟和秒发出警报。