AngryCat 发表于 2019-3-4 23:24:17

STM32L051C8T6低功耗配置问题

在使用STM32L051C8T6开发低功耗产品时遇到这么个问题:第一次进入休眠模式时功耗可降低至3uA左右,符合预期;休眠时间6秒,唤醒后检测一个开关量输入信号后立马进入休眠,时间极短,随后再次进入休眠状态;就是这第二次进入后,休眠功耗变为5uA了,而且之后进入休眠都保持这个功耗,比预期高。这是什么原因造成的呢?
以下是进入和唤醒部分代码,用RTC定时唤醒。
void MCU_IntoStopMode(u16 wake_up_sec_time)
{
        printf("\n******into sleep! wake_up_sec_time=%us\n",wake_up_sec_time);
       
        if(wake_up_sec_time==0)
        {
                return;
        }
       
        RTC_SetWakeUpCounter(wake_up_sec_time*2048);
        RTC_WakeUpCmd(ENABLE);       
       
        MCU_StopMode_GPIO_Init();//GPIO设置
        PWR_PVDCmd(DISABLE);
        PWR_FastWakeUpCmd(ENABLE);
        PWR_UltraLowPowerCmd(ENABLE);
        PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//进入停止模式
//        HSI_Config();
//        UART_Init();//串口初始化
        printf("out sleep!\n");
}


void RTC_WKUP_IRQHandler(void)
{               
        RTC_WakeUpCmd(DISABLE);
        HSI_Config();
        UART_Init();//串口初始化
if(RTC_GetITStatus(RTC_IT_WUT) != RESET)
{
//                printf("RTC_IT_WUT\n");
                RTC_ClearFlag(RTC_FLAG_WUTF);
    RTC_ClearITPendingBit(RTC_IT_WUT);
    EXTI_ClearITPendingBit(EXTI_Line20);
}
}




AngryCat 发表于 2019-3-4 23:27:33

是STM32L151C8T6

toofree 发表于 2019-3-5 09:26:22

说是休眠模式,但从函数命名看,你这是停机模式啊。唤醒以后,需要把时钟全重新配置一遍,必要的时候还得重配置部分外设。






AngryCat 发表于 2019-3-6 22:34:41

toofree 发表于 2019-3-5 09:26
说是休眠模式,但从函数命名看,你这是停机模式啊。唤醒以后,需要把时钟全重新配置一遍,必要的时候还得重 ...

我这里的休眠是通俗的意思,芯片低功耗模式是STOP+RTC,理论功耗应该是1.2uA左右。我在只焊接主芯片的情况下第一次可以达到1.2uA,但当第二次进入休眠后就有3~4uA了,比理论值增加2uA左右,之后就一直是这个值了。

发表于 2019-3-7 10:34:07

唤醒是RTC自动唤醒还是外部按键唤醒?如果是外部按键,考虑一下外部的IO配置。

AngryCat 发表于 2019-3-8 12:05:42

安 发表于 2019-3-7 10:34
唤醒是RTC自动唤醒还是外部按键唤醒?如果是外部按键,考虑一下外部的IO配置。 ...

RTC自动唤醒

发表于 2019-3-8 13:41:04

我看到楼主有对IO检测进行操作。检测完毕后,是否有设置为其他状态?可能是因为这里导致的。

AngryCat 发表于 2019-6-6 15:42:28

void RTC_WKUP_IRQHandler(void)
{               
        RTC_WakeUpCmd(DISABLE);       
        HSI_Config();
#ifdef                USE_UART2       
        UART2_Init();//串口初始化
#endif
       
if(RTC_GetITStatus(RTC_IT_WUT) != RESET)
{
//                log_debug("RTC_IT_WUT\n");
                RTC_ClearFlag(RTC_FLAG_WUTF);
                PWR_ClearFlag(PWR_FLAG_WU); //少了这一句
    RTC_ClearITPendingBit(RTC_IT_WUT);
    EXTI_ClearITPendingBit(EXTI_Line20);
}
}


原因是少了这一句
PWR_ClearFlag(PWR_FLAG_WU); //少了这一句
页: [1]
查看完整版本: STM32L051C8T6低功耗配置问题