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 == 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()
.
的 return 值,您就会发现这一点
您可以通过像这样更改条件来修复您的代码。
if(RTC_Alarm_Time.AlarmTime.Hours>23)
原答案(将解决STM32F4上的疑似问题):
我认为您跳过第 0 小时是正确的,因为日期是前一天。你应该忽略 date/day 因为你想要每小时闹钟。我认为您可以通过设置 RTC_Alarm_Time.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY
来忽略 date/day。这应该屏蔽(即忽略)date/day,以便仅根据小时、分钟和秒发出警报。
我正在使用 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
不会回滚到0,因为RTC_Time.Hours
不大于23。那么调用HAL_RTC_SetAlarm_IT()
就会失败因为 Hours
= 24。如果您正在检查 HAL_RTC_SetAlarm_IT()
.
您可以通过像这样更改条件来修复您的代码。
if(RTC_Alarm_Time.AlarmTime.Hours>23)
原答案(将解决STM32F4上的疑似问题):
我认为您跳过第 0 小时是正确的,因为日期是前一天。你应该忽略 date/day 因为你想要每小时闹钟。我认为您可以通过设置 RTC_Alarm_Time.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY
来忽略 date/day。这应该屏蔽(即忽略)date/day,以便仅根据小时、分钟和秒发出警报。