打印
[信息]

STM32L系列STOP模式下外部中断唤醒后功耗变高怎么办?

[复制链接]
363|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
麻花油条|  楼主 | 2021-6-7 09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
是这样的,我用STOP模式外部中断唤醒,在唤醒后再次进入STOP模式后发现功耗比第一次开机直接进入STOP模式高了300uA,所有IO口都配置了,外设也都关闭了,就是找不到原因第二次增加的功耗哪来的,求大神赐教,问题解决后有偿,谢谢!
代码如下:
int main(void)
{
    delay(2000);
    INT16U wReadTemp;
    HAL_Init();

    Systemclock_Config();
    MX_GPIO_Init();

//        VDD1_ON();
//    VDD2_ON();
//    VDD3_ON();
    RTC_Init();
    ADC_Init();

    sEepromGPIOInit();
    //MX_IWDG_Init();    // 打开看门狗

    UART_Init();

    ADXL355_Init();                                    // ADXL355SPI配置初始化

    sx1278_LoraInit();


        while(1)
        {
                        if(i == 1)
                        {
                                i = 0;
                                printf("Enter STOP Mode\r\n");
                                LowPower_enter_stop(10);    //Enter STOP
                        }
                        if(Incl_Data_Ready == 1)
                        {

                                Incl_Data_Ready = 0;
                                i = 1;
                                Get_WakeUp(); //初始化外设

//                                XL355_Temp_Calc();
//                              
//                                XL355_Accel_Read();
//                                printf("Accl:  X=%f  Y=%f  Z=%f\r\n",sIncl_Data.f32_Accl_Xaxis,sIncl_Data.f32_Accl_Yaxis,sIncl_Data.f32_Accl_Zaxis);
//                              
//                                tilt_Angle_Calc(&sIncl_Data);
//                                printf("Angle: X=%f  Y=%f  Z=%f\r\n",sIncl_Data.f32_shunxian_Angle_arc_o,sIncl_Data.f32_hengxian_Angle_arc_o,sIncl_Data.f32_zonghe_Angle_arc_o);

                        }
                       
        }

}


