power-management - STM32F407VG 待机模式唤醒原因 — WUTF 标志始终设置
问题描述
我正在为 STM32F407VG 编写一个低功耗应用程序。它进入待机模式,可以通过两种方式唤醒:
- 周期性地,使用 RTC 唤醒定时器;
- 通过按下连接到 PA0-WKUP 引脚的按钮。
根据应用程序是由 RTC 还是按钮唤醒,我需要执行两个不同的任务。因此,当从待机模式唤醒后固件复位时,我必须找出唤醒原因(RTC 或按钮)。
我已经进行了必要的配置,可以从任一来源从待机模式唤醒,它们正在工作——处理器确实会定期唤醒,或者当我按下按钮时。问题在于找出唤醒原因。
RTC_ISR 寄存器的 WUTF 的文档说明如下:
Bit 10 WUTF:唤醒定时器标志
当唤醒自动重载计数器达到 0 时,该标志由硬件设置。
该标志由软件通过写入 0 清除。
在 WUTF 再次设置为 1 之前,该标志必须由软件清除至少 1.5 个 RTCCLK 周期。
这对我来说似乎很完美——如果设置了标志,那一定是因为唤醒计时器达到 0 并唤醒了处理器。
我在固件的开头插入了一些代码来读取 WUTF 并根据它设置一个 LED,然后立即清除标志。不幸的是,这个标志总是被设置,不仅在由于 RTC 从待机模式唤醒时,而且在由于按钮唤醒时,甚至在第一次打开电路时也是如此。
我检查了这个 MCU 的勘误表,发现没有提到这个问题。
我确实意识到一种解决方法是读取按钮的状态,如果它对应于按下状态,则假设唤醒原因是由于按下了按钮。但是,我的固件在运行模式下仅运行几微秒,然后返回待机模式,并且由于按钮的弹跳问题,除非我将运行模式时间延长到几微秒,否则这种检测是不可靠的. 这反过来会影响我的应用程序的平均功耗(以及电池寿命)。虽然添加电容器可能会有所帮助,但如果可能的话,我想实现一个纯软件解决方案。
解决方案
这完全是我的错。我正在通过以下 HAL 宏读取标志:
__HAL_RTC_WAKEUPTIMER_GET_FLAG(&hRTC, RTC_FLAG_WUTF);
原来我在初始化之前使用它hRTC.Instance
,所以它不是访问 RTC 的寄存器,而是读取一些随机内存(可能是地址 0)。修复后,该标志似乎可以可靠地工作。
推荐阅读
- python - 训练自定义模型
- html - 为什么我的代码在移动视图中没有覆盖整个屏幕它只覆盖了一半的屏幕
- excel - Excel:获取保存在文件中的易失性函数的当前值
- c++ - 通用初始化的工作导致析构函数被额外调用一次
- python - Python 正则表达式:仅当单词前面有空格和逗号或单词是起始词时
- kotlin - 混合值的枚举(常量和数据类)
- java - 如何正确评估 Velocity 上下文?
- c++ - 如何使用介子构建系统将 zstd 构建为子项目
- c++ - 每次都产生相同坐标的本地化(多点定位)代码?
- javascript - 在 ExpressJS 响应中返回异步等待 try/catch 抛出错误