本次来测试一下STM32U385几种低功耗模式.
一、STM32U385RG有几种低功耗模式
1、睡眠模式(Sleep Mode)
1)特性:CPU 时钟关闭,所有外设包括 Cortex-M33 内核,如 NVIC 和 SysTick可以在中断或事件发生时运行并唤醒 CPU
2)进入条件:CPU时钟关闭,但外设(如NVIC、SysTick)仍运行。
3)唤醒方式:任意中断或事件触发唤醒(如GPIO中断、定时器中断)。
2、停止模式(Stop Modes)
分为四级子模式(Stop 0/1/2/3)
1)特性
所有时钟关闭,除了LSE和LSI
2)唤醒源:外部中断(EXTI)、RTC闹钟、低功耗定时器
3、待机模式(Standby Mode)
1)特性:
关闭核心域电源,仅备份域和可选SRAM2保留(可配置保留8/24/32KB)。
支持BOR(欠压复位)超低功耗配置。
2)唤醒方式:NRST引脚复位、RTC事件、WKUP引脚边沿触发、IWDG复位等。唤醒后时钟:MSI(≤12MHz)。
4、关机模式(Shutdown Mode)
1)特性:
功耗最低,关闭所有稳压器和振荡器(包括HSI/MSI/LSI)。无BOR电压监控,不支持备份域切换。
2)唤醒方式:NRST复位、WKUP引脚事件、RTC事件。唤醒后时钟:MSI(12MHz)。
5、官方手册各个模式对比
包含了进入和唤醒源以及时钟

二、编写低功耗测试代码
1、测试条件
1)VDD 3.3V
2)时钟使用MSI,并且时钟频率为3MHz
2、新建工程
这块步骤就不写了,主要进行时钟配置以及开启ICACE
3)编写代码
功耗代码如下
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2025 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "icache.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define LP_SLEEP_MODE 0
#define LP_STOP0_MODE 0
#define LP_STOP1_MODE 0
#define LP_STOP2_MODE 0
#define LP_STOP3_MODE 0
#define LP_STANDBY_MODE 0
#define LP_SHUTDOWN_MODE 0
#define LP_POWER_TEST 0
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* Enable the SMPS regulator to improve power efficiency */
if(HAL_PWREx_ConfigSupply(PWR_SMPS_SUPPLY) != HAL_OK)
{
Error_Handler();
}
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ICACHE_Init();
/* USER CODE BEGIN 2 */
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
/* Insert 5 seconds delay */
//HAL_Delay(5000);
/* Suspend Tick increment to prevent wakeup by Systick interrupt. */
/* Otherwise the Systick interrupt will wake up the device within 1ms */
/* (HAL time base). */
#if LP_POWER_TEST
HAL_SuspendTick();
#endif
#if LP_SLEEP_MODE
/* Disable Prefetch Buffer */
__HAL_FLASH_PREFETCH_BUFFER_DISABLE();
/* Enter Sleep Mode , wake up is done once User push-button is pressed */
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
#elif LP_STOP0_MODE
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERMODE_STOP0, PWR_STOPENTRY_WFI);
#elif LP_STOP1_MODE
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERMODE_STOP1, PWR_STOPENTRY_WFI);
#elif LP_STOP2_MODE
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERMODE_STOP2, PWR_STOPENTRY_WFI);
#elif LP_STOP3_MODE
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERMODE_STOP3, PWR_STOPENTRY_WFI);
#elif LP_STANDBY_MODE
/* Enter the Standby mode */
HAL_PWR_EnterSTANDBYMode();
#elif LP_SHUTDOWN_MODE
/* Enter shutdown mode */
HAL_PWREx_EnterSHUTDOWNMode();
#endif
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Configure the main internal regulator output voltage
*/
if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE2) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSIS;
RCC_OscInitStruct.MSISState = RCC_MSI_ON;
RCC_OscInitStruct.MSISSource = RCC_MSI_RC1;
RCC_OscInitStruct.MSISDiv = RCC_MSI_DIV8;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
|RCC_CLOCKTYPE_PCLK3;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSIS;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
三、下载测试各个模式下的功耗
1、运行模式
257.36uA

2、睡眠模式
235.24uA

3、STOP 0模式
143.39uA

4、STOP 1模式
142.91uA

5、STOP 2模式
83.56uA

6、STOP 3模式
81.22uA

7、待机模式
81.22uA

8、关断模式
79.43uA

综上。可以看见,低功耗做的是非常好,停止模式3 81uA.