cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F107 excess power consumption in STOP mode

ASerg.1
Associate

Firstly, I want to say that there is no error on PCB because if I put MCU into standby, consumption is normal - around 5 uA.

I have experience with stop mode on STM32L0, but STM32F1 got to my hand for the first time.

For some reason, I can't achieve designed power consumption - it is always near 1 mA, which is 100 times more than it should be.

Furthermore, it looks that MCU just hangs after it's going to stop mode because I stop receiving interrupts from RTC, which have worked before I added instruction for going to stop.

My MCU is STM32F107VB

#include <stm32f1xx_hal.h>
 
 
 
RTC_HandleTypeDef hrtc;
 
 
 
#ifdef __cplusplus
 
extern "C"
 
#endif
 
void SysTick_Handler(void)
 
{
 
	HAL_IncTick();
 
	HAL_SYSTICK_IRQHandler();
 
}
 
 
 
#ifdef __cplusplus
 
extern "C"
 
#endif
 
void RTC_IRQHandler(void)
 
{
 
	HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_7);
 
	HAL_RTCEx_RTCIRQHandler(&hrtc);
 
}
 
 
 
void Error_Handler()
 
{
 
	__asm("bkpt 255");
 
	__asm("bx lr");
 
}
 
 
 
void display_initGpio(void)
 
{ 
 
	__HAL_RCC_GPIOB_CLK_ENABLE();
 
	__HAL_RCC_GPIOC_CLK_ENABLE();
 
	__HAL_RCC_GPIOD_CLK_ENABLE();
 
	__HAL_RCC_GPIOE_CLK_ENABLE();
 
 
 
	GPIO_InitTypeDef GPIO_InitStructure;
 
 
 
	GPIO_InitStructure.Pin = GPIO_PIN_3 | GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_14 | GPIO_PIN_15;
 
	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
 
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
 
	GPIO_InitStructure.Pull = GPIO_NOPULL;
 
	HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
 
 
 
	GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_5;
 
	GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
 
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
 
	GPIO_InitStructure.Pull = GPIO_PULLUP;
 
	HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
 
	
 
	GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_7 | GPIO_PIN_14;
 
	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
 
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
 
	GPIO_InitStructure.Pull = GPIO_NOPULL;
 
	HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
 
	
 
	GPIO_InitStructure.Pin = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6;
 
	GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
 
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
 
	GPIO_InitStructure.Pull = GPIO_NOPULL;
 
	HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
 
	
 
	GPIO_InitStructure.Pin = GPIO_PIN_9 | GPIO_PIN_10;
 
	GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
 
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
 
	GPIO_InitStructure.Pull = GPIO_NOPULL;
 
	HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
 
	
 
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);		// SCK
 
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);		// MOSI
 
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);		// A0
 
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);		// LCD_RESET
 
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);		// LCD_PWR
 
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);		// LCD_RESET
 
	
 
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_RESET); 		// CS
 
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_RESET); 		// LCD_LIGHT
 
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET); 	// LCD_RWR
 
}
 
 
 
void rtcInit(void)
 
{
 
	HAL_PWR_EnableBkUpAccess();
 
	/* Enable BKP CLK enable for backup registers */
 
	__HAL_RCC_BKP_CLK_ENABLE();
 
	/* Peripheral clock enable */
 
	__HAL_RCC_RTC_ENABLE();
 
	/* RTC interrupt Init */
 
	
 
	hrtc.Instance = RTC;
 
	hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
 
	hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
 
	if (HAL_RTC_Init(&hrtc) != HAL_OK)
 
	{
 
		Error_Handler();
 
	}
 
	
 
	HAL_RTCEx_SetSecond_IT(&hrtc);
 
	HAL_NVIC_SetPriority(RTC_IRQn, 0, 0);
 
	HAL_NVIC_EnableIRQ(RTC_IRQn);
 
}
 
 
 
void SystemClock_Config(void)
 
{
 
	RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };
 
	RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };
 
	RCC_PeriphCLKInitTypeDef PeriphClkInit = { 0 };
 
 
 
	__HAL_RCC_AFIO_CLK_ENABLE();
 
	__HAL_RCC_PWR_CLK_ENABLE();
 
	
 
	/** Initializes the RCC Oscillators according to the specified parameters
 
	* in the RCC_OscInitTypeDef structure.
 
	*/
 
	RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSI;
 
	RCC_OscInitStruct.HSIState = RCC_HSI_ON;
 
	RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
 
	RCC_OscInitStruct.LSIState = RCC_LSI_ON;
 
	RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
 
	RCC_OscInitStruct.PLL2.PLL2State = 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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
 
	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)
 
	{
 
		Error_Handler();
 
	}
 
	PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
 
	PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
 
	if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
 
	{
 
		Error_Handler();
 
	}
 
	/** Configure the Systick interrupt time
 
	*/
 
	__HAL_RCC_PLLI2S_ENABLE();
 
	
 
	HAL_NVIC_SetPriority(RCC_IRQn, 0, 0);
 
	HAL_NVIC_EnableIRQ(RCC_IRQn);
 
}
 
 
 
int main(void)
 
{
 
	HAL_Init();
 
	
 
	SystemClock_Config();
 
 
 
	__HAL_AFIO_REMAP_SWJ_NOJTAG();
 
	HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
 
 
 
	display_initGpio();
 
	rtcInit();
 
	
 
	HAL_Delay(100);
 
	
 
	while (1)
 
	{
 
		HAL_SuspendTick();
 
		__HAL_RCC_PWR_CLK_ENABLE();
 
		HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);	
 
	}
 
}

0 REPLIES 0