gpt4 book ai didi

c - RTC 中断周期性丢失

转载 作者:行者123 更新时间:2023-12-04 01:05:19 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com