待机模式电流消耗不会降低到预期值

问题描述 投票:1回答:1

我正在尝试测量STM32L011F4微控制器的电流消耗。我尝试了STM在'stm32cubel0'中提供的STANDBY模式示例代码。使用万用表测量时,待机模式的电流消耗约为320μA。数据表显示,在-40°C至25°C的温度范围内,独立看门狗和LSI OFF时,最大电流消耗为0.6μA。代码如下所示。有谁知道为什么目前的消费量超出预期?

int main(void)
{
  /* STM32L0xx HAL library initialization */
  HAL_Init();



  /* Configure the system clock to 2 MHz */
  SystemClock_Config();



  /* System Power Configuration */
  SystemPower_Config()  ;

  /* Check if the system was resumed from Standby mode */
  if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
  {
    /* Clear Standby flag */
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
  }



  /* Insert 5 seconds delay */
  HAL_Delay(5000);



 /* The Following Wakeup sequence is highly recommended prior to each Standby mode entry
    mainly when using more than one wakeup source this is to not miss any wakeup event.
     - Disable all used wakeup sources,
     - Clear all related wakeup flags,
     - Re-enable all used wakeup sources,
     - Enter the Standby mode.
  */



  /* Disable all used wakeup sources: PWR_WAKEUP_PIN3 */
  HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN3);



  /* Clear all related wakeup flags*/
  __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);

  /* Enable WakeUp Pin PWR_WAKEUP_PIN3 connected to PA.02 (Arduino A7) */
  HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN3);



  /* Enter the Standby mode */
  HAL_PWR_EnterSTANDBYMode();



  /* This code will never be reached! */
  while (1)
  {
  }
}



/**
  * @brief  System Clock Configuration
  *         The system Clock is configured as follow :
  *            System Clock source            = MSI
  *            SYSCLK(Hz)                     = 2000000
  *            HCLK(Hz)                       = 2000000
  *            AHB Prescaler                  = 1
  *            APB1 Prescaler                 = 1
  *            APB2 Prescaler                 = 1
  *            Flash Latency(WS)              = 0
  *            Main regulator output voltage  = Scale3 mode
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  /* Enable MSI Oscillator */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5;
  RCC_OscInitStruct.MSICalibrationValue=0x00;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)
  {
    /* Initialization Error */
    while(1);
  }

  /* Select MSI as system clock source and configure the HCLK, PCLK1 and PCLK2
     clocks dividers */
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK |  RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;  
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;  
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0)!= HAL_OK)
  {
    /* Initialization Error */
    while(1);
  }
  /* Enable Power Control clock */
  __HAL_RCC_PWR_CLK_ENABLE();

  /* The voltage scaling allows optimizing the power consumption when the device is
     clocked below the maximum system frequency, to update the voltage scaling value
     regarding system frequency refer to product datasheet.  */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);

  /* Disable Power Control clock */
  __HAL_RCC_PWR_CLK_DISABLE();

}



/**
  * @brief  System Power Configuration
  *         The system Power is configured as follow :
  *            + VREFINT OFF, with fast wakeup enabled
  *            + No IWDG
  *            + Wakeup using PWR_WAKEUP_PIN3
  * @param None
  * @retval None
  */
static void SystemPower_Config(void)
{
  /* 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();
}

/**
  * @brief Enters Standby mode.
  * @note In Standby mode, all I/O pins are high impedance except for:
  *          - Reset pad (still available) 
  *          - RTC_AF1 pin (PC13) if configured for tamper, time-stamp, RTC
  *            Alarm out, or RTC clock calibration out.
  *          - RTC_AF2 pin (PC13) if configured for tamper.
  *          - WKUP pin 1 (PA00) if enabled.
  *          - WKUP pin 2 (PC13) if enabled.
  *          - WKUP pin 3 (PE06) if enabled, for stm32l07xxx and stm32l08xxx devices only.
  *          - WKUP pin 3 (PA02) if enabled, for stm32l031xx devices only.
  * @retval None
  */
void HAL_PWR_EnterSTANDBYMode(void)
{
  /* Select Standby mode */
  SET_BIT(PWR->CR, PWR_CR_PDDS);

  /* Set SLEEPDEEP bit of Cortex System Control Register */
  SET_BIT(SCB->SCR, SCB_SCR_SLEEPDEEP_Msk);

  /* This option is used to ensure that store operations are completed */
#if defined ( __CC_ARM)
  __force_stores();
#endif
  /* Request Wait For Interrupt */
  __WFI();
}
stm32
1个回答
1
投票

你会发现这些'超低功率'声称有点诱饵 - 开关:-)

我一直在使用STML152x和STML071x。 > MY <经验是你需要通过上拉/下拉来禁用(也就是:DeInit)任何引脚以获得非常低的电流。例如,对于L073RZT6,我可以在STOP + RTC模式下将其降低到大约4uA,其中ext LSE为32K,但只能通过杀死所有的perf,然后我必须在唤醒时再次使用Init()。我担心上拉/下拉会以某种方式阻止内部Pwr Reg真正关闭到最低功率 - 正如我所说,这是一个猜测。

我也放弃了使用任何“PWR_WAKEUP_PINx”,因为它们似乎增加了大约35uA的睡眠电流(每个规格它们有内部下拉)。相反,我将该引脚定义为GPIO_Input(使用外部100K上拉)并启用IRQ支持。它从STOP中醒来就好了。在我的产品中,我有一个磁簧开关,所以用户在外壳上“滑动”,磁铁唤醒设备。这个GPIO是我睡觉时没有设置为GPIO_Analog的唯一GPIO(并完成我的4uA)。幸运的是,我们的产品每5,15甚至60分钟就会醒来一次。因此,唤醒/睡眠的CPU成本并不像它在DeepSleep中发现的99.999%那样重要。

使用L152x(Cortex M3),我能够在SRAM中“CHEAT”和“缓存” - > MODER和 - > PUPDN值,然后在睡眠前清除。然后醒来后,恢复这些,生活是美好的。我没有发现在L07x(仅限CM0)上工作,所以必须做更多的工作。我知道这听起来违反直觉,这些芯片设计为深度睡眠,但是我需要花费数周的时间才能获得超低睡眠电流!

另一个警告,STM32 CubeMX没有正确处理仅使用HSI的唤醒。芯片唤醒假设可以切换到MSI,因此要么启用MSI,要么读取有关如何启用唤醒使用-HSI时钟的文档(在RCC-> CFGR中有点)

© www.soinside.com 2019 - 2024. All rights reserved.