【发布时间】:2019-10-03 15:58:47
【问题描述】:
我喜欢让我的 STM32F412 进入深度睡眠模式,然后按下按钮将其唤醒。此代码应与 RTOS(Zephyr) 一起运行。所以在执行代码时,为了让设备进入深度睡眠,其他任务等都处于活动状态。
所以我正在寻找一种防弹方法,以确保 STM32F412 进入待机状态并在之后唤醒。
到目前为止我的(不工作的代码):
#define POWER_WAKEUP_PIN LL_PWR_WAKEUP_PIN2
// set PC0 as input gpio
LL_GPIO_SetPinPull(GPIOC, LL_GPIO_PIN_0, LL_GPIO_PULL_NO);
LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_0, LL_GPIO_MODE_INPUT);
// activate EXTI line 0
LL_EXTI_InitTypeDef EXTI_InitStruct = {0};
LL_EXTI_DisableIT_0_31(LL_EXTI_LINE_ALL_0_31);
EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_0;
EXTI_InitStruct.LineCommand = ENABLE;
EXTI_InitStruct.Mode = LL_EXTI_MODE_EVENT;
EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;
LL_EXTI_Init(&EXTI_InitStruct);
// put to standby
LL_PWR_DisableWakeUpPin(POWER_WAKEUP_PIN);
LL_PWR_ClearFlag_WU();
LL_PWR_EnableWakeUpPin(POWER_WAKEUP_PIN);
LL_PWR_SetPowerMode(LL_PWR_MODE_STANDBY);
LL_LPM_EnableDeepSleep();
__WFI();
它使用 stm32 LL HAL。任何想法缺少什么
【问题讨论】:
-
你的问题是?什么不工作?设备不退出待机?不进入深度睡眠?
-
谢谢@GuillaumePetitjean。目前我不确定是否应该使用事件等待(WFE)或等待中断(WFI)。我也不确定我的 PIN 设置是否正确。也许您可以提供一些反馈
-
使用 WFE,您将被中断或事件唤醒。事件主要用于多核系统,但不仅限于此。还有更多(棘手的)差异,STM32参考手册对此主题相当清楚。如果您想通过 GPIO 中断唤醒,我想您可以使用 WFI,而不必担心 WFE 的细微差别。
-
我不知道这个特殊的STM32,所以我不会评论PIN设置。请记住,某些外围设备将在停止模式下停止,因此显然无法唤醒您。管理待机也可能非常棘手。例如,您应该在执行 WFI 之前添加一条 DSB 指令。看看
HAL_PWR_EnterSTOPMode -
你还是没有说什么不行。