首页 > 解决方案 > STM32F407VG 待机模式唤醒原因 — WUTF 标志始终设置

问题描述

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

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

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

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

Bit 10 WUTF:唤醒定时器标志

当唤醒自动重载计数器达到 0 时,该标志由硬件设置。

该标志由软件通过写入 0 清除。

在 WUTF 再次设置为 1 之前,该标志必须由软件清除至少 1.5 个 RTCCLK 周期。

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

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

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

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

标签: power-managementstm32f4standby

解决方案


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

 __HAL_RTC_WAKEUPTIMER_GET_FLAG(&hRTC, RTC_FLAG_WUTF);

原来我在初始化之前使用它hRTC.Instance,所以它不是访问 RTC 的寄存器,而是读取一些随机内存(可能是地址 0)。修复后,该标志似乎可以可靠地工作。


推荐阅读