STM32 低功耗入口 PWR_EnterSTOPMode()函数中
设置了SCB_SysCtrl的SleepDeep位。退出函数时,也没有清除该位。
因此,如果我的程序以如下方式运行
...
int main()
{
...
while(xxx)
{
__WFI(); //此处简单进入sleep模式以降低功耗
}
//处理结束,进入低功耗,2秒以后醒来
RTCSetAlarm(...)
PWR_EnterSTOPMode(xx,xx);
}
第一次运行没有问题,一旦运行PWR_EnterSTOPMode再唤醒后,由于SleepDeep位没有清除,调用 __WFI()会导致进入Stop模式而不是Sleep模式。
由于SCB_SysCtrl被定义stm32f10x_pwr.c而且是用define中,因此也无法以在自己的应用代码里直接清除SCB_SysCtrl中的标志位。
因此只能自己定义:
#define _SCB_SysCtrl ((u32)0xE000ED10)
...
int main()
{
...
while(xxx)
{
__WFI(); //此处简单进入sleep模式以降低功耗
}
//处理结束,进入低功耗,2秒以后醒来
RTCSetAlarm(...)
PWR_EnterSTOPMode(xx,xx);
/* 清除Stop或Standby的标记 */
*(vu32 *) _SCB_SysCtrl &= ~SysCtrl_SLEEPDEEP_Set;
}
STM32库中没有给函数Sleep的入口,可能是因为只需要__WFI()就够了 ,但是由于PWR_EnterStopMode改变SLEEPDeep的标志,导致后续的__WFI()并不是进入Sleep模式。 |