我正在运行一个STM32F072ZB,将其置于待机模式。MCU大部分时间都处于睡眠状态(每1小时唤醒一次以读取传感器)。由于我正在运行看门狗,我使用RTC每25秒钟生成一个警报(看门狗周期约为28秒)。所以当我睡觉1小时时,我会在当前时间加上25秒设置闹钟,然后进入待机模式,被警报唤醒并启动看门狗,然后设置下一个25秒的闹钟,如此循环...
这几乎完美运行,但出于某些原因,有时MCU由于未启动看门狗而重置。这意味着由于某种原因我错过了闹钟。我进行了一些测试,在24小时内发生了6次。
代码如下:
// Set RTC_Alarm
HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
util_msDelay(10);
/*To configure the wake up timer to 25s the WakeUpCounter is set to 0xC738:
Wakeup Time Base = 16 /(32.768 kHz RC) = ~0.49 ms
Wakeup Time = ~0.49 ms * WakeUpCounter
Therefore, with wake-up counter = 0xC738 = 51.000
Wakeup Time = 0.49 ms * 51,000 = ~ 25 sec. */
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0xC738, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
util_msDelay(10);
if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET) {
/* Clear Standby flag */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
}
/* Clear Wake-up timer flag if it is set */
/* Flag will set after exiting from Standby */
if (LL_RTC_IsActiveFlag_WUT(RTC) == 1) {
LL_RTC_ClearFlag_WUT(RTC);
}
/* Clear all related wakeup flags */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
util_msDelay(10);