我试图衡量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)万用表在低电流读数时不准确; 2)您的电路板上的其他组件仍然消耗功率,并且与您的测量值不相关。你使用什么样的电路板和电表,以及如何完成测量? – mbmcavoy
我将Voltcraft VC280万用表与μcurrentGOLD结合使用,以获得更高的准确度并降低负载电压。我还使用ST-LINK/V2(在线调试器和编程器)来调试和加载程序。我取下了连接到ST-LINK/V2的电线,电流消耗降低到2.8μA,这非常棒!我在PCB上有一个加速度计和RFID IC,测量完成时无需隔离微控制器。打开RFID由微控制器控制。所以它对当前的消费没有影响。 – nayak
在低功耗模式下,加速度计的总电源电流为13μA(根据数据表)。 – nayak