You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32L0系列USART唤醒停止模式功耗过高(40uA)求助

STM32L0停止模式功耗过高(40uA)排查与优化

问题概述

使用STM32L0系列单片机,通过USART和GPIO中断唤醒停止模式,但停止模式下功耗达40uA,远高于目标1uA。已完成以下配置但问题未解决:

  • 禁用PVD
  • 使用4MHz HSI时钟
  • 设置RCC电压缩放等级为3

现有代码

HAL_PWR_DisablePVD();

HAL_UARTEx_ReceiveToIdle_IT(&huart2,RxBuffer,10);
//HAL_UART_Receive_IT(&huart2,Rx_data,1);
//HAL_UART_Receive_IT(&huart2,RxBuffer,5);
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
   str = "Going into SLEEP MODE in 5 seconds\r\n";
                HAL_UART_Transmit(&huart2, (uint8_t *)str, strlen (str), HAL_MAX_DELAY);
              WakeUpEvent.WakeUpEvent=UART_WAKEUP_ON_STARTBIT;

              HAL_UARTEx_StopModeWakeUpSourceConfig(&huart2,WakeUpEvent);
                HAL_UARTEx_EnableStopMode(&huart2);
               HAL_SuspendTick();
               HAL_PWREx_EnableUltraLowPower();
              HAL_PWREx_EnableFastWakeUp();
              HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
            HAL_Delay(5000);
}

排查与优化建议

1. 外设时钟与状态检查

  • 关闭所有未使用外设的时钟:SPI、I2C、ADC、定时器等默认可能开启,会额外消耗功耗。进入停止模式前添加如下代码(根据实际硬件调整):
    __HAL_RCC_SPI1_CLK_DISABLE();
    __HAL_RCC_I2C1_CLK_DISABLE();
    __HAL_RCC_ADC1_CLK_DISABLE();
    __HAL_RCC_TIM2_CLK_DISABLE();
    
  • 确认USART状态:进入停止模式前,确保USART无 pending 中断请求,HAL_UARTEx_ReceiveToIdle_IT产生的中断是否已处理完毕?若未处理,会导致USART处于活跃状态增加功耗。

2. GPIO引脚优化

  • 所有未使用的GPIO必须配置为模拟输入模式(无上下拉),避免浮空引脚产生的漏电流:
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_All;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    // 注意保留用于唤醒的GPIO,单独配置为EXTI中断模式
    
  • 用于唤醒的GPIO需确认EXTI线路仅启用所需中断,其他EXTI中断全部禁用。

3. 电源与时钟配置调整

  • 调整代码执行顺序:先配置低功耗参数,再挂起滴答定时器,最后进入停止模式,确保状态切换正确:
    // 配置UART唤醒源
    WakeUpEvent.WakeUpEvent = UART_WAKEUP_ON_STARTBIT;
    HAL_UARTEx_StopModeWakeUpSourceConfig(&huart2, WakeUpEvent);
    HAL_UARTEx_EnableStopMode(&huart2);
    
    // 启用超低功耗模式
    HAL_PWREx_EnableUltraLowPower();
    HAL_PWREx_EnableFastWakeUp();
    
    // 挂起滴答定时器
    HAL_SuspendTick();
    
    // 进入停止模式
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
    
    // 唤醒后恢复滴答定时器
    HAL_ResumeTick();
    
  • 确认电压缩放等级3生效:读取PWR->CR寄存器的VOS位,确保配置正确。若未生效,检查__HAL_RCC_PWR_CLK_ENABLE()是否已调用。
  • 评估HSI是否必要:若USART唤醒无需HSI,可在进入停止模式前切换到LSI时钟并关闭HSI,进一步降低功耗。

4. 其他潜在功耗源

  • 检查是否启用了调试接口(如SWD/JTAG):调试接口在停止模式下若未关闭,会增加功耗。进入停止前添加:
    __HAL_RCC_DEBUGMCU_CLK_DISABLE();
    
  • 确认SRAM供电模式:HAL_PWREx_EnableUltraLowPower()会自动配置SRAM进入低功耗模式,确保该函数调用在进入停止模式之前。

内容的提问来源于stack exchange,提问作者Samet Özdemir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 06:33:25