STM32库低功耗函数入口PWR_EnterSTOPMode问题及解决

[复制链接]
 楼主| ploto 发表于 2009-9-24 15:01 | 显示全部楼层 |阅读模式
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模式。
zhongce09 发表于 2009-9-27 10:13 | 显示全部楼层
很不错的东东,LZ很强哦~~~
wudonghua 发表于 2009-9-28 08:59 | 显示全部楼层
学习了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

99

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部