0

我正在使用 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 日期仍然是前一天。有没有人有任何代码示例,我可以使这个独立于日期或任何其他方式。谢谢你。

4

1 回答 1

0

更新答案:

您的代码中有一个错误。您的代码设置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和不大于 23时,RTC_Alarm_Time.AlarmTime.Hours不会翻转为 0。然后调用将失败,因为= 24。如果您正在检查 的返回值,您会发现这一点。RTC_Time.HoursHAL_RTC_SetAlarm_IT()HoursHAL_RTC_SetAlarm_IT()

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

if(RTC_Alarm_Time.AlarmTime.Hours>23)

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

我认为您跳过 0 小时是对的,因为日期是前一天。您应该忽略日期/日期,因为您需要每小时警报。而且我认为您可以通过设置忽略日期/日期RTC_Alarm_Time.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY。这应该屏蔽(即忽略)日期/日期,以便仅根据小时、分钟和秒发生警报。

于 2021-03-02T21:46:40.130 回答