中级会员
 
- 积分
- 462
- 金钱
- 462
- 注册时间
- 2015-11-28
- 在线时间
- 89 小时
|
50金钱
本帖最后由 森海有眼泉 于 2020-6-17 11:03 编辑
STM32F0 配置STANDBY休眠,使用WKUP唤醒, 上电后第一次 进入休眠模式成功,然后使用WKUP唤醒后,再次进入休眠模式之后会自动唤醒重启。
除了刚烧录程序的第一次以外,再进入休眠都会自动唤醒。。。弄了一天了。很蛋疼。
使用的stm32f030rc芯片,
- void Sys_Standby(void)
- {
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟
-
-
- PWR_WakeUpPinCmd(PWR_WakeUpPin_2,ENABLE); //使能唤醒管脚功能 //PC13 WKUP2
-
- PWR_EnterSTANDBYMode(); //进入待命(STANDBY)模式
-
- }
- //系统进入待机模式
- void Sys_Enter_Standby(void)
- {
- RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //复位所有IO口
- Sys_Standby();
- }
复制代码
我把所有外部引脚中断都失能(未初始化)了,外部串口也都失能(未初始化)了。 并没有使用RTC功能和看门狗功能。NRST 10K上拉,0.1uf电容接地。

问题就是烧录之后第一次 休眠和唤醒都正常,再休眠就无限自动唤醒了。这就很邪性了。
是需要清除什么标志位么? 什么指令?我去查查手册
复查程序 发现 stm32f0xx_pwr.c 文件里 PWR_EnterSTANDBYMode 函数 里面没有清除标志位,不知道是不是这个问题,
- void PWR_EnterSTANDBYMode(void)
- {
- /* Select STANDBY mode */
- PWR->CR |= PWR_CR_PDDS;
- /* Set SLEEPDEEP bit of Cortex-M0 System Control Register */
- SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
- /* Request Wait For Interrupt */
- __WFI();
- }
复制代码
|
最佳答案
查看完整内容[请看2#楼]
搞定了。因为库函数版本的不同,导致PWR_EnterSTANDBYMode 函数代码的不同
这个是无限重启的
这个是不无限重启的
代码对比发现 缺少清除标志位,所以要在调用 PWR_EnterSTANDBYMode函数之前使用 PWR_GetFlagStatus(对应的标志) ;清除对应的标志位。才会不无限重启。也可以修改PWR_EnterSTANDBYMode 函数在里面加上 清除标志位。
|