STM32L071低功耗下不去,求助

2019-07-21 04:23发布

目前做的一块L071的板子,把外设基本都拆了,留了两个晶振,一个电池稳压芯片.进入stop+rtc之前,关了中断,默认初始化,把IO全设为无上下拉模拟,ADC、SPI和I2c的引脚改为无上下拉输出,并输出0。外设去使能。关闭全部外设的时钟。
从电池供电口串电流表测量的时候,低功耗模式一直是400ua,有没有大佬支个招。

附上我进低功耗之前的处理函数。


[mw_shl_code=c,true]void my_lp()
{

    LL_GPIO_InitTypeDef GPIO_InitStructure;   

    NVIC_DisableIRQ(TIM2_IRQn);
    NVIC_DisableIRQ(EXTI2_3_IRQn);
    NVIC_DisableIRQ(EXTI0_1_IRQn);
    NVIC_DisableIRQ(RCC_IRQn);
    LL_GPIO_DeInit(GPIOA);
    LL_GPIO_DeInit(GPIOB);   
    LL_GPIO_DeInit(GPIOC);
    LL_ADC_DeInit(ADC1);

   
   
   
    LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA|LL_IOP_GRP1_PERIPH_GPIOB|LL_IOP_GRP1_PERIPH_GPIOC);

    GPIO_InitStructure.Pin= GPIO_PIN_All;
    GPIO_InitStructure.Speed= GPIO_SPEED_FREQ_LOW;
    GPIO_InitStructure.Mode= GPIO_MODE_ANALOG;
    GPIO_InitStructure.Pull       = LL_GPIO_PULL_NO;
    LL_GPIO_Init(GPIOA, &GPIO_InitStructure);
    LL_GPIO_Init(GPIOB, &GPIO_InitStructure);
    LL_GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_InitStructure.Pin= GPIO_PIN_15;
    GPIO_InitStructure.Speed= GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStructure.Mode= GPIO_MODE_ANALOG;
    GPIO_InitStructure.Pull       = LL_GPIO_PULL_NO;
    LL_GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.Pin= GPIO_PIN_0;
    GPIO_InitStructure.Speed= GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStructure.Mode= GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.Pull       = LL_GPIO_PULL_NO;
    LL_GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.Pin= GPIO_PIN_14|GPIO_PIN_15;
    GPIO_InitStructure.Speed= GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStructure.Mode= GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.Pull       = LL_GPIO_PULL_NO;
    LL_GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_InitStructure.Pin= GPIO_PIN_9;
    GPIO_InitStructure.Speed= GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStructure.Mode= GPIO_MODE_OUTPUT_OD;
    GPIO_InitStructure.Pull       = LL_GPIO_PULL_NO;
    LL_GPIO_Init(GPIOA, &GPIO_InitStructure);


    // spi io A4 A5 A6 A7
    LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_4, LL_GPIO_MODE_ANALOG);
    LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_4, LL_GPIO_SPEED_FREQ_HIGH);
    LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_4, LL_GPIO_PULL_NO);

    LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_5, LL_GPIO_MODE_ANALOG);
    LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_5, LL_GPIO_SPEED_FREQ_HIGH);
    LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_5, LL_GPIO_PULL_NO);

    LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_6, LL_GPIO_MODE_ANALOG);
    LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_6, LL_GPIO_SPEED_FREQ_HIGH);
    LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_6, LL_GPIO_PULL_NO);

    LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_7, LL_GPIO_MODE_ANALOG);
    LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_7, LL_GPIO_SPEED_FREQ_HIGH);
    LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_7, LL_GPIO_PULL_NO);   

    // adc io A2
    LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_2, LL_GPIO_MODE_ANALOG);
    LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_2, LL_GPIO_SPEED_FREQ_HIGH);
    LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_2, LL_GPIO_PULL_NO);



    LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_5|LL_GPIO_PIN_6|LL_GPIO_PIN_7|LL_GPIO_PIN_8|LL_GPIO_PIN_9|LL_GPIO_PIN_11|LL_GPIO_PIN_12);
    LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_14|LL_GPIO_PIN_15);

    LL_IOP_GRP1_DisableClock(LL_IOP_GRP1_PERIPH_ALL);

    LL_APB2_GRP1_DisableClock(LL_APB2_GRP1_PERIPH_ALL);
    LL_APB1_GRP1_DisableClock(LL_APB1_GRP1_PERIPH_ALL);


    LL_USART_Disable(USART1);
    LL_SPI_Disable(SPI1);
    LL_I2C_Disable(I2C3);
    LL_ADC_Disable(ADC1);     
    LL_TIM_DisableCounter(TIM2);

}[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
32条回答
lvkanger
2019-07-24 18:57
也无晴丶 发表于 2019-3-13 15:46
目前断掉其他外设的供电,41ua。然后有俩问题还想请教下,
1,我看手册上说的stop with rtc模式,会关闭 ...

1.电压模式HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE2);
2.RTC使用外部晶振功耗可以忽略。
3.我的进入stop模式的函数
void Enter_Stop_Mode(void)
{
        HAL_RCCEx_WakeUpStopCLKConfig(RCC_STOP_WAKEUPCLOCK_MSI);//配置退出stop模式后系统时钟为MSI 100K
        HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
}
4.__HAL_RCC_PWR_CLK_ENABLE();这个时钟要打开。
5.让程序完成初始化之后直接进入stop模式测功耗看看。调整进stop模式的位置,看功耗的变化情况。
比如:
时钟设置;
IO初始化;
stop;//记录功耗
串口初始化;
stop;//记录功耗
ADC初始化;
stop;//记录功耗
...
这样一步一步的去调,看功耗的变化再去分析。

这都是我之前调试的一些经验,可以参考一下。
功耗这块容易出问题的也就是时钟和IO口了。

一周热门 更多>