你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L073待机唤醒导致复位

[复制链接]
lich0205 提问时间:2017-12-19 16:59 /
本帖最后由 lich0205 于 2017-12-21 14:09 编辑

为了降低功耗周期性的使芯片进入待机状态,在设定时间使用WKUP事件唤醒,在执行完设定动作之后再次进入待机状态,再唤醒,如此往复。
现在出现的问题是,第一次进入待机状态之后能够待机到设定时间(比如30s)然后唤醒芯片,程序重新开始执行,然而再次进入待机状态之后芯片立即就被唤醒从头开始执行程序了,感觉是哪里的标志没有复位,但是不确定

RTC初始化代码:
void MX_RTC_Init(void)
{
  RTC_TimeTypeDef sTime;
  RTC_DateTypeDef sDate;

    /**Initialize RTC Only
    */
  hrtc.Instance = RTC;
  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  hrtc.Init.AsynchPrediv = 127;
  hrtc.Init.SynchPrediv = 255;
  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initialize RTC and set the Time and Date
    */
  if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2){
  sTime.Hours = 0x0;
  sTime.Minutes = 0x0;
  sTime.Seconds = 0x0;
  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sDate.WeekDay = RTC_WEEKDAY_MONDAY;
  sDate.Month = RTC_MONTH_JANUARY;
  sDate.Date = 0x1;
  sDate.Year = 0x0;

  if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x32F2);
  }

}


进入待机模式代码:
                if((1 == PWR_Standby_In_Flg) && (1 == USART_CallBack_Ok))
                {
                        
                        if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 60, RTC_WAKEUPCLOCK_CK_SPRE_16BITS) != HAL_OK)
                        {
                                _Error_Handler(__FILE__, __LINE__);
                        }        
                        

                        HAL_PWR_EnterSTANDBYMode();

                }

望指点,谢谢!

评分

参与人数 1 ST金币 -5 收起 理由
Inc_brza -5 标题不合格

查看全部评分

收藏 评论13 发布时间:2017-12-19 16:59

举报

13个回答
xmshao 回答时间:2017-12-19 22:14:03
会不会唤醒中断标志没有清除呢?
废鱼 回答时间:2017-12-20 09:49:52
HAL_PWR_EnterSTANDBYMode这个是唤醒后直接复位运行的,如果不想复位运行用STOPMode。
Inc_brza 回答时间:2017-12-20 10:03:17
待机唤醒会复位,这个在手册里是已经清清楚楚写明的,
如安版主所说,建议使用STOPMode,如果想降低功耗,
建议用RTC Alarm进行定时唤醒或者Wakeup事件唤醒另外,建议楼主的标题修改一下,
《STM32L073待机唤醒导致复位》,这样直接就能看出你想问什么了!
lich0205 回答时间:2017-12-20 10:36:33
安 发表于 2017-12-20 09:49
HAL_PWR_EnterSTANDBYMode这个是唤醒后直接复位运行的,如果不想复位运行用STOPMode。 ...

版主大哥,可能我描述问题不是很清楚。容我再解释一下哈。
我想实现功能是这样的:
上电复位开始工作-->进入待机状态-->第一次待机30s-->退出待机,复位开始工作-->再次进入待机-->第二次待机30s-->退出待机,复位开始工作-->再次进入待机-->第三次待机30s-->退出待机,复位开始工作-->再次进入待机...   这样一个无限循环往复的过程。
但是现在调试出来的情况是:
上电复位开始工作-->进入待机状态-->第一次待机30s-->退出待机,复位开始工作-->再次进入待机-->第二次待机只有0s-->退出待机,复位开始工作-->进入待机状态-->第三次待机也只有0s-->退出待机,复位开始工作-->再次进入待机...  
也就是说只有第一次待机的时间达到了目的,待机了30s,但是第一次以后,第二次第三次第四次...进入待机之后没有延时就被立即复位运行,是为什么第二,第三,第四次。。。进入待机之后为什么没有延时的问题,就是不知道是不是第一次复位之后,RTC的外设里有些寄存器不受复位影响,导致后来的待机没有延时,但是由于进入待机之后除RTC都断电了,仿真器会掉线,在线调试看不到复位之后的寄存器的状态,因此特别迷惑
lich0205 回答时间:2017-12-20 10:40:40
Inc_brza 发表于 2017-12-20 10:03
待机唤醒会复位,这个在手册里是已经清清楚楚写明的,
如安版主所说,建议使用STOPMode,如果想降低功耗,
...

