2017-08-29 1 views
1

J'essaie de mesurer la consommation de courant dans le microcontrôleur STM32L011F4. J'ai essayé le code exemple du mode STANDBY fourni par STM dans 'stm32cubel0'. La consommation de courant en mode veille est d'environ 320μA lorsque je l'ai mesuré à l'aide d'un multimètre. La fiche technique indique que la consommation de courant maximale est de 0,6μA pour une température comprise entre -40 ° C et 25 ° C avec le chien de garde indépendant et LSI OFF. Le code est montré ci-dessous. Est-ce que quelqu'un a une idée pourquoi la consommation actuelle est plus que prévu?La consommation de courant en mode veille n'est pas réduite à la valeur attendue

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

Je soupçonnerais un couple des choses: 1) Votre multimètre n'est pas précis aux lectures de courant faible et 2) votre conseil a d'autres composants qui consomment toujours de l'énergie, et ne sont pas isolés de votre mesure. Quel tableau et quel compteur utilisez-vous, et comment réalisez-vous la mesure? – mbmcavoy

+0

J'utilise le multimètre Voltcraft VC280 en combinaison avec μcurrent GOLD pour une plus grande précision et pour réduire la tension de charge. J'utilisais également ST-LINK/V2 (un débogueur et un programmeur en circuit) pour le débogage et le chargement du programme. J'ai enlevé les fils se connectant à ST-LINK/V2 et la consommation de courant réduite à 2.8μA ce qui est génial! J'ai un accéléromètre et un IC RFID sur le PCB et les mesures sont effectuées sans isoler le microcontrôleur. L'activation du RFID est contrôlée par le microcontrôleur. Cela n'a donc aucun effet sur la consommation actuelle. – nayak

+0

Le courant total d'alimentation de l'accéléromètre est de 13μA en mode basse consommation (selon la fiche technique). – nayak

Répondre

0

Vous trouverez ces 'ultra-faible puissance' revendique un peu d'appât-n-switch :-)

Je travaille avec STML152x et STML071x. > MY < l'expérience est que vous devez désactiver (aka: DeInit) toutes les broches avec pull-up/pull-down pour obtenir le très faible courant. Par exemple, avec un L073RZT6 je peux l'abaisser à environ 4uA en STOP + mode RTC avec extension LSE de 32K, mais seulement en tuant toutes les perf, que je dois alors à nouveau Init() au réveil. J'estime que ce pull-up/pull-down empêche en quelque sorte le Pwr Reg interne de vraiment se réduire à la plus faible puissance - comme je l'ai dit, c'est une conjecture. J'ai également abandonné l'utilisation de tout "PWR_WAKEUP_PINx", car ceux-ci semblent ajouter environ 35uA de courant de veille (par Spec, ils ont interne pull-down). Au lieu de cela, je définis cette broche comme GPIO_Input (avec extraction externe 100K) et activer le support IRQ. Il se réveille de STOP très bien. Dans mes produits, j'ai un interrupteur magnétique, donc les utilisateurs «glissent» hors du boîtier, et l'aimant réveille l'appareil. Ce GPIO est le seul GPIO que je laisse non configuré à GPIO_Analog quand je dors (et accomplit mon 4uA). Heureusement, nos produits ont tendance à se réveiller une fois par 5, 15 ou même 60 minutes. Ainsi, le coût du processeur pour réveiller/dormir n'est pas aussi critique que 99,999% du temps qu'il se trouve dans DeepSleep. Avec le L152x (Cortex M3), j'ai pu récupérer et mettre en cache les valeurs -> MODER et -> PUPDN dans SRAM, puis effacer avant de dormir. Puis après le réveil, restaurez-les et la vie est bonne. Je n'ai pas trouvé que travailler sur le L07x (CM0 seulement), donc je dois faire plus de travail. Je sais que cela semble contre-intuitif, que ces puces sont conçues pour dormir profondément, mais il m'a fallu des semaines d'essai-n-erreur obtenir le courant de sommeil ultra-faible! Un autre avertissement, STM32 CubeMX ne gère pas correctement le réveil avec l'exécution uniquement HSI. Chip se réveille en supposant que vous pouvez passer à MSI, soit activer MSI, ou lire vos documents sur la façon d'activer l'horloge HSI de réveil-à-utiliser (est un peu dans RCC-> CFGR)

+0

Oh, vous devez également désactiver toutes les horloges de port, que vous réactivez après le réveil. Donc avec: __HAL_RCC_GPIOA_CLK_DISABLE(); Les «exemples de programmes» en ligne ont tendance à être trop simplistes et à ignorer ces détails. – LinseLA