stm32f1 RTC 报警

问题描述

我正在使用 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 不会因为 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 来忽略日期/天。这应该屏蔽(即忽略)日期/日期,以便仅根据小时、分钟和秒发出警报。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...