void LowPower_enter_stop(uint32_t stoptime)
{
    uint32_t i;
    SX1278_SetSleepMode();    // LORA模块休眠
        HAL_TIM_Base_Stop_IT(&htim2);

        //VDD1_OFF();
        //VDD2_OFF(); //关闭ADXL355 PA3
        //VDD3_OFF();
//        SPI_ADXL355_S_WRITE(XL355_RESET,0x52);   //重启ADXL355
//        SPI_ADXL355_S_WRITE(XL355_POWER_CTL, 0x01);   //配置寄存器为StandBy模式 待机

                //读1278每个IO口状态
                printf("SX1278:  %d",HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12)); //1 CS
                printf("%d",HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13)); //0 SCLK
                printf("%d",HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14));//0 MISO
                printf("%d",HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15));//1 MOSI
                printf("%d",HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12));//1   RST

                printf("%d",HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_7)); //0
                printf("%d",HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8));//0
                printf("%d",HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11));//0
      
                printf("%d",HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_6));//0
                printf("%d",HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8));//0
                printf("%d\r\n",HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9));//0
               
                //读355每个IO口状态
                printf("ADXL:%d",HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_7));//0
                printf("%d",HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6));//0
                printf("%d",HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5));//0
                printf("%d",HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4));//1
                printf("%d",HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_2));//0 INT2
                printf("%d\r\n",HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8));//0或1 DataReady单独判断 已断开

                //读EEPROM IO口 原理图为上拉
                printf("EEPROM: %d",HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_11)); //
                printf("%d",HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_2));  //
                printf("%d\r\n",HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3));//
               
      
    /* Enable Power Control clock */
    __HAL_RCC_PWR_CLK_ENABLE();
    /* Enable Ultra low power mode */
    HAL_PWREx_EnableUltraLowPower();

    /* Enable the fast wake up from Ultra low power mode */
    //HAL_PWREx_EnableFastWakeUp();
                GPIO_InitTypeDef GPIO_InitStructure = {0};

        __HAL_RCC_GPIOA_CLK_ENABLE();
        __HAL_RCC_GPIOB_CLK_ENABLE();
        __HAL_RCC_GPIOC_CLK_ENABLE();
        __HAL_RCC_GPIOD_CLK_ENABLE();
    __HAL_RCC_GPIOH_CLK_ENABLE();
      
        //EEPROM
        GPIO_InitStructure.Pin = GPIO_PIN_11;
        GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
        GPIO_InitStructure.Pull = GPIO_PULLUP;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
      
        GPIO_InitStructure.Pin = GPIO_PIN_2;
        GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
        GPIO_InitStructure.Pull = GPIO_PULLUP;
        HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);

        GPIO_InitStructure.Pin = GPIO_PIN_3;
        GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
        GPIO_InitStructure.Pull = GPIO_PULLUP;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
      
        //SX1278 PB12,15
        GPIO_InitStructure.Pin = GPIO_PIN_12 | GPIO_PIN_15;
        GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
    GPIO_InitStructure.Pull = GPIO_PULLUP;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
        //SX1278 PB13 14
        GPIO_InitStructure.Pin = GPIO_PIN_13 |GPIO_PIN_14;
        GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
    GPIO_InitStructure.Pull = GPIO_PULLDOWN;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
      
        //SX1278 RESET
        GPIO_InitStructure.Pin = GPIO_PIN_4 | GPIO_PIN_12;
        GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
    GPIO_InitStructure.Pull = GPIO_PULLUP;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
      
        //sx1278 IO口 DIO0-5
        GPIO_InitStructure.Pin = GPIO_PIN_2 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9;
        GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
    GPIO_InitStructure.Pull = GPIO_PULLDOWN;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
      
        // A7 6 5  A8 11
        GPIO_InitStructure.Pin =   GPIO_PIN_7 |GPIO_PIN_6 | GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_11;
        GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
    GPIO_InitStructure.Pull = GPIO_PULLDOWN;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);

        //对剩余所有IO口进行配置 留PA3 PA15 PB4通断开关  PA12 sx1278
        GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |
                                                                 GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_13 | GPIO_PIN_14|
                                                                     GPIO_PIN_15;
        GPIO_InitStructure.Mode = GPIO_MODE_analog;
    GPIO_InitStructure.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
      
        //
        GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5 |
                                                                GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 |
                                                                        GPIO_PIN_11;
        GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStructure.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);

      
        GPIO_InitStructure.Pin = GPIO_PIN_All;
        GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStructure.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOH, &GPIO_InitStructure);

        //留PC3外部中断
    GPIO_InitStructure.Pin = GPIO_PIN_0 |GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5 |
                                                                 GPIO_PIN_10 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
    GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStructure.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
      
        GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 |
                                                                GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 |
                                                                GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15 ;
        GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStructure.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
      
        __HAL_RCC_GPIOA_CLK_DISABLE();
        __HAL_RCC_GPIOB_CLK_DISABLE();
        __HAL_RCC_GPIOC_CLK_DISABLE();
        __HAL_RCC_GPIOD_CLK_DISABLE();
    __HAL_RCC_GPIOH_CLK_DISABLE();


        //关闭所有外设 功耗降低30uA
    HAL_UART_MspDeInit(&USART4_Handler);
        HAL_UART_MspDeInit(&USART1_Handler);
        HAL_ADC_Stop(&hadc); //关闭ADC
    HAL_ADC_MspDeInit(&hadc);
        HAL_SPI_MspDeInit(&Hspi);//SX1278
        HAL_I2C_MspDeInit(&hi2c1);//MPU6050
        HAL_TIM_Base_MspDeInit(&htim2);
        HAL_RTC_MspDeInit(&RTCHandle);
    HAL_SPI_MspDeInit(&hspi1); //ADXL355
      


    // 禁用/启用调试端口,先打开时钟,下面2句函数功能一样!
