lich0205 发表于 2017-12-19 16:59:43

STM32L073待机唤醒导致复位

本帖最后由 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();

                }

望指点,谢谢!

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小时已过,请楼主自行修改标题,修改原因:标题不合格。
否则会关闭该帖子! ...

已经改好了
页: [1] 2
查看完整版本: STM32L073待机唤醒导致复位