Skip to main content
AlexSmart
Associate III
September 29, 2021
Solved

STM32H743 RTC Wakeup

Im trying to configure RTC for periodic autowakeup, and have no clue why it is now working properly. RTC_WKUP_IRQHandler called immediately and again and again, even though wakeup flag is cleared, resulting 2.4 MHz at LED2 (LED2_GPIO_Port->ODR ^= LED2_Pin;)

void RTC_Init(void)
{
	RTCHandle.Instance				= RTC;
	RTCHandle.Init.HourFormat 		= RTC_HOURFORMAT_24;
	RTCHandle.Init.AsynchPrediv 	 = 127;
	RTCHandle.Init.SynchPrediv 		= 255;
	RTCHandle.Init.OutPut 			= RTC_OUTPUT_DISABLE;
	RTCHandle.Init.OutPutPolarity 	 = RTC_OUTPUT_POLARITY_HIGH;
	RTCHandle.Init.OutPutType 		= RTC_OUTPUT_TYPE_OPENDRAIN;
	RTCHandle.Init.OutPutRemap 		= RTC_OUTPUT_REMAP_NONE;
	HAL_RTC_Init(&RTCHandle);
	
	HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle); 
	HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 1, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);
}
void RTC_WKUP_IRQHandler(void)
{
	LED2_GPIO_Port->ODR ^= LED2_Pin;
	if (__HAL_RTC_WAKEUPTIMER_GET_FLAG(&RTCHandle, RTC_FLAG_WUTF) != 0U)
	{
		__HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&RTCHandle, RTC_FLAG_WUTF);
	}
}
void SystemPeripheryInit(void)
{
	HAL_Init();
	SystemClock_Config();
	
	SCB_InvalidateICache();
	SCB_EnableICache();
	
	SCB_InvalidateDCache();
	SCB_DisableDCache(); // for correct DMA operation
	
	MX_GPIO_Init();
 
	RTC_Init();
}
void SystemClock_Config(void)
{
	RCC_OscInitTypeDef RCC_OscInitStruct = {0};
	RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; 
	RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
	
	HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
	__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
	while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) 
	{
	}
	__HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);
 
	RCC_OscInitStruct.OscillatorType 	= RCC_OSCILLATORTYPE_HSE;
	RCC_OscInitStruct.HSEState 			= RCC_HSE_ON;
	RCC_OscInitStruct.PLL.PLLState		= RCC_PLL_ON;
	RCC_OscInitStruct.PLL.PLLSource 	= RCC_PLLSOURCE_HSE;
	RCC_OscInitStruct.PLL.PLLM 			= 1;
	RCC_OscInitStruct.PLL.PLLN 			= 80;
	RCC_OscInitStruct.PLL.PLLP 			= 2;
	RCC_OscInitStruct.PLL.PLLQ 			= 2;
	RCC_OscInitStruct.PLL.PLLR 			= 2;
	RCC_OscInitStruct.PLL.PLLRGE 		= RCC_PLL1VCIRANGE_3;
	RCC_OscInitStruct.PLL.PLLVCOSEL 	= RCC_PLL1VCOWIDE;
	RCC_OscInitStruct.PLL.PLLFRACN 		= 0;
	if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
	{
		Error_Handler();
	}
	RCC_ClkInitStruct.ClockType = 	RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
									|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
									|RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
	RCC_ClkInitStruct.SYSCLKSource 		= RCC_SYSCLKSOURCE_PLLCLK;
	RCC_ClkInitStruct.SYSCLKDivider 	= RCC_SYSCLK_DIV1;
	RCC_ClkInitStruct.AHBCLKDivider 	= RCC_HCLK_DIV2;
	RCC_ClkInitStruct.APB3CLKDivider 	= RCC_APB3_DIV2;
	RCC_ClkInitStruct.APB1CLKDivider 	= RCC_APB1_DIV2;
	RCC_ClkInitStruct.APB2CLKDivider 	= RCC_APB2_DIV2;
	RCC_ClkInitStruct.APB4CLKDivider 	= RCC_APB4_DIV2;
 
	if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
	{
		Error_Handler();
	}
	PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART3|RCC_PERIPHCLK_USART2
 |RCC_PERIPHCLK_UART4|RCC_PERIPHCLK_UART7
 |RCC_PERIPHCLK_FDCAN|RCC_PERIPHCLK_USART1
 |RCC_PERIPHCLK_UART8|RCC_PERIPHCLK_UART5
 |RCC_PERIPHCLK_SPI4|RCC_PERIPHCLK_ADC
 |RCC_PERIPHCLK_I2C1|RCC_PERIPHCLK_USB;
	PeriphClkInitStruct.PLL2.PLL2M 		= 1;
	PeriphClkInitStruct.PLL2.PLL2N 		= 80;
	PeriphClkInitStruct.PLL2.PLL2P 		= 2;
	PeriphClkInitStruct.PLL2.PLL2Q 		= 12;
	PeriphClkInitStruct.PLL2.PLL2R 		= 2;
	PeriphClkInitStruct.PLL2.PLL2RGE 	= RCC_PLL2VCIRANGE_3;
	PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
	PeriphClkInitStruct.PLL2.PLL2FRACN 	= 0;
	PeriphClkInitStruct.PLL3.PLL3M 		= 1;
	PeriphClkInitStruct.PLL3.PLL3N 		= 80;
	PeriphClkInitStruct.PLL3.PLL3P 		= 2;
	PeriphClkInitStruct.PLL3.PLL3Q 		= 20;
	PeriphClkInitStruct.PLL3.PLL3R 		= 2;
	PeriphClkInitStruct.PLL3.PLL3RGE 	= RCC_PLL3VCIRANGE_3;
	PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
	PeriphClkInitStruct.PLL3.PLL3FRACN 	= 0;
	PeriphClkInitStruct.Spi45ClockSelection = RCC_SPI45CLKSOURCE_D2PCLK1;
	PeriphClkInitStruct.FdcanClockSelection = RCC_FDCANCLKSOURCE_PLL2;
	PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1;
	PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;
	PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_D2PCLK1;
	PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL3;
	PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
	if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
	{
		Error_Handler();
	}
	HAL_PWREx_EnableUSBVoltageDetector();
	
	RCC_OscInitStruct.OscillatorType 	= RCC_OSCILLATORTYPE_LSI;
	RCC_OscInitStruct.LSIState 			= RCC_LSI_ON;
	RCC_OscInitStruct.PLL.PLLState 		= RCC_PLL_NONE;
	HAL_RCC_OscConfig(&RCC_OscInitStruct);
	
	HAL_RCC_EnableCSS();
}

This topic has been closed for replies.
waclawek.jan
waclawek.janBest answer
Super User
September 29, 2021

You need to clear also the respective flag in EXTI pending register.

JW

2 replies

waclawek.jan
waclawek.janBest answer
Super User
September 29, 2021

You need to clear also the respective flag in EXTI pending register.

JW

AlexSmart
AlexSmartAuthor
Associate III
September 30, 2021

Thanks, that worked.