STM32F4xx_HAL_Driver  1.8.3
stm32f4xx_ll_utils.c
Go to the documentation of this file.
1 
18 /* Includes ------------------------------------------------------------------*/
19 #include "stm32f4xx_ll_utils.h"
20 #include "stm32f4xx_ll_rcc.h"
21 #include "stm32f4xx_ll_system.h"
22 #include "stm32f4xx_ll_pwr.h"
23 #ifdef USE_FULL_ASSERT
24 #include "stm32_assert.h"
25 #else
26 #define assert_param(expr) ((void)0U)
27 #endif /* USE_FULL_ASSERT */
28 
37 /* Private types -------------------------------------------------------------*/
38 /* Private variables ---------------------------------------------------------*/
39 /* Private constants ---------------------------------------------------------*/
43 #if defined(RCC_MAX_FREQUENCY_SCALE1)
44 #define UTILS_MAX_FREQUENCY_SCALE1 RCC_MAX_FREQUENCY
45 #endif /*RCC_MAX_FREQUENCY_SCALE1 */
46 #define UTILS_MAX_FREQUENCY_SCALE2 RCC_MAX_FREQUENCY_SCALE2
47 #if defined(RCC_MAX_FREQUENCY_SCALE3)
48 #define UTILS_MAX_FREQUENCY_SCALE3 RCC_MAX_FREQUENCY_SCALE3
49 #endif /* MAX_FREQUENCY_SCALE3 */
50 
51 /* Defines used for PLL range */
52 #define UTILS_PLLVCO_INPUT_MIN RCC_PLLVCO_INPUT_MIN
53 #define UTILS_PLLVCO_INPUT_MAX RCC_PLLVCO_INPUT_MAX
54 #define UTILS_PLLVCO_OUTPUT_MIN RCC_PLLVCO_OUTPUT_MIN
55 #define UTILS_PLLVCO_OUTPUT_MAX RCC_PLLVCO_OUTPUT_MAX
57 /* Defines used for HSE range */
58 #define UTILS_HSE_FREQUENCY_MIN 4000000U
59 #define UTILS_HSE_FREQUENCY_MAX 26000000U
61 /* Defines used for FLASH latency according to HCLK Frequency */
62 #if defined(FLASH_SCALE1_LATENCY1_FREQ)
63 #define UTILS_SCALE1_LATENCY1_FREQ FLASH_SCALE1_LATENCY1_FREQ
64 #endif
65 #if defined(FLASH_SCALE1_LATENCY2_FREQ)
66 #define UTILS_SCALE1_LATENCY2_FREQ FLASH_SCALE1_LATENCY2_FREQ
67 #endif
68 #if defined(FLASH_SCALE1_LATENCY3_FREQ)
69 #define UTILS_SCALE1_LATENCY3_FREQ FLASH_SCALE1_LATENCY3_FREQ
70 #endif
71 #if defined(FLASH_SCALE1_LATENCY4_FREQ)
72 #define UTILS_SCALE1_LATENCY4_FREQ FLASH_SCALE1_LATENCY4_FREQ
73 #endif
74 #if defined(FLASH_SCALE1_LATENCY5_FREQ)
75 #define UTILS_SCALE1_LATENCY5_FREQ FLASH_SCALE1_LATENCY5_FREQ
76 #endif
77 #define UTILS_SCALE2_LATENCY1_FREQ FLASH_SCALE2_LATENCY1_FREQ
78 #define UTILS_SCALE2_LATENCY2_FREQ FLASH_SCALE2_LATENCY2_FREQ
79 #if defined(FLASH_SCALE2_LATENCY3_FREQ)
80 #define UTILS_SCALE2_LATENCY3_FREQ FLASH_SCALE2_LATENCY3_FREQ
81 #endif
82 #if defined(FLASH_SCALE2_LATENCY4_FREQ)
83 #define UTILS_SCALE2_LATENCY4_FREQ FLASH_SCALE2_LATENCY4_FREQ
84 #endif
85 #if defined(FLASH_SCALE2_LATENCY5_FREQ)
86 #define UTILS_SCALE2_LATENCY5_FREQ FLASH_SCALE2_LATENCY5_FREQ
87 #endif
88 #if defined(FLASH_SCALE3_LATENCY1_FREQ)
89 #define UTILS_SCALE3_LATENCY1_FREQ FLASH_SCALE3_LATENCY1_FREQ
90 #endif
91 #if defined(FLASH_SCALE3_LATENCY2_FREQ)
92 #define UTILS_SCALE3_LATENCY2_FREQ FLASH_SCALE3_LATENCY2_FREQ
93 #endif
94 #if defined(FLASH_SCALE3_LATENCY3_FREQ)
95 #define UTILS_SCALE3_LATENCY3_FREQ FLASH_SCALE3_LATENCY3_FREQ
96 #endif
97 #if defined(FLASH_SCALE3_LATENCY4_FREQ)
98 #define UTILS_SCALE3_LATENCY4_FREQ FLASH_SCALE3_LATENCY4_FREQ
99 #endif
100 #if defined(FLASH_SCALE3_LATENCY5_FREQ)
101 #define UTILS_SCALE3_LATENCY5_FREQ FLASH_SCALE3_LATENCY5_FREQ
102 #endif
107 /* Private macros ------------------------------------------------------------*/
111 #define IS_LL_UTILS_SYSCLK_DIV(__VALUE__) (((__VALUE__) == LL_RCC_SYSCLK_DIV_1) \
112  || ((__VALUE__) == LL_RCC_SYSCLK_DIV_2) \
113  || ((__VALUE__) == LL_RCC_SYSCLK_DIV_4) \
114  || ((__VALUE__) == LL_RCC_SYSCLK_DIV_8) \
115  || ((__VALUE__) == LL_RCC_SYSCLK_DIV_16) \
116  || ((__VALUE__) == LL_RCC_SYSCLK_DIV_64) \
117  || ((__VALUE__) == LL_RCC_SYSCLK_DIV_128) \
118  || ((__VALUE__) == LL_RCC_SYSCLK_DIV_256) \
119  || ((__VALUE__) == LL_RCC_SYSCLK_DIV_512))
120 
121 #define IS_LL_UTILS_APB1_DIV(__VALUE__) (((__VALUE__) == LL_RCC_APB1_DIV_1) \
122  || ((__VALUE__) == LL_RCC_APB1_DIV_2) \
123  || ((__VALUE__) == LL_RCC_APB1_DIV_4) \
124  || ((__VALUE__) == LL_RCC_APB1_DIV_8) \
125  || ((__VALUE__) == LL_RCC_APB1_DIV_16))
126 
127 #define IS_LL_UTILS_APB2_DIV(__VALUE__) (((__VALUE__) == LL_RCC_APB2_DIV_1) \
128  || ((__VALUE__) == LL_RCC_APB2_DIV_2) \
129  || ((__VALUE__) == LL_RCC_APB2_DIV_4) \
130  || ((__VALUE__) == LL_RCC_APB2_DIV_8) \
131  || ((__VALUE__) == LL_RCC_APB2_DIV_16))
132 
133 #define IS_LL_UTILS_PLLM_VALUE(__VALUE__) (((__VALUE__) == LL_RCC_PLLM_DIV_2) \
134  || ((__VALUE__) == LL_RCC_PLLM_DIV_3) \
135  || ((__VALUE__) == LL_RCC_PLLM_DIV_4) \
136  || ((__VALUE__) == LL_RCC_PLLM_DIV_5) \
137  || ((__VALUE__) == LL_RCC_PLLM_DIV_6) \
138  || ((__VALUE__) == LL_RCC_PLLM_DIV_7) \
139  || ((__VALUE__) == LL_RCC_PLLM_DIV_8) \
140  || ((__VALUE__) == LL_RCC_PLLM_DIV_9) \
141  || ((__VALUE__) == LL_RCC_PLLM_DIV_10) \
142  || ((__VALUE__) == LL_RCC_PLLM_DIV_11) \
143  || ((__VALUE__) == LL_RCC_PLLM_DIV_12) \
144  || ((__VALUE__) == LL_RCC_PLLM_DIV_13) \
145  || ((__VALUE__) == LL_RCC_PLLM_DIV_14) \
146  || ((__VALUE__) == LL_RCC_PLLM_DIV_15) \
147  || ((__VALUE__) == LL_RCC_PLLM_DIV_16) \
148  || ((__VALUE__) == LL_RCC_PLLM_DIV_17) \
149  || ((__VALUE__) == LL_RCC_PLLM_DIV_18) \
150  || ((__VALUE__) == LL_RCC_PLLM_DIV_19) \
151  || ((__VALUE__) == LL_RCC_PLLM_DIV_20) \
152  || ((__VALUE__) == LL_RCC_PLLM_DIV_21) \
153  || ((__VALUE__) == LL_RCC_PLLM_DIV_22) \
154  || ((__VALUE__) == LL_RCC_PLLM_DIV_23) \
155  || ((__VALUE__) == LL_RCC_PLLM_DIV_24) \
156  || ((__VALUE__) == LL_RCC_PLLM_DIV_25) \
157  || ((__VALUE__) == LL_RCC_PLLM_DIV_26) \
158  || ((__VALUE__) == LL_RCC_PLLM_DIV_27) \
159  || ((__VALUE__) == LL_RCC_PLLM_DIV_28) \
160  || ((__VALUE__) == LL_RCC_PLLM_DIV_29) \
161  || ((__VALUE__) == LL_RCC_PLLM_DIV_30) \
162  || ((__VALUE__) == LL_RCC_PLLM_DIV_31) \
163  || ((__VALUE__) == LL_RCC_PLLM_DIV_32) \
164  || ((__VALUE__) == LL_RCC_PLLM_DIV_33) \
165  || ((__VALUE__) == LL_RCC_PLLM_DIV_34) \
166  || ((__VALUE__) == LL_RCC_PLLM_DIV_35) \
167  || ((__VALUE__) == LL_RCC_PLLM_DIV_36) \
168  || ((__VALUE__) == LL_RCC_PLLM_DIV_37) \
169  || ((__VALUE__) == LL_RCC_PLLM_DIV_38) \
170  || ((__VALUE__) == LL_RCC_PLLM_DIV_39) \
171  || ((__VALUE__) == LL_RCC_PLLM_DIV_40) \
172  || ((__VALUE__) == LL_RCC_PLLM_DIV_41) \
173  || ((__VALUE__) == LL_RCC_PLLM_DIV_42) \
174  || ((__VALUE__) == LL_RCC_PLLM_DIV_43) \
175  || ((__VALUE__) == LL_RCC_PLLM_DIV_44) \
176  || ((__VALUE__) == LL_RCC_PLLM_DIV_45) \
177  || ((__VALUE__) == LL_RCC_PLLM_DIV_46) \
178  || ((__VALUE__) == LL_RCC_PLLM_DIV_47) \
179  || ((__VALUE__) == LL_RCC_PLLM_DIV_48) \
180  || ((__VALUE__) == LL_RCC_PLLM_DIV_49) \
181  || ((__VALUE__) == LL_RCC_PLLM_DIV_50) \
182  || ((__VALUE__) == LL_RCC_PLLM_DIV_51) \
183  || ((__VALUE__) == LL_RCC_PLLM_DIV_52) \
184  || ((__VALUE__) == LL_RCC_PLLM_DIV_53) \
185  || ((__VALUE__) == LL_RCC_PLLM_DIV_54) \
186  || ((__VALUE__) == LL_RCC_PLLM_DIV_55) \
187  || ((__VALUE__) == LL_RCC_PLLM_DIV_56) \
188  || ((__VALUE__) == LL_RCC_PLLM_DIV_57) \
189  || ((__VALUE__) == LL_RCC_PLLM_DIV_58) \
190  || ((__VALUE__) == LL_RCC_PLLM_DIV_59) \
191  || ((__VALUE__) == LL_RCC_PLLM_DIV_60) \
192  || ((__VALUE__) == LL_RCC_PLLM_DIV_61) \
193  || ((__VALUE__) == LL_RCC_PLLM_DIV_62) \
194  || ((__VALUE__) == LL_RCC_PLLM_DIV_63))
195 
196 #define IS_LL_UTILS_PLLN_VALUE(__VALUE__) ((RCC_PLLN_MIN_VALUE <= (__VALUE__)) && ((__VALUE__) <= RCC_PLLN_MAX_VALUE))
197 
198 #define IS_LL_UTILS_PLLP_VALUE(__VALUE__) (((__VALUE__) == LL_RCC_PLLP_DIV_2) \
199  || ((__VALUE__) == LL_RCC_PLLP_DIV_4) \
200  || ((__VALUE__) == LL_RCC_PLLP_DIV_6) \
201  || ((__VALUE__) == LL_RCC_PLLP_DIV_8))
202 
203 #define IS_LL_UTILS_PLLVCO_INPUT(__VALUE__) ((UTILS_PLLVCO_INPUT_MIN <= (__VALUE__)) && ((__VALUE__) <= UTILS_PLLVCO_INPUT_MAX))
204 
205 #define IS_LL_UTILS_PLLVCO_OUTPUT(__VALUE__) ((UTILS_PLLVCO_OUTPUT_MIN <= (__VALUE__)) && ((__VALUE__) <= UTILS_PLLVCO_OUTPUT_MAX))
206 
207 #if !defined(RCC_MAX_FREQUENCY_SCALE1)
208 #define IS_LL_UTILS_PLL_FREQUENCY(__VALUE__) ((LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE2) ? ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE2) : \
209  ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE3))
210 
211 #elif defined(RCC_MAX_FREQUENCY_SCALE3)
212 #define IS_LL_UTILS_PLL_FREQUENCY(__VALUE__) ((LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE1) ? ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE1) : \
213  (LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE2) ? ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE2) : \
214  ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE3))
215 
216 #else
217 #define IS_LL_UTILS_PLL_FREQUENCY(__VALUE__) ((LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE1) ? ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE1) : \
218  ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE2))
219 
220 #endif /* RCC_MAX_FREQUENCY_SCALE1*/
221 #define IS_LL_UTILS_HSE_BYPASS(__STATE__) (((__STATE__) == LL_UTILS_HSEBYPASS_ON) \
222  || ((__STATE__) == LL_UTILS_HSEBYPASS_OFF))
223 
224 #define IS_LL_UTILS_HSE_FREQUENCY(__FREQUENCY__) (((__FREQUENCY__) >= UTILS_HSE_FREQUENCY_MIN) && ((__FREQUENCY__) <= UTILS_HSE_FREQUENCY_MAX))
228 /* Private function prototypes -----------------------------------------------*/
232 static uint32_t UTILS_GetPLLOutputFrequency(uint32_t PLL_InputFrequency,
233  LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct);
234 static ErrorStatus UTILS_EnablePLLAndSwitchSystem(uint32_t SYSCLK_Frequency, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct);
235 static ErrorStatus UTILS_PLL_IsBusy(void);
240 /* Exported functions --------------------------------------------------------*/
257 void LL_Init1msTick(uint32_t HCLKFrequency)
258 {
259  /* Use frequency provided in argument */
260  LL_InitTick(HCLKFrequency, 1000U);
261 }
262 
273 void LL_mDelay(uint32_t Delay)
274 {
275  __IO uint32_t tmp = SysTick->CTRL; /* Clear the COUNTFLAG first */
276  /* Add this code to indicate that local variable is not used */
277  ((void)tmp);
278 
279  /* Add a period to guaranty minimum wait */
280  if(Delay < LL_MAX_DELAY)
281  {
282  Delay++;
283  }
284 
285  while (Delay)
286  {
287  if((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) != 0U)
288  {
289  Delay--;
290  }
291  }
292 }
293 
323 void LL_SetSystemCoreClock(uint32_t HCLKFrequency)
324 {
325  /* HCLK clock frequency */
326  SystemCoreClock = HCLKFrequency;
327 }
328 
338 ErrorStatus LL_SetFlashLatency(uint32_t HCLK_Frequency)
339 {
340  uint32_t timeout;
341  uint32_t getlatency;
342  uint32_t latency = LL_FLASH_LATENCY_0; /* default value 0WS */
343  ErrorStatus status = SUCCESS;
344 
345 
346  /* Frequency cannot be equal to 0 */
347  if(HCLK_Frequency == 0U)
348  {
349  status = ERROR;
350  }
351  else
352  {
353  if(LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE1)
354  {
355 #if defined (UTILS_SCALE1_LATENCY5_FREQ)
356  if((HCLK_Frequency > UTILS_SCALE1_LATENCY5_FREQ)&&(latency == LL_FLASH_LATENCY_0))
357  {
358  latency = LL_FLASH_LATENCY_5;
359  }
360 #endif /*UTILS_SCALE1_LATENCY5_FREQ */
361 #if defined (UTILS_SCALE1_LATENCY4_FREQ)
362  if((HCLK_Frequency > UTILS_SCALE1_LATENCY4_FREQ)&&(latency == LL_FLASH_LATENCY_0))
363  {
364  latency = LL_FLASH_LATENCY_4;
365  }
366 #endif /* UTILS_SCALE1_LATENCY4_FREQ */
367 #if defined (UTILS_SCALE1_LATENCY3_FREQ)
368  if((HCLK_Frequency > UTILS_SCALE1_LATENCY3_FREQ)&&(latency == LL_FLASH_LATENCY_0))
369  {
370  latency = LL_FLASH_LATENCY_3;
371  }
372 #endif /* UTILS_SCALE1_LATENCY3_FREQ */
373 #if defined (UTILS_SCALE1_LATENCY2_FREQ)
374  if((HCLK_Frequency > UTILS_SCALE1_LATENCY2_FREQ)&&(latency == LL_FLASH_LATENCY_0))
375  {
376  latency = LL_FLASH_LATENCY_2;
377  }
378  else
379  {
380  if((HCLK_Frequency > UTILS_SCALE1_LATENCY1_FREQ)&&(latency == LL_FLASH_LATENCY_0))
381  {
382  latency = LL_FLASH_LATENCY_1;
383  }
384  }
385 #endif /* UTILS_SCALE1_LATENCY2_FREQ */
386  }
387  if(LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE2)
388  {
389 #if defined (UTILS_SCALE2_LATENCY5_FREQ)
390  if((HCLK_Frequency > UTILS_SCALE2_LATENCY5_FREQ)&&(latency == LL_FLASH_LATENCY_0))
391  {
392  latency = LL_FLASH_LATENCY_5;
393  }
394 #endif /*UTILS_SCALE1_LATENCY5_FREQ */
395 #if defined (UTILS_SCALE2_LATENCY4_FREQ)
396  if((HCLK_Frequency > UTILS_SCALE2_LATENCY4_FREQ)&&(latency == LL_FLASH_LATENCY_0))
397  {
398  latency = LL_FLASH_LATENCY_4;
399  }
400 #endif /*UTILS_SCALE1_LATENCY4_FREQ */
401 #if defined (UTILS_SCALE2_LATENCY3_FREQ)
402  if((HCLK_Frequency > UTILS_SCALE2_LATENCY3_FREQ)&&(latency == LL_FLASH_LATENCY_0))
403  {
404  latency = LL_FLASH_LATENCY_3;
405  }
406 #endif /*UTILS_SCALE1_LATENCY3_FREQ */
407  if((HCLK_Frequency > UTILS_SCALE2_LATENCY2_FREQ)&&(latency == LL_FLASH_LATENCY_0))
408  {
409  latency = LL_FLASH_LATENCY_2;
410  }
411  else
412  {
413  if((HCLK_Frequency > UTILS_SCALE2_LATENCY1_FREQ)&&(latency == LL_FLASH_LATENCY_0))
414  {
415  latency = LL_FLASH_LATENCY_1;
416  }
417  }
418  }
419 #if defined (LL_PWR_REGU_VOLTAGE_SCALE3)
420  if(LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE3)
421  {
422 #if defined (UTILS_SCALE3_LATENCY3_FREQ)
423  if((HCLK_Frequency > UTILS_SCALE3_LATENCY3_FREQ)&&(latency == LL_FLASH_LATENCY_0))
424  {
425  latency = LL_FLASH_LATENCY_3;
426  }
427 #endif /*UTILS_SCALE1_LATENCY3_FREQ */
428 #if defined (UTILS_SCALE3_LATENCY2_FREQ)
429  if((HCLK_Frequency > UTILS_SCALE3_LATENCY2_FREQ)&&(latency == LL_FLASH_LATENCY_0))
430  {
431  latency = LL_FLASH_LATENCY_2;
432  }
433  else
434  {
435  if((HCLK_Frequency > UTILS_SCALE3_LATENCY1_FREQ)&&(latency == LL_FLASH_LATENCY_0))
436  {
437  latency = LL_FLASH_LATENCY_1;
438  }
439  }
440  }
441 #endif /*UTILS_SCALE1_LATENCY2_FREQ */
442 #endif /* LL_PWR_REGU_VOLTAGE_SCALE3 */
443 
444  LL_FLASH_SetLatency(latency);
445  /* Check that the new number of wait states is taken into account to access the Flash
446  memory by reading the FLASH_ACR register */
447  timeout = 2;
448  do
449  {
450  /* Wait for Flash latency to be updated */
451  getlatency = LL_FLASH_GetLatency();
452  timeout--;
453  } while ((getlatency != latency) && (timeout > 0));
454 
455  if(getlatency != latency)
456  {
457  status = ERROR;
458  }
459  else
460  {
461  status = SUCCESS;
462  }
463  }
464  return status;
465 }
466 
483 ErrorStatus LL_PLL_ConfigSystemClock_HSI(LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct,
484  LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct)
485 {
486  ErrorStatus status = SUCCESS;
487  uint32_t pllfreq = 0U;
488 
489  /* Check if one of the PLL is enabled */
490  if(UTILS_PLL_IsBusy() == SUCCESS)
491  {
492  /* Calculate the new PLL output frequency */
493  pllfreq = UTILS_GetPLLOutputFrequency(HSI_VALUE, UTILS_PLLInitStruct);
494 
495  /* Enable HSI if not enabled */
496  if(LL_RCC_HSI_IsReady() != 1U)
497  {
499  while (LL_RCC_HSI_IsReady() != 1U)
500  {
501  /* Wait for HSI ready */
502  }
503  }
504 
505  /* Configure PLL */
506  LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI, UTILS_PLLInitStruct->PLLM, UTILS_PLLInitStruct->PLLN,
507  UTILS_PLLInitStruct->PLLP);
508 
509  /* Enable PLL and switch system clock to PLL */
510  status = UTILS_EnablePLLAndSwitchSystem(pllfreq, UTILS_ClkInitStruct);
511  }
512  else
513  {
514  /* Current PLL configuration cannot be modified */
515  status = ERROR;
516  }
517 
518  return status;
519 }
520 
540 ErrorStatus LL_PLL_ConfigSystemClock_HSE(uint32_t HSEFrequency, uint32_t HSEBypass,
541  LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct)
542 {
543  ErrorStatus status = SUCCESS;
544  uint32_t pllfreq = 0U;
545 
546  /* Check the parameters */
547  assert_param(IS_LL_UTILS_HSE_FREQUENCY(HSEFrequency));
548  assert_param(IS_LL_UTILS_HSE_BYPASS(HSEBypass));
549 
550  /* Check if one of the PLL is enabled */
551  if(UTILS_PLL_IsBusy() == SUCCESS)
552  {
553  /* Calculate the new PLL output frequency */
554  pllfreq = UTILS_GetPLLOutputFrequency(HSEFrequency, UTILS_PLLInitStruct);
555 
556  /* Enable HSE if not enabled */
557  if(LL_RCC_HSE_IsReady() != 1U)
558  {
559  /* Check if need to enable HSE bypass feature or not */
560  if(HSEBypass == LL_UTILS_HSEBYPASS_ON)
561  {
563  }
564  else
565  {
567  }
568 
569  /* Enable HSE */
571  while (LL_RCC_HSE_IsReady() != 1U)
572  {
573  /* Wait for HSE ready */
574  }
575  }
576 
577  /* Configure PLL */
578  LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, UTILS_PLLInitStruct->PLLM, UTILS_PLLInitStruct->PLLN,
579  UTILS_PLLInitStruct->PLLP);
580 
581  /* Enable PLL and switch system clock to PLL */
582  status = UTILS_EnablePLLAndSwitchSystem(pllfreq, UTILS_ClkInitStruct);
583  }
584  else
585  {
586  /* Current PLL configuration cannot be modified */
587  status = ERROR;
588  }
589 
590  return status;
591 }
592 
611 static uint32_t UTILS_GetPLLOutputFrequency(uint32_t PLL_InputFrequency, LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct)
612 {
613  uint32_t pllfreq = 0U;
614 
615  /* Check the parameters */
616  assert_param(IS_LL_UTILS_PLLM_VALUE(UTILS_PLLInitStruct->PLLM));
617  assert_param(IS_LL_UTILS_PLLN_VALUE(UTILS_PLLInitStruct->PLLN));
618  assert_param(IS_LL_UTILS_PLLP_VALUE(UTILS_PLLInitStruct->PLLP));
619 
620  /* Check different PLL parameters according to RM */
621  /* - PLLM: ensure that the VCO input frequency ranges from @ref UTILS_PLLVCO_INPUT_MIN to @ref UTILS_PLLVCO_INPUT_MAX MHz. */
622  pllfreq = PLL_InputFrequency / (UTILS_PLLInitStruct->PLLM & (RCC_PLLCFGR_PLLM >> RCC_PLLCFGR_PLLM_Pos));
623  assert_param(IS_LL_UTILS_PLLVCO_INPUT(pllfreq));
624 
625  /* - PLLN: ensure that the VCO output frequency is between @ref UTILS_PLLVCO_OUTPUT_MIN and @ref UTILS_PLLVCO_OUTPUT_MAX .*/
626  pllfreq = pllfreq * (UTILS_PLLInitStruct->PLLN & (RCC_PLLCFGR_PLLN >> RCC_PLLCFGR_PLLN_Pos));
627  assert_param(IS_LL_UTILS_PLLVCO_OUTPUT(pllfreq));
628 
629  /* - PLLP: ensure that max frequency at @ref RCC_MAX_FREQUENCY Hz is reached */
630  pllfreq = pllfreq / (((UTILS_PLLInitStruct->PLLP >> RCC_PLLCFGR_PLLP_Pos) + 1) * 2);
631  assert_param(IS_LL_UTILS_PLL_FREQUENCY(pllfreq));
632 
633  return pllfreq;
634 }
635 
642 static ErrorStatus UTILS_PLL_IsBusy(void)
643 {
644  ErrorStatus status = SUCCESS;
645 
646  /* Check if PLL is busy*/
647  if(LL_RCC_PLL_IsReady() != 0U)
648  {
649  /* PLL configuration cannot be modified */
650  status = ERROR;
651  }
652 
653 #if defined(RCC_PLLSAI_SUPPORT)
654  /* Check if PLLSAI is busy*/
655  if(LL_RCC_PLLSAI_IsReady() != 0U)
656  {
657  /* PLLSAI1 configuration cannot be modified */
658  status = ERROR;
659  }
660 #endif /*RCC_PLLSAI_SUPPORT*/
661 #if defined(RCC_PLLI2S_SUPPORT)
662  /* Check if PLLI2S is busy*/
663  if(LL_RCC_PLLI2S_IsReady() != 0U)
664  {
665  /* PLLI2S configuration cannot be modified */
666  status = ERROR;
667  }
668 #endif /*RCC_PLLI2S_SUPPORT*/
669  return status;
670 }
671 
681 static ErrorStatus UTILS_EnablePLLAndSwitchSystem(uint32_t SYSCLK_Frequency, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct)
682 {
683  ErrorStatus status = SUCCESS;
684  uint32_t hclk_frequency = 0U;
685 
686  assert_param(IS_LL_UTILS_SYSCLK_DIV(UTILS_ClkInitStruct->AHBCLKDivider));
687  assert_param(IS_LL_UTILS_APB1_DIV(UTILS_ClkInitStruct->APB1CLKDivider));
688  assert_param(IS_LL_UTILS_APB2_DIV(UTILS_ClkInitStruct->APB2CLKDivider));
689 
690  /* Calculate HCLK frequency */
691  hclk_frequency = __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, UTILS_ClkInitStruct->AHBCLKDivider);
692 
693  /* Increasing the number of wait states because of higher CPU frequency */
694  if(SystemCoreClock < hclk_frequency)
695  {
696  /* Set FLASH latency to highest latency */
697  status = LL_SetFlashLatency(hclk_frequency);
698  }
699 
700  /* Update system clock configuration */
701  if(status == SUCCESS)
702  {
703  /* Enable PLL */
705  while (LL_RCC_PLL_IsReady() != 1U)
706  {
707  /* Wait for PLL ready */
708  }
709 
710  /* Sysclk activation on the main PLL */
711  LL_RCC_SetAHBPrescaler(UTILS_ClkInitStruct->AHBCLKDivider);
712  LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);
713  while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
714  {
715  /* Wait for system clock switch to PLL */
716  }
717 
718  /* Set APB1 & APB2 prescaler*/
719  LL_RCC_SetAPB1Prescaler(UTILS_ClkInitStruct->APB1CLKDivider);
720  LL_RCC_SetAPB2Prescaler(UTILS_ClkInitStruct->APB2CLKDivider);
721  }
722 
723  /* Decreasing the number of wait states because of lower CPU frequency */
724  if(SystemCoreClock > hclk_frequency)
725  {
726  /* Set FLASH latency to lowest latency */
727  status = LL_SetFlashLatency(hclk_frequency);
728  }
729 
730  /* Update SystemCoreClock variable */
731  if(status == SUCCESS)
732  {
733  LL_SetSystemCoreClock(hclk_frequency);
734  }
735 
736  return status;
737 }
738 
__STATIC_INLINE uint32_t LL_PWR_GetRegulVoltageScaling(void)
Get the main internal Regulator output voltage @rmtoll CR VOS LL_PWR_GetRegulVoltageScaling.
__STATIC_INLINE void LL_RCC_HSE_Enable(void)
Enable HSE crystal oscillator (HSE ON) @rmtoll CR HSEON LL_RCC_HSE_Enable.
__STATIC_INLINE void LL_RCC_HSE_DisableBypass(void)
Disable HSE external oscillator (HSE Bypass) @rmtoll CR HSEBYP LL_RCC_HSE_DisableBypass.
__STATIC_INLINE uint32_t LL_RCC_HSE_IsReady(void)
Check if HSE oscillator Ready @rmtoll CR HSERDY LL_RCC_HSE_IsReady.
__STATIC_INLINE void LL_RCC_HSE_EnableBypass(void)
Enable HSE external oscillator (HSE Bypass) @rmtoll CR HSEBYP LL_RCC_HSE_EnableBypass.
__STATIC_INLINE void LL_RCC_HSI_Enable(void)
Enable HSI oscillator @rmtoll CR HSION LL_RCC_HSI_Enable.
__STATIC_INLINE uint32_t LL_RCC_HSI_IsReady(void)
Check if HSI clock is ready @rmtoll CR HSIRDY LL_RCC_HSI_IsReady.
__STATIC_INLINE uint32_t LL_RCC_PLLI2S_IsReady(void)
Check if PLLI2S Ready @rmtoll CR PLLI2SRDY LL_RCC_PLLI2S_IsReady.
__STATIC_INLINE uint32_t LL_RCC_PLLSAI_IsReady(void)
Check if PLLSAI Ready @rmtoll CR PLLSAIRDY LL_RCC_PLLSAI_IsReady.
__STATIC_INLINE uint32_t LL_RCC_PLL_IsReady(void)
Check if PLL Ready @rmtoll CR PLLRDY LL_RCC_PLL_IsReady.
__STATIC_INLINE void LL_RCC_PLL_Enable(void)
Enable PLL @rmtoll CR PLLON LL_RCC_PLL_Enable.
__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SYS(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP_R)
Configure PLL used for SYSCLK Domain.
__STATIC_INLINE void LL_RCC_SetAHBPrescaler(uint32_t Prescaler)
Set AHB prescaler @rmtoll CFGR HPRE LL_RCC_SetAHBPrescaler.
__STATIC_INLINE uint32_t LL_RCC_GetSysClkSource(void)
Get the system clock source @rmtoll CFGR SWS LL_RCC_GetSysClkSource.
__STATIC_INLINE void LL_RCC_SetAPB1Prescaler(uint32_t Prescaler)
Set APB1 prescaler @rmtoll CFGR PPRE1 LL_RCC_SetAPB1Prescaler.
__STATIC_INLINE void LL_RCC_SetAPB2Prescaler(uint32_t Prescaler)
Set APB2 prescaler @rmtoll CFGR PPRE2 LL_RCC_SetAPB2Prescaler.
__STATIC_INLINE void LL_RCC_SetSysClkSource(uint32_t Source)
Configure the system clock source @rmtoll CFGR SW LL_RCC_SetSysClkSource.
__STATIC_INLINE uint32_t LL_FLASH_GetLatency(void)
Get FLASH Latency @rmtoll FLASH_ACR LATENCY LL_FLASH_GetLatency.
__STATIC_INLINE void LL_FLASH_SetLatency(uint32_t Latency)
Set FLASH Latency @rmtoll FLASH_ACR LATENCY LL_FLASH_SetLatency.
void LL_SetSystemCoreClock(uint32_t HCLKFrequency)
This function sets directly SystemCoreClock CMSIS variable.
ErrorStatus LL_SetFlashLatency(uint32_t HCLK_Frequency)
Update number of Flash wait states in line with new frequency and current voltage range.
ErrorStatus LL_PLL_ConfigSystemClock_HSI(LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct)
This function configures system clock at maximum frequency with HSI as clock source of the PLL.
ErrorStatus LL_PLL_ConfigSystemClock_HSE(uint32_t HSEFrequency, uint32_t HSEBypass, LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct)
This function configures system clock with HSE as clock source of the PLL.
__STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks)
This function configures the Cortex-M SysTick source of the time base.
void LL_Init1msTick(uint32_t HCLKFrequency)
This function configures the Cortex-M SysTick source to have 1ms time base.
void LL_mDelay(uint32_t Delay)
This function provides accurate delay (in milliseconds) based on SysTick counter flag.
UTILS System, AHB and APB buses clock configuration structure definition.
UTILS PLL structure definition.
Header file of PWR LL module.
Header file of RCC LL module.
Header file of SYSTEM LL module.
Header file of UTILS LL module.