STM32F407VG 待机模式唤醒原因 — WUTF 标志始终设置

STM32F407VG Standby mode wake up reason — WUTF flag always set

我正在为 STM32F407VG 编写一个低功耗应用程序。它进入待机模式并可以通过两种方式唤醒:

根据应用程序是由 RTC 还是按钮唤醒,我需要执行两个不同的任务。因此,当从待机模式唤醒后固件重置时,我必须找出唤醒原因(RTC 或按钮)。

我已经进行了必要的配置以从任一来源从待机模式唤醒,并且它们正在工作 - 处理器确实会定期唤醒,或者当我按下按钮时唤醒。问题在于找出唤醒原因。

RTC_ISR 寄存器的 WUTF 文档说明如下:

Bit 10 WUTF: Wakeup timer flag

This flag is set by hardware when the wakeup auto-reload counter reaches 0.

This flag is cleared by software by writing 0.

This flag must be cleared by software at least 1.5 RTCCLK periods before WUTF is set to 1 again.

这对我来说似乎很完美 — 如果设置了标志,那一定是因为唤醒计时器达到 0 并唤醒了处理器。

我在我的固件开头插入了一些代码来读取 WUTF 并根据它设置一个 LED,然后立即清除标志。不幸的是,这个标志总是被设置,不仅在由于 RTC 从待机模式唤醒时,而且在由于按钮唤醒时,甚至在第一次打开电路时。

我检查了这个 MCU 的勘误表 sheet,没有发现这个问题。

我确实意识到一个解决方法是读取按钮的状态,如果它对应于按下状态,则假设唤醒原因是由于按钮被按下。但是,在返回待机模式之前,我的固件在 运行 模式下仅运行了几微秒,并且由于按钮的弹跳问题,除非我伸出 运行模式时间到几微秒。这反过来会影响我的应用程序的平均功耗(以及电池寿命)。虽然添加电容器可能会有所帮助,但如果可能的话,我想实现一个纯软件解决方案。

这完全是我的错。我正在通过以下 HAL 宏读取标志:

 __HAL_RTC_WAKEUPTIMER_GET_FLAG(&hRTC, RTC_FLAG_WUTF);

事实证明,我在初始化 hRTC.Instance 之前就使用了它,因此它没有访问 RTC 的寄存器,只是读取了一些随机内存(可能是地址 0)。修复后,标志似乎可以可靠地工作。