2017-08-29 89 views
1

我试图衡量STM32L011F4微控制器的电流消耗。我尝试了STM在'stm32cubel0'中提供的STANDBY模式示例代码。当我使用万用表测量时,待机模式电流消耗约为320μA。数据表显示,-40°C至25°C的温度范围内,独立看门狗和LSI关闭时,最大电流消耗为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(); 
} 
+1

我怀疑一对夫妇的事情:1)万用表在低电流读数时不准确; 2)您的电路板上的其他组件仍然消耗功率,并且与您的测量值不相关。你使用什么样的电路板和电表,以及如何完成测量? – mbmcavoy

+0

我将Voltcraft VC280万用表与μcurrentGOLD结合使用,以获得更高的准确度并降低负载电压。我还使用ST-LINK/V2(在线调试器和编程器)来调试和加载程序。我取下了连接到ST-LINK/V2的电线,电流消耗降低到2.8μA,这非常棒!我在PCB上有一个加速度计和RFID IC,测量完成时无需隔离微控制器。打开RFID由微控制器控制。所以它对当前的消费没有影响。 – nayak

+0

在低功耗模式下,加速度计的总电源电流为13μA(根据数据表)。 – nayak

回答

0

你会发现这些“超低功耗”声称有点饵正开关:-)

我一直与STML152x和STML071x。 >我<的经验是,你需要禁用(又名:DEINIT)上拉/下拉的针脚,以获得非常低的电流。例如,对于L073RZT6,我可以在STOP + RTC模式下将其降至大约4uA,并且只能通过杀死所有的perf,然后我们必须在唤醒时再次Init()。我在猜测,上拉/下拉以某种方式阻止了内部的Pwr Reg真正关闭到最低功率 - 正如我所说的那样,这是一个猜测。

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

随着L152x(皮质M3),我能骗和“缓存”的 - > MODER和 - > PUPDN值在SRAM中,然后在睡觉前明确。然后醒来后,恢复这些,生活是美好的。我还没有发现使用L07x(仅限于CM0),所以必须做更多的工作。我知道这听起来违反直觉,这些芯片被设计成深度睡眠,但花了我数周的试用时间 - n-error获得超低睡眠电流!其他

一个警告,STM32 CubeMX不能正确处理与HSI-只运行唤醒。芯片醒来假设可以切换到MSI,所以可以启用MSI,或阅读有关如何启用唤醒使用的-HSI时钟文档(在RCC-> CFGR位)

+0

哦,你还需要禁用所有的端口时钟,你在唤醒后重新启用。所以:__HAL_RCC_GPIOA_CLK_DISABLE();等等。在线的“示例程序”往往过于简单化并且忽略了这些细节。 – LinseLA