打印

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

[复制链接]
16319|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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

粉丝