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();
}
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
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
Le courant total d'alimentation de l'accéléromètre est de 13μA en mode basse consommation (selon la fiche technique). – nayak