首页 > 解决方案 > 如何区分是哪个事件导致单片机退出待机/睡眠模式

问题描述

我的配置: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离开待机模式后总是打开)。

标签: cembeddedsleepstm32standby

解决方案


这看起来好像你必须纠正两件事:

  • 您必须读取寄存器PWR_CSR,而不是位掩码PWR_CSR_EWUP

  • 您不应该检查是否相等(因为 32 位寄存器还有 6 个位表示其他内容),而是屏蔽掉您需要的位并检查结果: ((PWR_CSR & PWR_CSR_EWUP) == PWR_CSR_EWUP)

当然,您也可以查看 STM32CubeF4 HAL 库以获取提供所需信息的函数。当你查看它的实现时,你应该会发现类似这样的东西(但我承认我没有检查过......)。


推荐阅读