【问题标题】:RTC interrupt missing periodicallyRTC 中断周期性丢失
【发布时间】:2021-06-16 00:22:06
【问题描述】:

我正在将 STM32F072ZB 运行到待机模式。 MCU 大部分时间都在休眠(每 1 小时醒来一次以读取传感器)。由于我正在运行看门狗,因此我使用 RTC 每 25 秒生成一次警报(看门狗周期约为 28 秒)。所以当我睡1小时时,我将闹钟设置为现在+25s,然后进入待机状态,被闹钟唤醒踢看门狗并将闹钟设置为下一个25s等......

它几乎可以正常工作,但由于某种原因,有时 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);

【问题讨论】:

  • 观察到此问题的任何周期性?顺便说一句,您在睡眠模式下的掉电重置级别是多少?

标签: c embedded stm32 interrupt


【解决方案1】:

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 振荡器,我希望它是一个晶体或陶瓷振荡器。

【讨论】:

  • 对于对 RC 的误解,我们深表歉意。计算取自 STM 的示例,我在其中复制粘贴,他们使用的是 RC。我正在使用伦敦证券交易所。感谢您的建议,我会尝试将 RTC 闹钟设置在 19 秒以内,希望对解决问题有所帮助。
  • @AdiT 如果问题仍然存在,那么至少我们已经排除了一个可能的原因。尽管对于强大的应用程序,您确实需要考虑容差。可以校准它,我想热漂移远小于 R/C 值容差。 19 秒是一个异常值,但从 26 秒漂移到 25 秒是合理的。用热风枪/吹风机和冷冻喷雾测试它,看看你是否可以按需引发错误。
  • 如果stm32有一个计算IWDG的寄存器,你熟悉吗?我想在看门狗响起时捕获它,以查看可能的传播情况。
  • @AdiT :可能最好作为一个新问题发布。无法读取 IWDG 计数器。它运行在一个独立的时钟域上,因此即使可以读取它也会很复杂。一种解决方案是在重置看门狗的同时将常规计时器归零,然后在繁忙的循环中不断将该计数器值写入 SRAM,然后在重置后检查 SRAM 值(需要设置链接器以不初始化计数器空间)。这将使您了解每次看门狗重置所花费的时间。正如我所说,如果您想要更彻底的考虑,请发布一个新问题。
猜你喜欢
  • 2011-11-05
  • 2013-10-15
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
相关资源
最近更新 更多