我们公司不准再使用keil了,得换成cube ide,于是我要把之前的工程移植到cube ide上。这次移植的工程里,有一个进入stop mode低功耗的功能。

我在keil中使用的标准库实现:当没有触发外部中断(外部中断脚接了一个传感器的中断脚,通过传感器的中断来唤醒停止模式)的时候进入停止模式:

if(it_flag != 1)
{
    //进入stop mode
    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
    SystemInit(); //重新初始化时钟
}

这样写是可以进入stop mode的,当有任意外部中断来的时候,则退出停止模式。

移植到cube ide上之后(转换为hal库),却无法进入停止模式。Debug中发现,没有外部中断的时候,有进入停止模式的函数里,但没有在__WFI()里等待外部中断的到来,就继续执行下一行了。可以肯定此时传感器的中断没有触发。那是什么原因导致退出了停止模式呢?

 我想到我有开了一个定时器中断,不知道是不是定时器中断的缘故,导致退出了停止模式。于是我在进入停止模式之前关闭了定时器中断的代码。但是并没有什么用处...看来定时器的中断应该不是影响进入停止模式的因素。

HAL_TIM_Base_Stop_IT(&htim3);//关闭timer3中断
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);
SystemClock_Config(); //重新初始化时钟
HAL_TIM_Base_Start_IT(&htim3); //重新打开timer3中断

此时只能求助强大的网络了,参考了这位博主的博客:https://blog.csdn.net/lmx11040101/article/details/85785336

这位博主有开一个systick中断,而我开了定时器中断,那我应该把定时器中断的时钟关掉。

HAL_RCC_TIM3_CLK_DISABLE();//关闭timer3时钟
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);
SystemClock_Config(); //重新初始化时钟
HAL_RCC_TIM3_CLK_ENABLE(); //重新打开timer3时钟

关掉之后,在进入停止模式时,没有再被唤醒,直到外部中断产生才能被唤醒。

总结:进入低功耗之前,应该关闭不需要的外设时钟,退出低功耗后,重新使能外设是时钟。