//         __HAL_RCC_DBGMCU_CLK_ENABLE();
//     HAL_DBGMCU_EnabLEDBGStopMode();
////     //HAL_DBGMCU_DBG_DisableLowPowerConfig(DBGMCU_STOP);
////         
//         __HAL_RCC_DBGMCU_CLK_DISABLE();

        //RTCHandle.Instance = RTC;
        //MX_RTC_Init();

    // 若需要在低功耗模式下调试程序,可以打开此函数
    //HAL_DBGMCU_DBG_EnableLowPowerConfig(DBGMCU_SLEEP | DBGMCU_STOP | DBGMCU_STANDBY);

    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);    // 清除唤醒标志
    //__HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG();//清除标志,否则第二次以后无法进入休眠

    /*## Setting the RTC Wake up time ########################################*/
    /*  RTC Wakeup Interrupt Generation:
    Wakeup Time Base = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSE or LSI))
    Wakeup Time = Wakeup Time Base * WakeUpCounter
    = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSE or LSI)) * WakeUpCounter
    ==> WakeUpCounter = Wakeup Time / Wakeup Time Base

    To configure the wake up timer to 4s the WakeUpCounter is:
    RTC_WAKEUPCLOCK_RTCCLK_DIV = RTCCLK_Div16 = 16
    Wakeup Time Base = 16 /(~32768Hz) = ~488.3us
    Wakeup Time = ~4s = 0,410ms  * WakeUpCounter
    ==> WakeUpCounter = 4s/488.3us = 8192 */

    i = stoptime * 2048;    //
//    // rtc 唤醒采用LSE时钟,第一参数,计数溢出唤醒;第二参数:进行16分频
//    HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, i, RTC_WAKEUPCLOCK_RTCCLK_DIV16);

//    /* Enter Stop Mode */
      HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
//      
//    HAL_IWDG_Refresh(&hiwdg);  //喂狗
//    dogtimes++;    //喂狗计数
//    dogtimes2++;

}

使用特权

评论回复
沙发
晚晚皆安| | 2022-12-22 05:48 | 只看该作者
按理来说,不应该唤醒能让功耗变高啊

使用特权

评论回复
板凳
偷吻月亮| | 2022-12-22 06:20 | 只看该作者
STOP是低功耗模式,唤醒肯定变成正常模式啊,功耗高也正常啊

使用特权

评论回复
地板
极客晨星| | 2022-12-22 06:52 | 只看该作者
你主频是不是变化了?提升了?

使用特权

评论回复
5
热爱童话世界| | 2022-12-22 07:24 | 只看该作者
环境更换了没?是不是有啥干扰了,导致功耗增加了啊

使用特权

评论回复
6
地下縱情搖擺| | 2022-12-22 07:56 | 只看该作者
300uA的话,有没有可能是程序那块运行导致的啊?

使用特权

评论回复
7
討厭和人归類| | 2022-12-22 08:28 | 只看该作者
是不是没进入到真正的STOP模式里呢?

使用特权

评论回复
8
林间有新绿| | 2022-12-22 09:00 | 只看该作者
你有可能需要等会儿,才会进入到深度睡眠之中吧

使用特权

评论回复
9
岁月反驳| | 2022-12-22 09:32 | 只看该作者
有什么外设没断电吗?比如485或者其他芯片等

使用特权

评论回复
10
漫过岁月| | 2022-12-22 10:04 | 只看该作者
以后可以设计低功耗的时候,这么做,就不用的外设都可以控制其断电就好了

使用特权

评论回复
11
占得人间第一春| | 2022-12-22 10:36 | 只看该作者
这玩意儿还仿真不了,真麻烦,你看看是不是哪里电容啊,或者小灯啊耗电

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

262

主题

1384

帖子

2

粉丝