c - RTC 中断周期性丢失

标签 c embedded stm32 interrupt

我正在将 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);

最佳答案

STM32 IWDG 从标称 40KHz 的 LSI 振荡器运行,最大标称超时约为 26.2 秒,但是 RC 振荡器既不准确也不稳定,可以从 30KHz 变化到 50KHz,时序变化从 19.65 秒到 32.75 秒。
如果 RTC 也是从 LSI 驱动的,那么这不是问题,但如果您是从 LSE 驱动它,则不能保证您的看门狗不会在 RTC 警报之前关闭,然后您应该将 RTC 警报设置为小于 19秒。
也就是说,如果您从 LSI 运行 RTC,那么您的 25 秒计算在名义上是 40KHz 时是不正确的,51000 将只是 20.4 秒。这是模棱两可的,因为评论表明您使用的是 32768Hz 的 LSE,但它也说它是一个 RC 振荡器,我希望使用晶体或陶瓷振荡器。

关于c - RTC 中断周期性丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66693827/

相关文章:

c - 设置 uint32 key 位置并将其写入文件时遇到问题

embedded - 用于嵌入式编程的微 Controller

unit-testing - 嵌入式C++系统中的持续集成/单元测试

c++ - 将一个文件 ID 映射到另一个文件 ID 的最有效方法

c - mbedTLS sha256 的性能现实吗?

gcc - 真正最小的STM32应用:链接器故障

c 多个文件描述符

c - 循环链表中两个节点之间的距离

c++ - 通过 C 绑定(bind)公开 C++ 库

microcontroller - STMicro 是否错误地解释了术语 "shadow register"?