STM32L4xx_HAL_Driver  1.14.0
stm32l4xx_ll_utils.c
Go to the documentation of this file.
1 
19 /* Includes ------------------------------------------------------------------*/
20 #include "stm32l4xx_ll_utils.h"
21 #include "stm32l4xx_ll_rcc.h"
22 #include "stm32l4xx_ll_system.h"
23 #include "stm32l4xx_ll_pwr.h"
24 #ifdef USE_FULL_ASSERT
25 #include "stm32_assert.h"
26 #else
27 #define assert_param(expr) ((void)0U)
28 #endif /* USE_FULL_ASSERT */
29 
38 /* Private types -------------------------------------------------------------*/
39 /* Private variables ---------------------------------------------------------*/
40 /* Private constants ---------------------------------------------------------*/
44 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
45 #define UTILS_MAX_FREQUENCY_SCALE1 120000000U
46 #define UTILS_MAX_FREQUENCY_SCALE2 26000000U
47 #else
48 #define UTILS_MAX_FREQUENCY_SCALE1 80000000U
49 #define UTILS_MAX_FREQUENCY_SCALE2 26000000U
50 #endif
51 
52 /* Defines used for PLL range */
53 #define UTILS_PLLVCO_INPUT_MIN 4000000U
54 #define UTILS_PLLVCO_INPUT_MAX 16000000U
55 #define UTILS_PLLVCO_OUTPUT_MIN 64000000U
56 #define UTILS_PLLVCO_OUTPUT_MAX 344000000U
58 /* Defines used for HSE range */
59 #define UTILS_HSE_FREQUENCY_MIN 4000000U
60 #define UTILS_HSE_FREQUENCY_MAX 48000000U
62 /* Defines used for FLASH latency according to HCLK Frequency */
63 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
64 #define UTILS_SCALE1_LATENCY1_FREQ 20000000U
65 #define UTILS_SCALE1_LATENCY2_FREQ 40000000U
66 #define UTILS_SCALE1_LATENCY3_FREQ 60000000U
67 #define UTILS_SCALE1_LATENCY4_FREQ 80000000U
68 #define UTILS_SCALE1_LATENCY5_FREQ 100000000U
69 #define UTILS_SCALE2_LATENCY1_FREQ 8000000U
70 #define UTILS_SCALE2_LATENCY2_FREQ 16000000U
71 #else
72 #define UTILS_SCALE1_LATENCY1_FREQ 16000000U
73 #define UTILS_SCALE1_LATENCY2_FREQ 32000000U
74 #define UTILS_SCALE1_LATENCY3_FREQ 48000000U
75 #define UTILS_SCALE1_LATENCY4_FREQ 64000000U
76 #define UTILS_SCALE2_LATENCY1_FREQ 6000000U
77 #define UTILS_SCALE2_LATENCY2_FREQ 12000000U
78 #define UTILS_SCALE2_LATENCY3_FREQ 18000000U
79 #endif
80 
84 /* Private macros ------------------------------------------------------------*/
88 #define IS_LL_UTILS_SYSCLK_DIV(__VALUE__) (((__VALUE__) == LL_RCC_SYSCLK_DIV_1) \
89  || ((__VALUE__) == LL_RCC_SYSCLK_DIV_2) \
90  || ((__VALUE__) == LL_RCC_SYSCLK_DIV_4) \
91  || ((__VALUE__) == LL_RCC_SYSCLK_DIV_8) \
92  || ((__VALUE__) == LL_RCC_SYSCLK_DIV_16) \
93  || ((__VALUE__) == LL_RCC_SYSCLK_DIV_64) \
94  || ((__VALUE__) == LL_RCC_SYSCLK_DIV_128) \
95  || ((__VALUE__) == LL_RCC_SYSCLK_DIV_256) \
96  || ((__VALUE__) == LL_RCC_SYSCLK_DIV_512))
97 
98 #define IS_LL_UTILS_APB1_DIV(__VALUE__) (((__VALUE__) == LL_RCC_APB1_DIV_1) \
99  || ((__VALUE__) == LL_RCC_APB1_DIV_2) \
100  || ((__VALUE__) == LL_RCC_APB1_DIV_4) \
101  || ((__VALUE__) == LL_RCC_APB1_DIV_8) \
102  || ((__VALUE__) == LL_RCC_APB1_DIV_16))
103 
104 #define IS_LL_UTILS_APB2_DIV(__VALUE__) (((__VALUE__) == LL_RCC_APB2_DIV_1) \
105  || ((__VALUE__) == LL_RCC_APB2_DIV_2) \
106  || ((__VALUE__) == LL_RCC_APB2_DIV_4) \
107  || ((__VALUE__) == LL_RCC_APB2_DIV_8) \
108  || ((__VALUE__) == LL_RCC_APB2_DIV_16))
109 
110 #define IS_LL_UTILS_PLLM_VALUE(__VALUE__) (((__VALUE__) == LL_RCC_PLLM_DIV_1) \
111  || ((__VALUE__) == LL_RCC_PLLM_DIV_2) \
112  || ((__VALUE__) == LL_RCC_PLLM_DIV_3) \
113  || ((__VALUE__) == LL_RCC_PLLM_DIV_4) \
114  || ((__VALUE__) == LL_RCC_PLLM_DIV_5) \
115  || ((__VALUE__) == LL_RCC_PLLM_DIV_6) \
116  || ((__VALUE__) == LL_RCC_PLLM_DIV_7) \
117  || ((__VALUE__) == LL_RCC_PLLM_DIV_8))
118 
119 #define IS_LL_UTILS_PLLN_VALUE(__VALUE__) ((8U <= (__VALUE__)) && ((__VALUE__) <= 86U))
120 
121 #define IS_LL_UTILS_PLLR_VALUE(__VALUE__) (((__VALUE__) == LL_RCC_PLLR_DIV_2) \
122  || ((__VALUE__) == LL_RCC_PLLR_DIV_4) \
123  || ((__VALUE__) == LL_RCC_PLLR_DIV_6) \
124  || ((__VALUE__) == LL_RCC_PLLR_DIV_8))
125 
126 #define IS_LL_UTILS_PLLVCO_INPUT(__VALUE__) ((UTILS_PLLVCO_INPUT_MIN <= (__VALUE__)) && ((__VALUE__) <= UTILS_PLLVCO_INPUT_MAX))
127 
128 #define IS_LL_UTILS_PLLVCO_OUTPUT(__VALUE__) ((UTILS_PLLVCO_OUTPUT_MIN <= (__VALUE__)) && ((__VALUE__) <= UTILS_PLLVCO_OUTPUT_MAX))
129 
130 #define IS_LL_UTILS_PLL_FREQUENCY(__VALUE__) ((LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE1) ? ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE1) : \
131  ((__VALUE__) <= UTILS_MAX_FREQUENCY_SCALE2))
132 
133 #define IS_LL_UTILS_HSE_BYPASS(__STATE__) (((__STATE__) == LL_UTILS_HSEBYPASS_ON) \
134  || ((__STATE__) == LL_UTILS_HSEBYPASS_OFF))
135 
136 #define IS_LL_UTILS_HSE_FREQUENCY(__FREQUENCY__) (((__FREQUENCY__) >= UTILS_HSE_FREQUENCY_MIN) && ((__FREQUENCY__) <= UTILS_HSE_FREQUENCY_MAX))
137 
140 /* Private function prototypes -----------------------------------------------*/
144 static uint32_t UTILS_GetPLLOutputFrequency(uint32_t PLL_InputFrequency,
145  LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct);
146 static ErrorStatus UTILS_SetFlashLatency(uint32_t HCLK_Frequency);
147 static ErrorStatus UTILS_EnablePLLAndSwitchSystem(uint32_t SYSCLK_Frequency, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct);
148 static ErrorStatus UTILS_PLL_IsBusy(void);
153 /* Exported functions --------------------------------------------------------*/
170 void LL_Init1msTick(uint32_t HCLKFrequency)
171 {
172  /* Use frequency provided in argument */
173  LL_InitTick(HCLKFrequency, 1000U);
174 }
175 
186 void LL_mDelay(uint32_t Delay)
187 {
188  __IO uint32_t tmp = SysTick->CTRL; /* Clear the COUNTFLAG first */
189  uint32_t tmpDelay = Delay;
190 
191  /* Add this code to indicate that local variable is not used */
192  ((void)tmp);
193 
194  /* Add a period to guaranty minimum wait */
195  if(tmpDelay < LL_MAX_DELAY)
196  {
197  tmpDelay++;
198  }
199 
200  while (tmpDelay != 0U)
201  {
202  if((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) != 0U)
203  {
204  tmpDelay--;
205  }
206  }
207 }
208 
278 void LL_SetSystemCoreClock(uint32_t HCLKFrequency)
279 {
280  /* HCLK clock frequency */
281  SystemCoreClock = HCLKFrequency;
282 }
283 
300 ErrorStatus LL_PLL_ConfigSystemClock_MSI(LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct,
301  LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct)
302 {
303  ErrorStatus status = SUCCESS;
304  uint32_t pllfreq, msi_range;
305 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
306  uint32_t hpre = 0U; /* Set default value */
307 #endif
308 
309  /* Check if one of the PLL is enabled */
310  if(UTILS_PLL_IsBusy() == SUCCESS)
311  {
312  /* Get the current MSI range */
314  {
315  msi_range = LL_RCC_MSI_GetRange();
316  switch (msi_range)
317  {
318  case LL_RCC_MSIRANGE_0: /* MSI = 100 KHz */
319  case LL_RCC_MSIRANGE_1: /* MSI = 200 KHz */
320  case LL_RCC_MSIRANGE_2: /* MSI = 400 KHz */
321  case LL_RCC_MSIRANGE_3: /* MSI = 800 KHz */
322  case LL_RCC_MSIRANGE_4: /* MSI = 1 MHz */
323  case LL_RCC_MSIRANGE_5: /* MSI = 2 MHz */
324  /* PLLVCO input frequency is not in the range from 4 to 16 MHz*/
325  status = ERROR;
326  break;
327 
328  case LL_RCC_MSIRANGE_6: /* MSI = 4 MHz */
329  case LL_RCC_MSIRANGE_7: /* MSI = 8 MHz */
330  case LL_RCC_MSIRANGE_8: /* MSI = 16 MHz */
331  case LL_RCC_MSIRANGE_9: /* MSI = 24 MHz */
332  case LL_RCC_MSIRANGE_10: /* MSI = 32 MHz */
333  case LL_RCC_MSIRANGE_11: /* MSI = 48 MHz */
334  default:
335  break;
336  }
337  }
338  else
339  {
340  msi_range = LL_RCC_MSI_GetRangeAfterStandby();
341  switch (msi_range)
342  {
343  case LL_RCC_MSISRANGE_4: /* MSI = 1 MHz */
344  case LL_RCC_MSISRANGE_5: /* MSI = 2 MHz */
345  /* PLLVCO input frequency is not in the range from 4 to 16 MHz*/
346  status = ERROR;
347  break;
348 
349  case LL_RCC_MSISRANGE_7: /* MSI = 8 MHz */
350  case LL_RCC_MSISRANGE_6: /* MSI = 4 MHz */
351  default:
352  break;
353  }
354  }
355 
356  /* Main PLL configuration and activation */
357  if(status != ERROR)
358  {
359  /* Calculate the new PLL output frequency */
360  pllfreq = UTILS_GetPLLOutputFrequency(__LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(), msi_range),
361  UTILS_PLLInitStruct);
362 
363  /* Enable MSI if not enabled */
364  if(LL_RCC_MSI_IsReady() != 1U)
365  {
367  while ((LL_RCC_MSI_IsReady() != 1U))
368  {
369  /* Wait for MSI ready */
370  }
371  }
372 
373  /* Configure PLL */
374  LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_MSI, UTILS_PLLInitStruct->PLLM, UTILS_PLLInitStruct->PLLN,
375  UTILS_PLLInitStruct->PLLR);
376 
377 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
378  /* Prevent undershoot at highest frequency by applying intermediate AHB prescaler 2 */
379  if(pllfreq > 80000000U)
380  {
381  hpre = UTILS_ClkInitStruct->AHBCLKDivider;
382  if(hpre == LL_RCC_SYSCLK_DIV_1)
383  {
384  UTILS_ClkInitStruct->AHBCLKDivider = LL_RCC_SYSCLK_DIV_2;
385  }
386  }
387 #endif
388  /* Enable PLL and switch system clock to PLL */
389  status = UTILS_EnablePLLAndSwitchSystem(pllfreq, UTILS_ClkInitStruct);
390 
391 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
392  /* Apply definitive AHB prescaler value if necessary */
393  if((status == SUCCESS) && (hpre != 0U))
394  {
395  UTILS_ClkInitStruct->AHBCLKDivider = LL_RCC_SYSCLK_DIV_1;
396  LL_RCC_SetAHBPrescaler(UTILS_ClkInitStruct->AHBCLKDivider);
397  }
398 #endif
399  }
400  }
401  else
402  {
403  /* Current PLL configuration cannot be modified */
404  status = ERROR;
405  }
406 
407  return status;
408 }
409 
426 ErrorStatus LL_PLL_ConfigSystemClock_HSI(LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct,
427  LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct)
428 {
429  ErrorStatus status;
430  uint32_t pllfreq;
431 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
432  uint32_t hpre = 0U; /* Set default value */
433 #endif
434 
435  /* Check if one of the PLL is enabled */
436  if(UTILS_PLL_IsBusy() == SUCCESS)
437  {
438  /* Calculate the new PLL output frequency */
439  pllfreq = UTILS_GetPLLOutputFrequency(HSI_VALUE, UTILS_PLLInitStruct);
440 
441  /* Enable HSI if not enabled */
442  if(LL_RCC_HSI_IsReady() != 1U)
443  {
445  while (LL_RCC_HSI_IsReady() != 1U)
446  {
447  /* Wait for HSI ready */
448  }
449  }
450 
451  /* Configure PLL */
452  LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI, UTILS_PLLInitStruct->PLLM, UTILS_PLLInitStruct->PLLN,
453  UTILS_PLLInitStruct->PLLR);
454 
455 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
456  /* Prevent undershoot at highest frequency by applying intermediate AHB prescaler 2 */
457  if(pllfreq > 80000000U)
458  {
459  hpre = UTILS_ClkInitStruct->AHBCLKDivider;
460  if(hpre == LL_RCC_SYSCLK_DIV_1)
461  {
462  UTILS_ClkInitStruct->AHBCLKDivider = LL_RCC_SYSCLK_DIV_2;
463  }
464  }
465 #endif
466  /* Enable PLL and switch system clock to PLL */
467  status = UTILS_EnablePLLAndSwitchSystem(pllfreq, UTILS_ClkInitStruct);
468 
469 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
470  /* Apply definitive AHB prescaler value if necessary */
471  if((status == SUCCESS) && (hpre != 0U))
472  {
473  UTILS_ClkInitStruct->AHBCLKDivider = LL_RCC_SYSCLK_DIV_1;
474  LL_RCC_SetAHBPrescaler(UTILS_ClkInitStruct->AHBCLKDivider);
475  }
476 #endif
477  }
478  else
479  {
480  /* Current PLL configuration cannot be modified */
481  status = ERROR;
482  }
483 
484  return status;
485 }
486 
507 ErrorStatus LL_PLL_ConfigSystemClock_HSE(uint32_t HSEFrequency, uint32_t HSEBypass,
508  LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct)
509 {
510  ErrorStatus status;
511  uint32_t pllfreq;
512 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
513  uint32_t hpre = 0U; /* Set default value */
514 #endif
515 
516  /* Check the parameters */
517  assert_param(IS_LL_UTILS_HSE_FREQUENCY(HSEFrequency));
518  assert_param(IS_LL_UTILS_HSE_BYPASS(HSEBypass));
519 
520  /* Check if one of the PLL is enabled */
521  if(UTILS_PLL_IsBusy() == SUCCESS)
522  {
523  /* Calculate the new PLL output frequency */
524  pllfreq = UTILS_GetPLLOutputFrequency(HSEFrequency, UTILS_PLLInitStruct);
525 
526  /* Enable HSE if not enabled */
527  if(LL_RCC_HSE_IsReady() != 1U)
528  {
529  /* Check if need to enable HSE bypass feature or not */
530  if(HSEBypass == LL_UTILS_HSEBYPASS_ON)
531  {
533  }
534  else
535  {
537  }
538 
539  /* Enable HSE */
541  while (LL_RCC_HSE_IsReady() != 1U)
542  {
543  /* Wait for HSE ready */
544  }
545  }
546 
547  /* Configure PLL */
548  LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, UTILS_PLLInitStruct->PLLM, UTILS_PLLInitStruct->PLLN,
549  UTILS_PLLInitStruct->PLLR);
550 
551 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
552  /* Prevent undershoot at highest frequency by applying intermediate AHB prescaler 2 */
553  if(pllfreq > 80000000U)
554  {
555  hpre = UTILS_ClkInitStruct->AHBCLKDivider;
556  if(hpre == LL_RCC_SYSCLK_DIV_1)
557  {
558  UTILS_ClkInitStruct->AHBCLKDivider = LL_RCC_SYSCLK_DIV_2;
559  }
560  }
561 #endif
562  /* Enable PLL and switch system clock to PLL */
563  status = UTILS_EnablePLLAndSwitchSystem(pllfreq, UTILS_ClkInitStruct);
564 
565 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
566  /* Apply definitive AHB prescaler value if necessary */
567  if((status == SUCCESS) && (hpre != 0U))
568  {
569  UTILS_ClkInitStruct->AHBCLKDivider = LL_RCC_SYSCLK_DIV_1;
570  LL_RCC_SetAHBPrescaler(UTILS_ClkInitStruct->AHBCLKDivider);
571  }
572 #endif
573  }
574  else
575  {
576  /* Current PLL configuration cannot be modified */
577  status = ERROR;
578  }
579 
580  return status;
581 }
582 
602 static ErrorStatus UTILS_SetFlashLatency(uint32_t HCLK_Frequency)
603 {
604  ErrorStatus status = SUCCESS;
605 
606  uint32_t latency = LL_FLASH_LATENCY_0; /* default value 0WS */
607 
608  /* Frequency cannot be equal to 0 */
609  if(HCLK_Frequency == 0U)
610  {
611  status = ERROR;
612  }
613  else
614  {
615  if(LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE1)
616  {
617 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
618  if(HCLK_Frequency > UTILS_SCALE1_LATENCY5_FREQ)
619  {
620  /* 100 < HCLK <= 120 => 5WS (6 CPU cycles) */
621  latency = LL_FLASH_LATENCY_5;
622  }
623  else if(HCLK_Frequency > UTILS_SCALE1_LATENCY4_FREQ)
624  {
625  /* 80 < HCLK <= 100 => 4WS (5 CPU cycles) */
626  latency = LL_FLASH_LATENCY_4;
627  }
628  else if(HCLK_Frequency > UTILS_SCALE1_LATENCY3_FREQ)
629  {
630  /* 60 < HCLK <= 80 => 3WS (4 CPU cycles) */
631  latency = LL_FLASH_LATENCY_3;
632  }
633  else if(HCLK_Frequency > UTILS_SCALE1_LATENCY2_FREQ)
634  {
635  /* 40 < HCLK <= 20 => 2WS (3 CPU cycles) */
636  latency = LL_FLASH_LATENCY_2;
637  }
638  else
639  {
640  if(HCLK_Frequency > UTILS_SCALE1_LATENCY1_FREQ)
641  {
642  /* 20 < HCLK <= 40 => 1WS (2 CPU cycles) */
643  latency = LL_FLASH_LATENCY_1;
644  }
645  /* else HCLK_Frequency <= 10MHz default LL_FLASH_LATENCY_0 0WS */
646  }
647 #else
648  if(HCLK_Frequency > UTILS_SCALE1_LATENCY4_FREQ)
649  {
650  /* 64 < HCLK <= 80 => 4WS (5 CPU cycles) */
651  latency = LL_FLASH_LATENCY_4;
652  }
653  else if(HCLK_Frequency > UTILS_SCALE1_LATENCY3_FREQ)
654  {
655  /* 48 < HCLK <= 64 => 3WS (4 CPU cycles) */
656  latency = LL_FLASH_LATENCY_3;
657  }
658  else if(HCLK_Frequency > UTILS_SCALE1_LATENCY2_FREQ)
659  {
660  /* 32 < HCLK <= 48 => 2WS (3 CPU cycles) */
661  latency = LL_FLASH_LATENCY_2;
662  }
663  else
664  {
665  if(HCLK_Frequency > UTILS_SCALE1_LATENCY1_FREQ)
666  {
667  /* 16 < HCLK <= 32 => 1WS (2 CPU cycles) */
668  latency = LL_FLASH_LATENCY_1;
669  }
670  /* else HCLK_Frequency <= 16MHz default LL_FLASH_LATENCY_0 0WS */
671  }
672 #endif
673  }
674  else /* SCALE2 */
675  {
676 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
677  if(HCLK_Frequency > UTILS_SCALE2_LATENCY2_FREQ)
678  {
679  /* 16 < HCLK <= 26 => 2WS (3 CPU cycles) */
680  latency = LL_FLASH_LATENCY_2;
681  }
682  else
683  {
684  if(HCLK_Frequency > UTILS_SCALE2_LATENCY1_FREQ)
685  {
686  /* 8 < HCLK <= 16 => 1WS (2 CPU cycles) */
687  latency = LL_FLASH_LATENCY_1;
688  }
689  /* else HCLK_Frequency <= 8MHz default LL_FLASH_LATENCY_0 0WS */
690  }
691 #else
692  if(HCLK_Frequency > UTILS_SCALE2_LATENCY3_FREQ)
693  {
694  /* 18 < HCLK <= 26 => 3WS (4 CPU cycles) */
695  latency = LL_FLASH_LATENCY_3;
696  }
697  else if(HCLK_Frequency > UTILS_SCALE2_LATENCY2_FREQ)
698  {
699  /* 12 < HCLK <= 18 => 2WS (3 CPU cycles) */
700  latency = LL_FLASH_LATENCY_2;
701  }
702  else
703  {
704  if(HCLK_Frequency > UTILS_SCALE2_LATENCY1_FREQ)
705  {
706  /* 6 < HCLK <= 12 => 1WS (2 CPU cycles) */
707  latency = LL_FLASH_LATENCY_1;
708  }
709  /* else HCLK_Frequency <= 6MHz default LL_FLASH_LATENCY_0 0WS */
710  }
711 #endif
712  }
713 
714  LL_FLASH_SetLatency(latency);
715 
716  /* Check that the new number of wait states is taken into account to access the Flash
717  memory by reading the FLASH_ACR register */
718  if(LL_FLASH_GetLatency() != latency)
719  {
720  status = ERROR;
721  }
722  }
723  return status;
724 }
725 
733 static uint32_t UTILS_GetPLLOutputFrequency(uint32_t PLL_InputFrequency, LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct)
734 {
735  uint32_t pllfreq;
736 
737  /* Check the parameters */
738  assert_param(IS_LL_UTILS_PLLM_VALUE(UTILS_PLLInitStruct->PLLM));
739  assert_param(IS_LL_UTILS_PLLN_VALUE(UTILS_PLLInitStruct->PLLN));
740  assert_param(IS_LL_UTILS_PLLR_VALUE(UTILS_PLLInitStruct->PLLR));
741 
742  /* Check different PLL parameters according to RM */
743  /* - PLLM: ensure that the VCO input frequency ranges from 4 to 16 MHz. */
744  pllfreq = PLL_InputFrequency / (((UTILS_PLLInitStruct->PLLM >> RCC_PLLCFGR_PLLM_Pos) + 1U));
745  assert_param(IS_LL_UTILS_PLLVCO_INPUT(pllfreq));
746 
747  /* - PLLN: ensure that the VCO output frequency is between 64 and 344 MHz.*/
748  pllfreq = pllfreq * (UTILS_PLLInitStruct->PLLN & (RCC_PLLCFGR_PLLN >> RCC_PLLCFGR_PLLN_Pos));
749  assert_param(IS_LL_UTILS_PLLVCO_OUTPUT(pllfreq));
750 
751  /* - PLLR: ensure that max frequency at 120000000 Hz is reached */
752  pllfreq = pllfreq / (((UTILS_PLLInitStruct->PLLR >> RCC_PLLCFGR_PLLR_Pos) + 1U) * 2U);
753  assert_param(IS_LL_UTILS_PLL_FREQUENCY(pllfreq));
754 
755  return pllfreq;
756 }
757 
764 static ErrorStatus UTILS_PLL_IsBusy(void)
765 {
766  ErrorStatus status = SUCCESS;
767 
768  /* Check if PLL is busy*/
769  if(LL_RCC_PLL_IsReady() != 0U)
770  {
771  /* PLL configuration cannot be modified */
772  status = ERROR;
773  }
774 
775 #if defined(RCC_PLLSAI1_SUPPORT)
776  /* Check if PLLSAI1 is busy*/
777  if(LL_RCC_PLLSAI1_IsReady() != 0U)
778  {
779  /* PLLSAI1 configuration cannot be modified */
780  status = ERROR;
781  }
782 #endif /*RCC_PLLSAI1_SUPPORT*/
783 #if defined(RCC_PLLSAI2_SUPPORT)
784 
785  /* Check if PLLSAI2 is busy*/
786  if(LL_RCC_PLLSAI2_IsReady() != 0U)
787  {
788  /* PLLSAI2 configuration cannot be modified */
789  status = ERROR;
790  }
791 #endif /*RCC_PLLSAI2_SUPPORT*/
792 
793  return status;
794 }
795 
805 static ErrorStatus UTILS_EnablePLLAndSwitchSystem(uint32_t SYSCLK_Frequency, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct)
806 {
807  ErrorStatus status = SUCCESS;
808  uint32_t hclk_frequency;
809 
810  assert_param(IS_LL_UTILS_SYSCLK_DIV(UTILS_ClkInitStruct->AHBCLKDivider));
811  assert_param(IS_LL_UTILS_APB1_DIV(UTILS_ClkInitStruct->APB1CLKDivider));
812  assert_param(IS_LL_UTILS_APB2_DIV(UTILS_ClkInitStruct->APB2CLKDivider));
813 
814  /* Calculate HCLK frequency */
815  hclk_frequency = __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, UTILS_ClkInitStruct->AHBCLKDivider);
816 
817  /* Increasing the number of wait states because of higher CPU frequency */
818  if(SystemCoreClock < hclk_frequency)
819  {
820  /* Set FLASH latency to highest latency */
821  status = UTILS_SetFlashLatency(hclk_frequency);
822  }
823 
824  /* Update system clock configuration */
825  if(status == SUCCESS)
826  {
827  /* Enable PLL */
830  while (LL_RCC_PLL_IsReady() != 1U)
831  {
832  /* Wait for PLL ready */
833  }
834 
835  /* Sysclk activation on the main PLL */
836  LL_RCC_SetAHBPrescaler(UTILS_ClkInitStruct->AHBCLKDivider);
837  LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);
838  while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
839  {
840  /* Wait for system clock switch to PLL */
841  }
842 
843  /* Set APB1 & APB2 prescaler*/
844  LL_RCC_SetAPB1Prescaler(UTILS_ClkInitStruct->APB1CLKDivider);
845  LL_RCC_SetAPB2Prescaler(UTILS_ClkInitStruct->APB2CLKDivider);
846  }
847 
848  /* Decreasing the number of wait states because of lower CPU frequency */
849  if(SystemCoreClock > hclk_frequency)
850  {
851  /* Set FLASH latency to lowest latency */
852  status = UTILS_SetFlashLatency(hclk_frequency);
853  }
854 
855  /* Update SystemCoreClock variable */
856  if(status == SUCCESS)
857  {
858  LL_SetSystemCoreClock(hclk_frequency);
859  }
860 
861  return status;
862 }
863 
876 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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_MSI(LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct)
This function configures system clock with MSI as clock source of the PLL.
__STATIC_INLINE void LL_RCC_PLL_Enable(void)
Enable PLL CR PLLON LL_RCC_PLL_Enable.
__STATIC_INLINE void LL_RCC_SetAPB2Prescaler(uint32_t Prescaler)
Set APB2 prescaler CFGR PPRE2 LL_RCC_SetAPB2Prescaler.
__STATIC_INLINE uint32_t LL_RCC_HSI_IsReady(void)
Check if HSI clock is ready CR HSIRDY LL_RCC_HSI_IsReady.
__STATIC_INLINE uint32_t LL_RCC_PLLSAI2_IsReady(void)
Check if PLLSAI2 Ready CR PLLSAI2RDY LL_RCC_PLLSAI2_IsReady.
__STATIC_INLINE void LL_RCC_HSE_Enable(void)
Enable HSE crystal oscillator (HSE ON) CR HSEON LL_RCC_HSE_Enable.
__STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks)
This function configures the Cortex-M SysTick source of the time base.
__STATIC_INLINE void LL_RCC_SetAHBPrescaler(uint32_t Prescaler)
Set AHB prescaler CFGR HPRE LL_RCC_SetAHBPrescaler.
Header file of RCC LL module.
__STATIC_INLINE uint32_t LL_PWR_GetRegulVoltageScaling(void)
Get the main internal regulator output voltage CR1 VOS LL_PWR_GetRegulVoltageScaling.
__STATIC_INLINE uint32_t LL_RCC_MSI_GetRangeAfterStandby(void)
Get MSI range used after standby CSR MSISRANGE LL_RCC_MSI_GetRangeAfterStandby.
__STATIC_INLINE uint32_t LL_RCC_GetSysClkSource(void)
Get the system clock source CFGR SWS LL_RCC_GetSysClkSource.
__STATIC_INLINE uint32_t LL_FLASH_GetLatency(void)
Get FLASH Latency FLASH_ACR LATENCY LL_FLASH_GetLatency.
UTILS PLL structure definition.
void LL_SetSystemCoreClock(uint32_t HCLKFrequency)
This function sets directly SystemCoreClock CMSIS variable.
__STATIC_INLINE void LL_RCC_HSE_DisableBypass(void)
Disable HSE external oscillator (HSE Bypass) CR HSEBYP LL_RCC_HSE_DisableBypass. ...
__STATIC_INLINE uint32_t LL_RCC_PLL_IsReady(void)
Check if PLL Ready CR PLLRDY LL_RCC_PLL_IsReady.
__STATIC_INLINE uint32_t LL_RCC_MSI_IsReady(void)
Check if MSI oscillator Ready CR MSIRDY LL_RCC_MSI_IsReady.
void LL_mDelay(uint32_t Delay)
This function provides accurate delay (in milliseconds) based on SysTick counter flag.
__STATIC_INLINE uint32_t LL_RCC_MSI_IsEnabledRangeSelect(void)
Check if MSI clock range is selected with MSIRANGE register CR MSIRGSEL LL_RCC_MSI_IsEnabledRangeSel...
__STATIC_INLINE void LL_RCC_HSE_EnableBypass(void)
Enable HSE external oscillator (HSE Bypass) CR HSEBYP LL_RCC_HSE_EnableBypass.
__STATIC_INLINE void LL_RCC_SetAPB1Prescaler(uint32_t Prescaler)
Set APB1 prescaler CFGR PPRE1 LL_RCC_SetAPB1Prescaler.
__STATIC_INLINE void LL_RCC_MSI_Enable(void)
Enable MSI oscillator CR MSION LL_RCC_MSI_Enable.
static ErrorStatus UTILS_SetFlashLatency(uint32_t HCLK_Frequency)
Update number of Flash wait states in line with new frequency and current voltage range...
__STATIC_INLINE void LL_RCC_PLL_EnableDomain_SYS(void)
Enable PLL output mapped on SYSCLK domain PLLCFGR PLLREN LL_RCC_PLL_EnableDomain_SYS.
__STATIC_INLINE void LL_RCC_HSI_Enable(void)
Enable HSI oscillator CR HSION LL_RCC_HSI_Enable.
static uint32_t UTILS_GetPLLOutputFrequency(uint32_t PLL_InputFrequency, LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct)
Function to check that PLL can be modified.
UTILS System, AHB and APB buses clock configuration structure definition.
__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SYS(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR)
Configure PLL used for SYSCLK Domain.
Header file of SYSTEM LL module.
static ErrorStatus UTILS_PLL_IsBusy(void)
Function to check that PLL can be modified.
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 uint32_t LL_RCC_PLLSAI1_IsReady(void)
Check if PLLSAI1 Ready CR PLLSAI1RDY LL_RCC_PLLSAI1_IsReady.
__STATIC_INLINE uint32_t LL_RCC_HSE_IsReady(void)
Check if HSE oscillator Ready CR HSERDY LL_RCC_HSE_IsReady.
__STATIC_INLINE void LL_FLASH_SetLatency(uint32_t Latency)
Set FLASH Latency FLASH_ACR LATENCY LL_FLASH_SetLatency.
void LL_Init1msTick(uint32_t HCLKFrequency)
This function configures the Cortex-M SysTick source to have 1ms time base.
Header file of UTILS LL module.
__STATIC_INLINE void LL_RCC_SetSysClkSource(uint32_t Source)
Configure the system clock source CFGR SW LL_RCC_SetSysClkSource.
Header file of PWR LL module.
__STATIC_INLINE uint32_t LL_RCC_MSI_GetRange(void)
Get the Internal Multi Speed oscillator (MSI) clock range in run mode. CR MSIRANGE LL_RCC_MSI_GetRan...
static ErrorStatus UTILS_EnablePLLAndSwitchSystem(uint32_t SYSCLK_Frequency, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct)
Function to enable PLL and switch system clock to PLL.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))