OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7390|回复: 4

STM32F0进入STANDBY休眠模式自动唤醒?

[复制链接]

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
发表于 2020-6-17 10:23:46 | 显示全部楼层 |阅读模式
50金钱
本帖最后由 森海有眼泉 于 2020-6-17 11:03 编辑

STM32F0 配置STANDBY休眠,使用WKUP唤醒,  上电后第一次 进入休眠模式成功,然后使用WKUP唤醒后,再次进入休眠模式之后会自动唤醒重启。
除了刚烧录程序的第一次以外,再进入休眠都会自动唤醒。。。弄了一天了。很蛋疼。


使用的stm32f030rc芯片,


  1. void Sys_Standby(void)
  2. {  
  3.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);        //使能PWR外设时钟
  4.         
  5.         
  6.         PWR_WakeUpPinCmd(PWR_WakeUpPin_2,ENABLE); //使能唤醒管脚功能   //PC13 WKUP2
  7.         
  8.         PWR_EnterSTANDBYMode();          //进入待命(STANDBY)模式                  
  9.         
  10. }
  11. //系统进入待机模式
  12. void Sys_Enter_Standby(void)
  13. {                        
  14.         RCC_APB2PeriphResetCmd(0X01FC,DISABLE);        //复位所有IO口

  15.         Sys_Standby();
  16. }
复制代码

我把所有外部引脚中断都失能(未初始化)了,外部串口也都失能(未初始化)了。 并没有使用RTC功能和看门狗功能。NRST 10K上拉,0.1uf电容接地。


问题就是烧录之后第一次 休眠和唤醒都正常,再休眠就无限自动唤醒了。这就很邪性了。
是需要清除什么标志位么? 什么指令?我去查查手册

复查程序 发现 stm32f0xx_pwr.c 文件里 PWR_EnterSTANDBYMode 函数  里面没有清除标志位,不知道是不是这个问题,
  1. void PWR_EnterSTANDBYMode(void)
  2. {
  3.   /* Select STANDBY mode */
  4.   PWR->CR |= PWR_CR_PDDS;

  5.   /* Set SLEEPDEEP bit of Cortex-M0 System Control Register */
  6.   SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;

  7.   /* Request Wait For Interrupt */
  8.   __WFI();
  9. }
复制代码

最佳答案

查看完整内容[请看2#楼]

搞定了。因为库函数版本的不同,导致PWR_EnterSTANDBYMode 函数代码的不同 这个是无限重启的 这个是不无限重启的 代码对比发现 缺少清除标志位,所以要在调用 PWR_EnterSTANDBYMode函数之前使用 PWR_GetFlagStatus(对应的标志) ;清除对应的标志位。才会不无限重启。也可以修改PWR_EnterSTANDBYMode 函数在里面加上 清除标志位。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
 楼主| 发表于 2020-6-17 10:23:47 | 显示全部楼层
本帖最后由 森海有眼泉 于 2020-6-17 11:01 编辑

搞定了。因为库函数版本的不同,导致PWR_EnterSTANDBYMode 函数代码的不同
这个是无限重启的
  1. void PWR_EnterSTANDBYMode(void)
  2. {
  3.                
  4.   /* Select STANDBY mode */
  5.   PWR->CR |= PWR_CR_PDDS;

  6.   /* Set SLEEPDEEP bit of Cortex-M0 System Control Register */
  7.   SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;

  8.   /* Request Wait For Interrupt */
  9.   __WFI();
  10. }
复制代码



这个是不无限重启的
  1. void PWR_EnterSTANDBYMode(void)
  2. {
  3.   /* Clear Wake-up flag */
  4.   PWR->CR |= PWR_CR_CWUF;
  5.   /* Select STANDBY mode */
  6.   PWR->CR |= PWR_CR_PDDS;
  7.   /* Set SLEEPDEEP bit of Cortex System Control Register */
  8.   SCB->SCR |= SCB_SCR_SLEEPDEEP;
  9. /* This option is used to ensure that store operations are completed */
  10. #if defined ( __CC_ARM   )
  11.   __force_stores();
  12. #endif
  13.   /* Request Wait For Interrupt */
  14.   __WFI();
  15. }
复制代码


代码对比发现 缺少清除标志位,所以要在调用 PWR_EnterSTANDBYMode函数之前使用  PWR_GetFlagStatus(对应的标志) ;清除对应的标志位。才会不无限重启。也可以修改PWR_EnterSTANDBYMode  函数在里面加上 清除标志位。
回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
 楼主| 发表于 2020-6-17 11:02:48 | 显示全部楼层
完结撒花~
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2770
金钱
2770
注册时间
2015-6-1
在线时间
394 小时
发表于 2020-6-17 11:28:21 | 显示全部楼层
我也经常发着发着问题,突然总结出来了,刚发完帖子就去按自己的想法一试,就好了
自在随心
回复

使用道具 举报

0

主题

14

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2019-11-1
在线时间
10 小时
发表于 2022-7-19 12:26:36 | 显示全部楼层
我也遇到同样的问题,是库函数遗漏了清除标志位吗?还是还有别的进入待机的函数?请高人指点
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 15:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表