@@ -211,6 +211,21 @@ static struct clock_control_driver_api stm32_clock_control_api = {
211211 .get_rate = stm32_clock_control_get_subsys_rate ,
212212};
213213
214+ static void set_regu_voltage (uint32_t hclk_freq )
215+ {
216+ if (hclk_freq < MHZ (25 )) {
217+ LL_PWR_SetRegulVoltageScaling (LL_PWR_REGU_VOLTAGE_SCALE4 );
218+ } else if (hclk_freq < MHZ (55 )) {
219+ LL_PWR_SetRegulVoltageScaling (LL_PWR_REGU_VOLTAGE_SCALE3 );
220+ } else if (hclk_freq < MHZ (110 )) {
221+ LL_PWR_SetRegulVoltageScaling (LL_PWR_REGU_VOLTAGE_SCALE2 );
222+ } else {
223+ LL_PWR_SetRegulVoltageScaling (LL_PWR_REGU_VOLTAGE_SCALE1 );
224+ }
225+ while (LL_PWR_IsActiveFlag_VOS () == 0 ) {
226+ }
227+ }
228+
214229/*
215230 * Unconditionally switch the system clock source to HSI.
216231 */
@@ -310,9 +325,7 @@ void config_src_sysclk_pll(LL_UTILS_ClkInitTypeDef s_ClkInitStruct)
310325 STM32_PLL_N_MULTIPLIER ,
311326 STM32_PLL_R_DIVISOR );
312327
313- LL_PWR_SetRegulVoltageScaling (LL_PWR_REGU_VOLTAGE_SCALE1 );
314- while (LL_PWR_IsActiveFlag_VOS () == 0 ) {
315- }
328+ set_regu_voltage (CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC );
316329
317330 if (CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC >= 55 ) {
318331 /*
@@ -364,6 +377,8 @@ void config_src_sysclk_pll(LL_UTILS_ClkInitTypeDef s_ClkInitStruct)
364377 LL_RCC_HSE_Disable ();
365378
366379#elif STM32_PLL_SRC_HSI
380+ set_regu_voltage (CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC );
381+
367382 /* Switch to PLL with HSI as clock source */
368383 LL_PLL_ConfigSystemClock_HSI (& s_PLLInitStruct , & s_ClkInitStruct );
369384
@@ -374,6 +389,8 @@ void config_src_sysclk_pll(LL_UTILS_ClkInitTypeDef s_ClkInitStruct)
374389#elif STM32_PLL_SRC_HSE
375390 int hse_bypass ;
376391
392+ set_regu_voltage (CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC );
393+
377394 if (IS_ENABLED (STM32_HSE_BYPASS )) {
378395 hse_bypass = LL_UTILS_HSEBYPASS_ON ;
379396 } else {
@@ -487,14 +504,7 @@ void config_src_sysclk_msis(LL_UTILS_ClkInitTypeDef s_ClkInitStruct)
487504 LL_SetFlashLatency (new_hclk_freq );
488505 }
489506
490- if (new_hclk_freq > MHZ (24 )) {
491- /* when freq > 24MHz it is necessary to set voltage scaling
492- * to range3
493- */
494- LL_PWR_SetRegulVoltageScaling (LL_PWR_REGU_VOLTAGE_SCALE3 );
495- while (LL_PWR_IsActiveFlag_VOS () == 0 ) {
496- }
497- }
507+ set_regu_voltage (CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC );
498508
499509 /* Set MSIS as SYSCLCK source */
500510 set_up_clk_msis ();
0 commit comments