c - 如何区分是哪个事件导致单片机退出待机/睡眠模式
问题描述
我的配置:STM32F407VGT,IDE STM32CubeIDE。
我将 MCU 置于待机模式,MCU 离开待机状态有两种方法。第一种方法是将 PA0 引脚与 3.3v 连接,第二种方法是等待 RTC 定时器计数到指定值。两种方式都可以正常工作。
现在我的问题是如何区分事件?我在数据表中找到了这个
Bit 8 EWUP:使能 WKUP 引脚
该位由软件设置和清除。
0:WKUP 引脚用于通用 I/O。WKUP 引脚上的事件不会将器件从待机模式唤醒。1:WKUP 引脚用于从待机模式唤醒并强制进入输入下拉配置(WKUP 引脚的上升沿将系统从待机模式唤醒)。注意:该位由系统复位复位。
有了这段代码,我试图想出一个主意
if(PWR_CSR_EWUP == 0x00000100) // PA0 is used to leave standby mode
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);
HAL_Delay(2500);
}
else // mcu leave standby mode because RTC timer count desired value
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
HAL_Delay(2500);
}
Enter_StandbyMode();
出于某种原因,即使我通过将 PA0 连接到 3.3V 离开待机模式,我总是得到 PWR_CSR_EWUP 不等于 0x00000100。所以结论是我总是得到它的其他状态(绿色LED(PD14)在MCU离开待机模式后总是打开)。
解决方案
这看起来好像你必须纠正两件事:
您必须读取寄存器PWR_CSR,而不是位掩码PWR_CSR_EWUP
您不应该检查是否相等(因为 32 位寄存器还有 6 个位表示其他内容),而是屏蔽掉您需要的位并检查结果:
((PWR_CSR & PWR_CSR_EWUP) == PWR_CSR_EWUP)
当然,您也可以查看 STM32CubeF4 HAL 库以获取提供所需信息的函数。当你查看它的实现时,你应该会发现类似这样的东西(但我承认我没有检查过......)。
推荐阅读
- c# - DataBinding:“System.Data.DataRowView”不包含名为“Tasklist”的属性
- java - Spring data jpa 条件查询重构
- debian - Ubuntu 18.04 部分“InRelease”是强制性的吗?
- java - Checked Exception 是编译时还是运行时?
- gstreamer - Gstreamer:udpsink/udpsrc 与 tcpserversink/tcpclientsrc
- atomic - 当 CPU 将 storebuffer 中的值刷新到 L1 Cache 时?
- php - 将代码更改为 mysqli
- android - 安卓 USB Otg 打印机
- sql - 插入查询的性能调整
- git - Git克隆到一个设置的空目录