RTC 中断周期性丢失

Adi*_*diT 4 c embedded interrupt stm32

我正在将 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);
Run Code Online (Sandbox Code Playgroud)

Cli*_*ord 5

STM32 IWDG 由标称频率为 40KHz 的 LSI 振荡器运行,最大标称超时约为 26.2 秒,但 RC 振荡器既不准确也不稳定,频率范围为 30KHz 至 50KHz,时序变化范围为 19.65 至 32.75 秒。

如果 RTC 也由 LSI 驱动,那么这不是问题,但如果您从 LSE 驱动它,则无法保证您的看门狗不会在 RTC 警报之前关闭,然后您应该将 RTC 警报设置为小于 19秒。

也就是说,如果您从 LSI 运行 RTC,那么在标称 40KHz 下计算 25 秒是不正确的,51000 只是 20.4 秒。这是模棱两可的,因为评论表明您正在使用 32768Hz 的 LSE,但它也说它是一个 RC 振荡器,而我期望的是晶体或陶瓷振荡器。