打印

STM32的低功耗唤醒问题

[复制链接]
7382|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
IJK|  楼主 | 2009-11-18 11:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近的一个STM32的应用需要进入低功耗,结果碰到一个问题很奇怪,流程如下:
1)通过WFI进入SLEEP模式,然后通过Systick来唤醒
2)通过调用库函数(如下)进入STOP模式,然后由外部电路通过一个外部中断引脚唤醒;唤醒后,重新初始化HSE和PLL
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);

3)进行一些操作后,重复上述1)、2)
结果,第2次进入步骤1)程序死在那里了。
评分
参与人数 1威望 +1 收起 理由
barboon + 1
沙发
IJK|  楼主 | 2009-11-18 11:19 | 只看该作者
为了用JLink调试上面的问题,在进入STOP模式前调用了下面的语句:
    // enable Debug in Stop mode
    DBGMCU->CR |= DBGMCU_CR_DBG_STOP;

结果,第2次进入步骤1)程序就不会死在那里了。
这是另外一个很奇怪的现象。

使用特权

评论回复
板凳
IJK|  楼主 | 2009-11-18 11:24 | 只看该作者
问题还在于:把JLink拿掉,对STM32重新复位(不是重新上电),第2次进入步骤1)程序就不会死在那里。

而把JLink拿掉,对STM32重新上电,第2次进入步骤1)程序又死在那里。

很奇怪,STM32的唤醒跟调试模块纠缠起来了。

使用特权

评论回复
地板
IJK|  楼主 | 2009-11-18 16:01 | 只看该作者
问题解决了,需要清除SLEEPDEEP bit of Cortex System Control Register:
// Cortex System Control register address
#define SCB_SysCtrl              ((uint32_t)0xE000ED10)
// SLEEPDEEP bit mask
#define SysCtrl_SLEEPDEEP_Set    ((uint32_t)0x00000004)
    // Clear SLEEPDEEP bit of Cortex System Control Register
    *(__IO uint32_t *) SCB_SysCtrl &= ~SysCtrl_SLEEPDEEP_Set;

使用特权

评论回复
5
hsbjb| | 2009-11-19 21:05 | 只看该作者
学习

使用特权

评论回复
6
coslight| | 2009-12-9 22:18 | 只看该作者
非常好的总结,学习

使用特权

评论回复
7
wgj_fly| | 2012-10-1 19:36 | 只看该作者
学习

使用特权

评论回复
8
dmj2168| | 2013-3-26 19:31 | 只看该作者
能加我的QQ么36910500谢谢了

使用特权

评论回复
9
菜鸟同学| | 2015-12-10 17:54 | 只看该作者
这个靠谱吗?

使用特权

评论回复
10
菜鸟同学| | 2015-12-10 18:16 | 只看该作者
IJK 发表于 2009-11-18 16:01
问题解决了,需要清除SLEEPDEEP bit of Cortex System Control Register:
// Cortex System Control regis ...

这东西需要手动清除吗?我看其他的唤醒代码没有呢?

使用特权

评论回复
11
happyhere| | 2016-10-16 09:34 | 只看该作者
学习了

使用特权

评论回复
12
energyplants| | 2016-10-16 16:22 | 只看该作者
stm32的低功耗系列是不是就是L系列啊,有开发板,想玩玩

使用特权

评论回复
13
IJK|  楼主 | 2018-3-16 11:01 | 只看该作者
energyplants 发表于 2016-10-16 16:22
stm32的低功耗系列是不是就是L系列啊,有开发板,想玩玩

是的。

使用特权

评论回复
14
donatello1996| | 2018-3-16 17:16 | 只看该作者
学习。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

IJK

20

主题

3552

帖子

5

粉丝