2017-08-29 61 views
1

STM32L011F4マイクロコントローラの消費電流を測定しようとしています。私は 'stm32cubel0'でSTMによって提供されるSTANDBYモードのサンプルコードを試しました。私がマルチメータを使って測定したときのスタンバイモードの消費電流は約320μAです。データシートによれば、独立したウォッチドッグとLSIのオフで、-40℃〜25℃の温度で最大消費電流は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

私はより高い精度と負荷電圧を低減するために、Volcraft VC280マルチメーターをμcurrentGOLDと組み合わせて使用​​しています。また、プログラムのデバッグやロードにST-LINK/V2(インサーキットデバッガとプログラマ)を使用していました。 ST-LINK/V2に接続しているワイヤを外し、消費電流を2.8μAに減らしました。これは素晴らしいことです!私は加速度計とRFID ICをPCB上に持っており、測定はマイクロコントローラを分離することなく行われます。 RFIDの電源は、マイクロコントローラによって制御されます。したがって、電流消費には影響しません。 – nayak

+0

低電力モードでは、加速度計の合計消費電流は13μAです(データシート参照)。 – nayak

答えて

0

あなたはこれらの '超低消費電力' を見つけることができます私はSTML152xとSTML071xに取り組んできました

:-)餌-N-スイッチのビットを主張します。 > MY <経験値は、非常に低い電流を得るためにプルアップ/プルダウン付きのピンを無効にする必要があるということです(別名:DeInit)。例えば、L073RZT6では、32Kのext LSEを使用してSTOP + RTCモードで約4uAにまで低下させることができますが、すべてのperfを強制終了するだけで、起動時に再びInit()する必要があります。私はプルアップ/プルダウンが内部Pwr Regが真に最低電力にシャットダウンするのをどうにかして防ぐことを考えています - 私が言ったように、それは推測です。

スリープ電流が約35uA(スペックごとに内部プルダウンがあります)を追加するように見えるので、私は「PWR_WAKEUP_PINx」の使用もあきらめました。代わりに、そのピンをGPIO_Input(外部100Kプルアップ付き)として定義し、IRQサポートを有効にします。それはちょうど良いSTOPから目を覚ます。私の製品では、私はリードスイッチを持っているので、ユーザーがケースの外にスワイプし、磁石がデバイスを目覚めさせます。このGPIOは唯一のGPIOです。私が眠ったらGPIO_Analogに設定されず、私の4uAを達成します。幸いにも、私たちの製品は、5分、15分、または60分に1回起きる傾向があります。したがって、スリープ解除/スリープのCPUコストは、DeepSleepで検出された時間の99.999%と同じほど重要ではありません。

L152x(Cortex M3)では、SRAMの - > MODERと - > PUPDNの値をCHEATして 'キャッシュ'してから、スリープする前にクリアすることができました。その後、目を覚ました後、これらを復元し、人生は良いです。私はL07x(CM0のみ)で作業していることを発見していないので、より多くの作業をしなければなりません。私はこれが直感的ではないことを知っています。これらのチップは深い睡眠に設計されていますが、試行錯誤で数週間かかりました。

STM32 CubeMXは、HSIのみ実行中のWakeupを適切に処理しません。チップがMSIに切り替えることができると仮定した場合、MSIを有効にするか、Wake-Up-to-Use-HSIクロックを有効にする方法についてのドキュメントをお読みください(RCC-> CFGRのビットです)

+0

ああ、また、すべてのポートクロックを無効にする必要があります。だから:__HAL_RCC_GPIOA_CLK_DISABLE();オンラインの「サンプルプログラム」はあまりにも単純すぎてそのような詳細をスキップする傾向があります。 – LinseLA

関連する問題