我使用的是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时,日期仍然是前一天。有没有人有任何代码的例子,我可以使它独立于日期或任何其他方式。谢谢你。
发布于 2021-03-02 21:46:40
最新答案:
您的代码中有一个bug。您的代码设置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不会被滚动到0时,因为RTC_Time.Hours不大于23。那么对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来忽略日期/日。这应该掩盖(即忽略)日期/日,以便只根据时间、分钟和秒发出警报。
https://stackoverflow.com/questions/66446947
复制相似问题