Skip to main content
HDaji.1
Senior
August 4, 2022
Solved

F411 System Clock Configuration with Internal Clock

I have been working F411RE Nucleo board with LL library for quite some time.

I found the sample code for SystemClock_Config uses external oscillator as showed below. I wonder if there is any sample for internal oscillator.

 /* Enable HSE oscillator */
 LL_RCC_HSE_EnableBypass();
 LL_RCC_HSE_Enable();
 while(LL_RCC_HSE_IsReady() != 1)
 {
 };
 
 /* Set FLASH latency */
 LL_FLASH_SetLatency(LL_FLASH_LATENCY_3);
 
 /* Main PLL configuration and activation */
 LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_8, 400, LL_RCC_PLLP_DIV_4);
 LL_RCC_PLL_Enable();
 while(LL_RCC_PLL_IsReady() != 1)
 {
 };
 
 /* Sysclk activation on the main PLL */
 LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
 LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);
 while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
 {
 };
 
 /* Set APB1 & APB2 prescaler */
 LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_2);
 LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
 
 /* Set systick to 1ms */
 SysTick_Config(100000000 / 1000);
 
 /* Update CMSIS variable (which can be updated also through SystemCoreClockUpdate function) */
 SystemCoreClock = 100000000;

This topic has been closed for replies.
HDaji.1
HDaji.1Best answer
Senior
August 5, 2022

This is the LL code generated by CubeIDE that is working.

void SystemClock_Config(void)
{
 LL_FLASH_SetLatency(LL_FLASH_LATENCY_0);
 while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_0)
 {
 }
 LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
 LL_RCC_HSE_Enable();
 
 /* Wait till HSE is ready */
 while(LL_RCC_HSE_IsReady() != 1)
 {
 
 }
 LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
 LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);
 LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
 LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
 
 /* Wait till System clock is ready */
 while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSE)
 {
 
 }
 LL_Init1msTick(25000000);
 LL_SetSystemCoreClock(25000000);
 LL_RCC_SetTIMPrescaler(LL_RCC_TIM_PRESCALER_TWICE);
}

3 replies

HDaji.1
HDaji.1Author
Senior
August 4, 2022

I have managed to change to internal clock as showed below. Somehow LL_mDelay is much slower. Maybe due to slower clock source?

 /* Enable HSE oscillator */
	LL_RCC_HSE_DisableBypass();
 //LL_RCC_HSE_EnableBypass();
	
 //LL_RCC_HSE_Enable();
	LL_RCC_HSI_Enable();
 
	//while(LL_RCC_HSE_IsReady() != 1)
	while(LL_RCC_HSI_IsReady() != 1)
 {
 };
 
 /* Set FLASH latency */
 LL_FLASH_SetLatency(LL_FLASH_LATENCY_3);
 
 /* Main PLL configuration and activation */
 //LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_8, 400, LL_RCC_PLLP_DIV_4);
 LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI, LL_RCC_PLLM_DIV_8, 400, LL_RCC_PLLP_DIV_4);
 
	LL_RCC_PLL_Enable();
 while(LL_RCC_PLL_IsReady() != 1)
 {
 };
 
 /* Sysclk activation on the main PLL */
 LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
 
 //LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);
 LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSI);
	
 //while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
 while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
 {
 };
 
 /* Set APB1 & APB2 prescaler */
 LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_2);
 LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
 
 /* Set systick to 1ms */
 SysTick_Config(100000000 / 1000);
 
 /* Update CMSIS variable (which can be updated also through SystemCoreClockUpdate function) */
 SystemCoreClock = 100000000;

HDaji.1
HDaji.1Author
Senior
August 5, 2022

In fact my PCB board has an external clock. The SystemClock_Config using HAL library works well, but SystemClock_Config using LL library does not. Can anyone tell the key difference?

void SystemClock_Config(void)
{
 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 
 /** Configure the main internal regulator output voltage 
 */
 __HAL_RCC_PWR_CLK_ENABLE();
 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
 /** Initializes the CPU, AHB and APB busses clocks 
 */
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
 RCC_OscInitStruct.HSEState = RCC_HSE_ON;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
 {
 Error_Handler();
 }
 /** Initializes the CPU, AHB and APB busses clocks 
 */
 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
 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();
 }

HDaji.1
HDaji.1AuthorBest answer
Senior
August 5, 2022

This is the LL code generated by CubeIDE that is working.

void SystemClock_Config(void)
{
 LL_FLASH_SetLatency(LL_FLASH_LATENCY_0);
 while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_0)
 {
 }
 LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
 LL_RCC_HSE_Enable();
 
 /* Wait till HSE is ready */
 while(LL_RCC_HSE_IsReady() != 1)
 {
 
 }
 LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
 LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);
 LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
 LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
 
 /* Wait till System clock is ready */
 while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSE)
 {
 
 }
 LL_Init1msTick(25000000);
 LL_SetSystemCoreClock(25000000);
 LL_RCC_SetTIMPrescaler(LL_RCC_TIM_PRESCALER_TWICE);
}