2017-08-29 92 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