cancel
Showing results for 
Search instead for 
Did you mean: 

STM32U5 - achieving low power (micro ampere range)

_Danny_
Associate III

Hi,
We are currently utilizing a custom-designed STM32U5G7 microcontroller for our application with the MSI clock configured to 1 MHz. Despite configuring the device in Sleep and Stop modes, with all GPIO pins set to input and one pin configured as an EXTI interrupt for wake-up, we are observing a current draw of approximately 2mA. Our goal is to reduce the current consumption to the micro ampere range. Could you provide guidance on further optimizing power management and implementing lower-power modes?

I have attached the code ,pin out configuration and current drawn  measured using Otii.

_Danny__0-1743056824480.png

_Danny__1-1743056858029.png

_Danny__2-1743056957591.png

/* 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 "memorymap.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 */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
volatile uint8_t wakeUpFlag = 0;

/* 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 */

void SleepMode()
{
HAL_SuspendTick();
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
HAL_ResumeTick();
}



/* 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 */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */

SleepMode();


/* 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_SCALE4) != HAL_OK)
{
Error_Handler();
}

/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
RCC_OscInitStruct.MSIState = RCC_MSI_ON;
RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_4;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
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_MSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV4;
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.
*  file: pointer to the source file name
*  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 */

Edit: code formatting

1 ACCEPTED SOLUTION

Accepted Solutions
Amel NASRI
ST Employee

Hi @_Danny_ ,

To optimize power consumption, it is recommended to configure unused pins in analog mode (instead of input floating).

To do it with STM32CubeMX, please follow this article: How to minimize the power consumption in low power mode: An example using NUCLEO-F401RE board.

Please try and let me know if there is any difference.

-Amel

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.

View solution in original post

2 REPLIES 2
Amel NASRI
ST Employee

Hi @_Danny_ ,

To optimize power consumption, it is recommended to configure unused pins in analog mode (instead of input floating).

To do it with STM32CubeMX, please follow this article: How to minimize the power consumption in low power mode: An example using NUCLEO-F401RE board.

Please try and let me know if there is any difference.

-Amel

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.


@_Danny_ wrote:

a custom-designed STM32U5G7 microcontroller


You mean a custom-designed board ?

Please provide the schematic of the board.

 


@_Danny_ wrote:

we are observing a current draw of approximately 2mA.


How, exactly, are you observing that?

 

You will need to physically disconnect any debugger to see true low-power operation.

You may also need a power-cycle (not just a reset) after disconnecting a debugger.

 

Presentation on STM32U5 Power management:

https://www.st.com/content/ccc/resource/training/technical/product_training/group1/95/38/81/9b/cb/0d/43/89/STM32U5-System-Power-management_PWRMNGMNT/files/STM32U5-System-Power-management_PWRMNGMNT.pdf/_jcr_content/translations/en.STM32U5-System-Power-management_PWRMNGMNT.pdf

 

Other resources:

https://wiki.stmicroelectronics.cn/stm32mcu/wiki/Getting_started_with_LPBAM

https://www.youtube.com/watch?v=fm-IcVh5WI0

https://wiki.stmicroelectronics.cn/stm32mcu/wiki/Introduction_to_Low_power_with_STM32

https://www.st.com/en/microcontrollers-microprocessors/stm32u5f7-5g7/documentation.html - search for "power"

A complex system that works is invariably found to have evolved from a simple system that worked.
A complex system designed from scratch never works and cannot be patched up to make it work.