cancel
Showing results for 
Search instead for 
Did you mean: 

STM32H743 RTC Wakeup

AlexSmart
Senior

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();
}

1 ACCEPTED SOLUTION

Accepted Solutions

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

JW

View solution in original post

2 REPLIES 2

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

JW

AlexSmart
Senior

Thanks, that worked.