如何区分是哪个事件导致mcu退出Standby/Sleep模式

How to distinguish which event caused the mcu to exit Standby / Sleep mode

我的配置:STM32F407VGT,ide STM32CubeIDE。

我将MCU置于待机模式,有两种方法可以让MCU离开待机状态。第一种方式是将 PA0 引脚与 3.3v 连接,第二种方式是等待 RTC 定时器计数到指定值。两种方式都可以。

现在我的问题是如何区分事件?我在数据表中找到了这个

Bit 8 EWUP: Enable WKUP pin

This bit is set and cleared by software.

0: WKUP pin is used for general purpose I/O. An event on the WKUP pin does not wakeup the device from Standby mode. 1: WKUP pin is used for wakeup from Standby mode and forced in input pull down configuration (rising edge on WKUP pin wakes-up the system from Standby mode). Note: This bit is reset by a system reset.

通过这段代码,我试图想出一个 idea

  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();

出于某种原因,我总是得到 PWR_CSR_EWUP 不等于 0x00000100,即使我通过将 PA0 连接到 3.3V 来离开待机模式。所以结论是我总是得到它的其他状态(绿色 led (PD14) 在 mcu 离开待机模式后总是打开)。

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

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

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

当然,您也可以查看STM32CubeF4 HAL库中是否有传递您想要的信息的函数。当你查看它的实现时,你应该会发现类似这样的东西(但我承认我没有检查过......)。