可能我之前描述的不是很清楚,容我再解释一下,现在使用的就是wakeup事件定时唤醒
我想实现功能是这样的:
上电复位开始工作-->进入待机状态-->第一次待机30s-->wakeup事件唤醒退出待机,复位开始工作-->再次进入待机-->第二次待机30s-->wakeup事件唤醒退出待机,复位开始工作-->再次进入待机-->第三次待机30s-->wakeup事件唤醒退出待机,复位开始工作-->再次进入待机...   这样一个无限循环往复的过程。
但是现在调试出来的情况是:
上电复位开始工作-->进入待机状态-->第一次待机30s-->wakeup事件唤醒退出待机,复位开始工作-->再次进入待机-->第二次待机只有0s-->wakeup事件唤醒退出待机,复位开始工作-->进入待机状态-->第三次待机也只有0s-->wakeup事件唤醒退出待机,复位开始工作-->再次进入待机...  
也就是说只有第一次待机的时间达到了目的,待机了30s,但是第一次以后,第二次第三次第四次...进入待机之后没有延时就被立即复位运行,是为什么第二,第三,第四次。。。进入待机之后为什么没有延时的问题,就是不知道是不是第一次复位之后,RTC的外设里有些寄存器不受复位影响,导致后来的待机没有延时,但是由于进入待机之后除RTC都断电了,仿真器会掉线,在线调试看不到复位之后的寄存器的状态,因此特别迷惑
废鱼 回答时间:2017-12-20 14:16:56
楼主是否有清除wekeup的标志位呢?RTC_ClearITPendingBit(RTC_IT_WUT);
Inc_brza 回答时间:2017-12-21 09:15:16
lich0205 发表于 2017-12-20 10:40
可能我之前描述的不是很清楚,容我再解释一下,现在使用的就是wakeup事件定时唤醒
我想实现功能是这样的 ...

24小时已过,请楼主自行修改标题,修改原因:标题不合格。
否则会关闭该帖子!
lich0205 回答时间:2017-12-21 14:10:16
Inc_brza 发表于 2017-12-21 09:15
24小时已过,请楼主自行修改标题,修改原因:标题不合格。
否则会关闭该帖子! ...

已经改好了
lich0205 回答时间:2017-12-21 14:10:33
Inc_brza 发表于 2017-12-21 09:15
24小时已过,请楼主自行修改标题,修改原因:标题不合格。
否则会关闭该帖子! ...

已经改好了
lich0205 回答时间:2017-12-21 14:21:21
xmshao 发表于 2017-12-19 22:14
会不会唤醒中断标志没有清除呢?

试过清除中断标志,没有用
lich0205 回答时间:2017-12-21 14:22:25
安 发表于 2017-12-20 09:49
HAL_PWR_EnterSTANDBYMode这个是唤醒后直接复位运行的,如果不想复位运行用STOPMode。 ...

额,我是想用唤醒后复位的,现在是待机时间不够,刚进入待机状态就立即复位了..
废鱼 回答时间:2017-12-21 15:03:20
楼主看最好串口输出一下RTC的状态寄存器,看看是不是清除了wekeup,我之前也发生过这样的问题,就是因为没有清除标志位导致的。
单片机爱好者 回答时间:2018-8-31 17:08:27
遇到同样问题,楼主如何解决的?求指点

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版