STM32L4xx_HAL_Driver  1.14.0
stm32l4xx_hal_rcc.c
Go to the documentation of this file.
1 
52 /* Includes ------------------------------------------------------------------*/
53 #include "stm32l4xx_hal.h"
54 
64 #ifdef HAL_RCC_MODULE_ENABLED
65 
66 /* Private typedef -----------------------------------------------------------*/
67 /* Private define ------------------------------------------------------------*/
71 #define HSE_TIMEOUT_VALUE HSE_STARTUP_TIMEOUT
72 #define HSI_TIMEOUT_VALUE 2U /* 2 ms (minimum Tick + 1) */
73 #define MSI_TIMEOUT_VALUE 2U /* 2 ms (minimum Tick + 1) */
74 #if defined(RCC_CSR_LSIPREDIV)
75 #define LSI_TIMEOUT_VALUE 17U /* 17 ms (16 ms starting time + 1) */
76 #else
77 #define LSI_TIMEOUT_VALUE 2U /* 2 ms (minimum Tick + 1) */
78 #endif /* RCC_CSR_LSIPREDIV */
79 #define HSI48_TIMEOUT_VALUE 2U /* 2 ms (minimum Tick + 1) */
80 #define PLL_TIMEOUT_VALUE 2U /* 2 ms (minimum Tick + 1) */
81 #define CLOCKSWITCH_TIMEOUT_VALUE 5000U /* 5 s */
82 
86 /* Private macro -------------------------------------------------------------*/
90 #define __MCO1_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
91 #define MCO1_GPIO_PORT GPIOA
92 #define MCO1_PIN GPIO_PIN_8
93 
94 #define RCC_PLL_OSCSOURCE_CONFIG(__HAL_RCC_PLLSOURCE__) \
95  (MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, (__HAL_RCC_PLLSOURCE__)))
96 
100 /* Private variables ---------------------------------------------------------*/
101 
102 /* Private function prototypes -----------------------------------------------*/
106 static HAL_StatusTypeDef RCC_SetFlashLatencyFromMSIRange(uint32_t msirange);
107 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
108 static uint32_t RCC_GetSysClockFreqFromPLLSource(void);
109 #endif
110 
114 /* Exported functions --------------------------------------------------------*/
115 
264 HAL_StatusTypeDef HAL_RCC_DeInit(void)
265 {
266  uint32_t tickstart;
267 
268  /* Reset to default System clock */
269  /* Set MSION bit */
270  SET_BIT(RCC->CR, RCC_CR_MSION);
271 
272  /* Insure MSIRDY bit is set before writing default MSIRANGE value */
273  /* Get start tick */
274  tickstart = HAL_GetTick();
275 
276  /* Wait till MSI is ready */
277  while(READ_BIT(RCC->CR, RCC_CR_MSIRDY) == 0U)
278  {
279  if((HAL_GetTick() - tickstart) > MSI_TIMEOUT_VALUE)
280  {
281  return HAL_TIMEOUT;
282  }
283  }
284 
285  /* Set MSIRANGE default value */
286  MODIFY_REG(RCC->CR, RCC_CR_MSIRANGE, RCC_MSIRANGE_6);
287 
288  /* Reset CFGR register (MSI is selected as system clock source) */
289  CLEAR_REG(RCC->CFGR);
290 
291  /* Update the SystemCoreClock global variable for MSI as system clock source */
292  SystemCoreClock = MSI_VALUE;
293 
294  /* Configure the source of time base considering new system clock settings */
296  {
297  return HAL_ERROR;
298  }
299 
300  /* Insure MSI selected as system clock source */
301  /* Get start tick */
302  tickstart = HAL_GetTick();
303 
304  /* Wait till system clock source is ready */
305  while(READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RCC_CFGR_SWS_MSI)
306  {
307  if((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE)
308  {
309  return HAL_TIMEOUT;
310  }
311  }
312 
313  /* Reset HSION, HSIKERON, HSIASFS, HSEON, HSECSSON, PLLON, PLLSAIxON bits */
314 #if defined(RCC_PLLSAI2_SUPPORT)
315 
316  CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSION | RCC_CR_HSIKERON| RCC_CR_HSIASFS | RCC_CR_PLLON | RCC_CR_PLLSAI1ON | RCC_CR_PLLSAI2ON);
317 
318 #elif defined(RCC_PLLSAI1_SUPPORT)
319 
320  CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSION | RCC_CR_HSIKERON| RCC_CR_HSIASFS | RCC_CR_PLLON | RCC_CR_PLLSAI1ON);
321 
322 #else
323 
324  CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSION | RCC_CR_HSIKERON| RCC_CR_HSIASFS | RCC_CR_PLLON);
325 
326 #endif /* RCC_PLLSAI2_SUPPORT */
327 
328  /* Insure PLLRDY, PLLSAI1RDY and PLLSAI2RDY (if present) are reset */
329  /* Get start tick */
330  tickstart = HAL_GetTick();
331 
332 #if defined(RCC_PLLSAI2_SUPPORT)
333 
334  while(READ_BIT(RCC->CR, RCC_CR_PLLRDY | RCC_CR_PLLSAI1RDY | RCC_CR_PLLSAI2RDY) != 0U)
335 
336 #elif defined(RCC_PLLSAI1_SUPPORT)
337 
338  while(READ_BIT(RCC->CR, RCC_CR_PLLRDY | RCC_CR_PLLSAI1RDY) != 0U)
339 
340 #else
341 
342  while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) != 0U)
343 
344 #endif
345  {
346  if((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)
347  {
348  return HAL_TIMEOUT;
349  }
350  }
351 
352  /* Reset PLLCFGR register */
353  CLEAR_REG(RCC->PLLCFGR);
354  SET_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN_4 );
355 
356 #if defined(RCC_PLLSAI1_SUPPORT)
357 
358  /* Reset PLLSAI1CFGR register */
359  CLEAR_REG(RCC->PLLSAI1CFGR);
360  SET_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1N_4 );
361 
362 #endif /* RCC_PLLSAI1_SUPPORT */
363 
364 #if defined(RCC_PLLSAI2_SUPPORT)
365 
366  /* Reset PLLSAI2CFGR register */
367  CLEAR_REG(RCC->PLLSAI2CFGR);
368  SET_BIT(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2N_4 );
369 
370 #endif /* RCC_PLLSAI2_SUPPORT */
371 
372  /* Reset HSEBYP bit */
373  CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP);
374 
375  /* Disable all interrupts */
376  CLEAR_REG(RCC->CIER);
377 
378  /* Clear all interrupt flags */
379  WRITE_REG(RCC->CICR, 0xFFFFFFFFU);
380 
381  /* Clear all reset flags */
382  SET_BIT(RCC->CSR, RCC_CSR_RMVF);
383 
384  return HAL_OK;
385 }
386 
401 HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct)
402 {
403  uint32_t tickstart;
404  HAL_StatusTypeDef status;
405  uint32_t sysclk_source, pll_config;
406 
407  /* Check Null pointer */
408  if(RCC_OscInitStruct == NULL)
409  {
410  return HAL_ERROR;
411  }
412 
413  /* Check the parameters */
414  assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType));
415 
416  sysclk_source = __HAL_RCC_GET_SYSCLK_SOURCE();
417  pll_config = __HAL_RCC_GET_PLL_OSCSOURCE();
418 
419  /*----------------------------- MSI Configuration --------------------------*/
420  if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_MSI) == RCC_OSCILLATORTYPE_MSI)
421  {
422  /* Check the parameters */
423  assert_param(IS_RCC_MSI(RCC_OscInitStruct->MSIState));
424  assert_param(IS_RCC_MSICALIBRATION_VALUE(RCC_OscInitStruct->MSICalibrationValue));
425  assert_param(IS_RCC_MSI_CLOCK_RANGE(RCC_OscInitStruct->MSIClockRange));
426 
427  /* Check if MSI is used as system clock or as PLL source when PLL is selected as system clock */
428  if((sysclk_source == RCC_CFGR_SWS_MSI) ||
429  ((sysclk_source == RCC_CFGR_SWS_PLL) && (pll_config == RCC_PLLSOURCE_MSI)))
430  {
431  if((READ_BIT(RCC->CR, RCC_CR_MSIRDY) != 0U) && (RCC_OscInitStruct->MSIState == RCC_MSI_OFF))
432  {
433  return HAL_ERROR;
434  }
435 
436  /* Otherwise, just the calibration and MSI range change are allowed */
437  else
438  {
439  /* To correctly read data from FLASH memory, the number of wait states (LATENCY)
440  must be correctly programmed according to the frequency of the CPU clock
441  (HCLK) and the supply voltage of the device. */
442  if(RCC_OscInitStruct->MSIClockRange > __HAL_RCC_GET_MSI_RANGE())
443  {
444  /* First increase number of wait states update if necessary */
445  if(RCC_SetFlashLatencyFromMSIRange(RCC_OscInitStruct->MSIClockRange) != HAL_OK)
446  {
447  return HAL_ERROR;
448  }
449 
450  /* Selects the Multiple Speed oscillator (MSI) clock range .*/
451  __HAL_RCC_MSI_RANGE_CONFIG(RCC_OscInitStruct->MSIClockRange);
452  /* Adjusts the Multiple Speed oscillator (MSI) calibration value.*/
453  __HAL_RCC_MSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->MSICalibrationValue);
454  }
455  else
456  {
457  /* Else, keep current flash latency while decreasing applies */
458  /* Selects the Multiple Speed oscillator (MSI) clock range .*/
459  __HAL_RCC_MSI_RANGE_CONFIG(RCC_OscInitStruct->MSIClockRange);
460  /* Adjusts the Multiple Speed oscillator (MSI) calibration value.*/
461  __HAL_RCC_MSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->MSICalibrationValue);
462 
463  /* Decrease number of wait states update if necessary */
464  if(RCC_SetFlashLatencyFromMSIRange(RCC_OscInitStruct->MSIClockRange) != HAL_OK)
465  {
466  return HAL_ERROR;
467  }
468  }
469 
470  /* Update the SystemCoreClock global variable */
471  SystemCoreClock = HAL_RCC_GetSysClockFreq() >> (AHBPrescTable[READ_BIT(RCC->CFGR, RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos] & 0x1FU);
472 
473  /* Configure the source of time base considering new system clocks settings*/
474  status = HAL_InitTick(uwTickPrio);
475  if(status != HAL_OK)
476  {
477  return status;
478  }
479  }
480  }
481  else
482  {
483  /* Check the MSI State */
484  if(RCC_OscInitStruct->MSIState != RCC_MSI_OFF)
485  {
486  /* Enable the Internal High Speed oscillator (MSI). */
487  __HAL_RCC_MSI_ENABLE();
488 
489  /* Get timeout */
490  tickstart = HAL_GetTick();
491 
492  /* Wait till MSI is ready */
493  while(READ_BIT(RCC->CR, RCC_CR_MSIRDY) == 0U)
494  {
495  if((HAL_GetTick() - tickstart) > MSI_TIMEOUT_VALUE)
496  {
497  return HAL_TIMEOUT;
498  }
499  }
500  /* Selects the Multiple Speed oscillator (MSI) clock range .*/
501  __HAL_RCC_MSI_RANGE_CONFIG(RCC_OscInitStruct->MSIClockRange);
502  /* Adjusts the Multiple Speed oscillator (MSI) calibration value.*/
503  __HAL_RCC_MSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->MSICalibrationValue);
504 
505  }
506  else
507  {
508  /* Disable the Internal High Speed oscillator (MSI). */
509  __HAL_RCC_MSI_DISABLE();
510 
511  /* Get timeout */
512  tickstart = HAL_GetTick();
513 
514  /* Wait till MSI is ready */
515  while(READ_BIT(RCC->CR, RCC_CR_MSIRDY) != 0U)
516  {
517  if((HAL_GetTick() - tickstart) > MSI_TIMEOUT_VALUE)
518  {
519  return HAL_TIMEOUT;
520  }
521  }
522  }
523  }
524  }
525  /*------------------------------- HSE Configuration ------------------------*/
526  if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE)
527  {
528  /* Check the parameters */
529  assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState));
530 
531  /* When the HSE is used as system clock or clock source for PLL in these cases it is not allowed to be disabled */
532  if((sysclk_source == RCC_CFGR_SWS_HSE) ||
533  ((sysclk_source == RCC_CFGR_SWS_PLL) && (pll_config == RCC_PLLSOURCE_HSE)))
534  {
535  if((READ_BIT(RCC->CR, RCC_CR_HSERDY) != 0U) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF))
536  {
537  return HAL_ERROR;
538  }
539  }
540  else
541  {
542  /* Set the new HSE configuration ---------------------------------------*/
543  __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState);
544 
545  /* Check the HSE State */
546  if(RCC_OscInitStruct->HSEState != RCC_HSE_OFF)
547  {
548  /* Get Start Tick*/
549  tickstart = HAL_GetTick();
550 
551  /* Wait till HSE is ready */
552  while(READ_BIT(RCC->CR, RCC_CR_HSERDY) == 0U)
553  {
554  if((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE)
555  {
556  return HAL_TIMEOUT;
557  }
558  }
559  }
560  else
561  {
562  /* Get Start Tick*/
563  tickstart = HAL_GetTick();
564 
565  /* Wait till HSE is disabled */
566  while(READ_BIT(RCC->CR, RCC_CR_HSERDY) != 0U)
567  {
568  if((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE)
569  {
570  return HAL_TIMEOUT;
571  }
572  }
573  }
574  }
575  }
576  /*----------------------------- HSI Configuration --------------------------*/
577  if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI)
578  {
579  /* Check the parameters */
580  assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState));
581  assert_param(IS_RCC_HSI_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue));
582 
583  /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */
584  if((sysclk_source == RCC_CFGR_SWS_HSI) ||
585  ((sysclk_source == RCC_CFGR_SWS_PLL) && (pll_config == RCC_PLLSOURCE_HSI)))
586  {
587  /* When HSI is used as system clock it will not be disabled */
588  if((READ_BIT(RCC->CR, RCC_CR_HSIRDY) != 0U) && (RCC_OscInitStruct->HSIState == RCC_HSI_OFF))
589  {
590  return HAL_ERROR;
591  }
592  /* Otherwise, just the calibration is allowed */
593  else
594  {
595  /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/
596  __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue);
597  }
598  }
599  else
600  {
601  /* Check the HSI State */
602  if(RCC_OscInitStruct->HSIState != RCC_HSI_OFF)
603  {
604  /* Enable the Internal High Speed oscillator (HSI). */
605  __HAL_RCC_HSI_ENABLE();
606 
607  /* Get Start Tick*/
608  tickstart = HAL_GetTick();
609 
610  /* Wait till HSI is ready */
611  while(READ_BIT(RCC->CR, RCC_CR_HSIRDY) == 0U)
612  {
613  if((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE)
614  {
615  return HAL_TIMEOUT;
616  }
617  }
618 
619  /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/
620  __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue);
621  }
622  else
623  {
624  /* Disable the Internal High Speed oscillator (HSI). */
625  __HAL_RCC_HSI_DISABLE();
626 
627  /* Get Start Tick*/
628  tickstart = HAL_GetTick();
629 
630  /* Wait till HSI is disabled */
631  while(READ_BIT(RCC->CR, RCC_CR_HSIRDY) != 0U)
632  {
633  if((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE)
634  {
635  return HAL_TIMEOUT;
636  }
637  }
638  }
639  }
640  }
641  /*------------------------------ LSI Configuration -------------------------*/
642  if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI)
643  {
644  /* Check the parameters */
645  assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState));
646 
647  /* Check the LSI State */
648  if(RCC_OscInitStruct->LSIState != RCC_LSI_OFF)
649  {
650 #if defined(RCC_CSR_LSIPREDIV)
651  uint32_t csr_temp = RCC->CSR;
652 
653  /* Check LSI division factor */
654  assert_param(IS_RCC_LSIDIV(RCC_OscInitStruct->LSIDiv));
655 
656  if (RCC_OscInitStruct->LSIDiv != (csr_temp & RCC_CSR_LSIPREDIV))
657  {
658  if (((csr_temp & RCC_CSR_LSIRDY) == RCC_CSR_LSIRDY) && \
659  ((csr_temp & RCC_CSR_LSION) != RCC_CSR_LSION))
660  {
661  /* If LSIRDY is set while LSION is not enabled,
662  LSIPREDIV can't be updated */
663  return HAL_ERROR;
664  }
665 
666  /* Turn off LSI before changing RCC_CSR_LSIPREDIV */
667  if ((csr_temp & RCC_CSR_LSION) == RCC_CSR_LSION)
668  {
669  __HAL_RCC_LSI_DISABLE();
670 
671  /* Get Start Tick*/
672  tickstart = HAL_GetTick();
673 
674  /* Wait till LSI is disabled */
675  while(READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) != 0U)
676  {
677  if((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE)
678  {
679  return HAL_TIMEOUT;
680  }
681  }
682  }
683 
684  /* Set LSI division factor */
685  MODIFY_REG(RCC->CSR, RCC_CSR_LSIPREDIV, RCC_OscInitStruct->LSIDiv);
686  }
687 #endif /* RCC_CSR_LSIPREDIV */
688 
689  /* Enable the Internal Low Speed oscillator (LSI). */
690  __HAL_RCC_LSI_ENABLE();
691 
692  /* Get Start Tick*/
693  tickstart = HAL_GetTick();
694 
695  /* Wait till LSI is ready */
696  while(READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) == 0U)
697  {
698  if((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE)
699  {
700  return HAL_TIMEOUT;
701  }
702  }
703  }
704  else
705  {
706  /* Disable the Internal Low Speed oscillator (LSI). */
707  __HAL_RCC_LSI_DISABLE();
708 
709  /* Get Start Tick*/
710  tickstart = HAL_GetTick();
711 
712  /* Wait till LSI is disabled */
713  while(READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) != 0U)
714  {
715  if((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE)
716  {
717  return HAL_TIMEOUT;
718  }
719  }
720  }
721  }
722  /*------------------------------ LSE Configuration -------------------------*/
723  if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE)
724  {
725  FlagStatus pwrclkchanged = RESET;
726 
727  /* Check the parameters */
728  assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState));
729 
730  /* Update LSE configuration in Backup Domain control register */
731  /* Requires to enable write access to Backup Domain of necessary */
732  if(HAL_IS_BIT_CLR(RCC->APB1ENR1, RCC_APB1ENR1_PWREN))
733  {
734  __HAL_RCC_PWR_CLK_ENABLE();
735  pwrclkchanged = SET;
736  }
737 
738  if(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP))
739  {
740  /* Enable write access to Backup domain */
741  SET_BIT(PWR->CR1, PWR_CR1_DBP);
742 
743  /* Wait for Backup domain Write protection disable */
744  tickstart = HAL_GetTick();
745 
746  while(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP))
747  {
748  if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE)
749  {
750  return HAL_TIMEOUT;
751  }
752  }
753  }
754 
755  /* Set the new LSE configuration -----------------------------------------*/
756 #if defined(RCC_BDCR_LSESYSDIS)
757  if((RCC_OscInitStruct->LSEState & RCC_BDCR_LSEON) != 0U)
758  {
759  /* Set LSESYSDIS bit according to LSE propagation option (enabled or disabled) */
760  MODIFY_REG(RCC->BDCR, RCC_BDCR_LSESYSDIS, (RCC_OscInitStruct->LSEState & RCC_BDCR_LSESYSDIS));
761 
762  if((RCC_OscInitStruct->LSEState & RCC_BDCR_LSEBYP) != 0U)
763  {
764  /* LSE oscillator bypass enable */
765  SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP);
766  SET_BIT(RCC->BDCR, RCC_BDCR_LSEON);
767  }
768  else
769  {
770  /* LSE oscillator enable */
771  SET_BIT(RCC->BDCR, RCC_BDCR_LSEON);
772  }
773  }
774  else
775  {
776  CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON);
777  CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP);
778  }
779 #else
780  __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState);
781 #endif /* RCC_BDCR_LSESYSDIS */
782 
783  /* Check the LSE State */
784  if(RCC_OscInitStruct->LSEState != RCC_LSE_OFF)
785  {
786  /* Get Start Tick*/
787  tickstart = HAL_GetTick();
788 
789  /* Wait till LSE is ready */
790  while(READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) == 0U)
791  {
792  if((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE)
793  {
794  return HAL_TIMEOUT;
795  }
796  }
797  }
798  else
799  {
800  /* Get Start Tick*/
801  tickstart = HAL_GetTick();
802 
803  /* Wait till LSE is disabled */
804  while(READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) != 0U)
805  {
806  if((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE)
807  {
808  return HAL_TIMEOUT;
809  }
810  }
811 
812 #if defined(RCC_BDCR_LSESYSDIS)
813  /* By default, stop disabling LSE propagation */
814  CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSESYSDIS);
815 #endif /* RCC_BDCR_LSESYSDIS */
816  }
817 
818  /* Restore clock configuration if changed */
819  if(pwrclkchanged == SET)
820  {
821  __HAL_RCC_PWR_CLK_DISABLE();
822  }
823  }
824 #if defined(RCC_HSI48_SUPPORT)
825  /*------------------------------ HSI48 Configuration -----------------------*/
826  if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI48) == RCC_OSCILLATORTYPE_HSI48)
827  {
828  /* Check the parameters */
829  assert_param(IS_RCC_HSI48(RCC_OscInitStruct->HSI48State));
830 
831  /* Check the LSI State */
832  if(RCC_OscInitStruct->HSI48State != RCC_HSI48_OFF)
833  {
834  /* Enable the Internal Low Speed oscillator (HSI48). */
835  __HAL_RCC_HSI48_ENABLE();
836 
837  /* Get Start Tick*/
838  tickstart = HAL_GetTick();
839 
840  /* Wait till HSI48 is ready */
841  while(READ_BIT(RCC->CRRCR, RCC_CRRCR_HSI48RDY) == 0U)
842  {
843  if((HAL_GetTick() - tickstart) > HSI48_TIMEOUT_VALUE)
844  {
845  return HAL_TIMEOUT;
846  }
847  }
848  }
849  else
850  {
851  /* Disable the Internal Low Speed oscillator (HSI48). */
852  __HAL_RCC_HSI48_DISABLE();
853 
854  /* Get Start Tick*/
855  tickstart = HAL_GetTick();
856 
857  /* Wait till HSI48 is disabled */
858  while(READ_BIT(RCC->CRRCR, RCC_CRRCR_HSI48RDY) != 0U)
859  {
860  if((HAL_GetTick() - tickstart) > HSI48_TIMEOUT_VALUE)
861  {
862  return HAL_TIMEOUT;
863  }
864  }
865  }
866  }
867 #endif /* RCC_HSI48_SUPPORT */
868  /*-------------------------------- PLL Configuration -----------------------*/
869  /* Check the parameters */
870  assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState));
871 
872  if(RCC_OscInitStruct->PLL.PLLState != RCC_PLL_NONE)
873  {
874  /* Check if the PLL is used as system clock or not */
875  if(sysclk_source != RCC_CFGR_SWS_PLL)
876  {
877  if(RCC_OscInitStruct->PLL.PLLState == RCC_PLL_ON)
878  {
879  /* Check the parameters */
880  assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource));
881  assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM));
882  assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN));
883 #if defined(RCC_PLLP_SUPPORT)
884  assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP));
885 #endif /* RCC_PLLP_SUPPORT */
886  assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ));
887  assert_param(IS_RCC_PLLR_VALUE(RCC_OscInitStruct->PLL.PLLR));
888 
889  /* Disable the main PLL. */
890  __HAL_RCC_PLL_DISABLE();
891 
892  /* Get Start Tick*/
893  tickstart = HAL_GetTick();
894 
895  /* Wait till PLL is ready */
896  while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) != 0U)
897  {
898  if((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)
899  {
900  return HAL_TIMEOUT;
901  }
902  }
903 
904  /* Configure the main PLL clock source, multiplication and division factors. */
905  __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource,
906  RCC_OscInitStruct->PLL.PLLM,
907  RCC_OscInitStruct->PLL.PLLN,
908 #if defined(RCC_PLLP_SUPPORT)
909  RCC_OscInitStruct->PLL.PLLP,
910 #endif
911  RCC_OscInitStruct->PLL.PLLQ,
912  RCC_OscInitStruct->PLL.PLLR);
913 
914  /* Enable the main PLL. */
915  __HAL_RCC_PLL_ENABLE();
916 
917  /* Enable PLL System Clock output. */
918  __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL_SYSCLK);
919 
920  /* Get Start Tick*/
921  tickstart = HAL_GetTick();
922 
923  /* Wait till PLL is ready */
924  while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) == 0U)
925  {
926  if((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)
927  {
928  return HAL_TIMEOUT;
929  }
930  }
931  }
932  else
933  {
934  /* Disable the main PLL. */
935  __HAL_RCC_PLL_DISABLE();
936 
937  /* Disable all PLL outputs to save power if no PLLs on */
938 #if defined(RCC_PLLSAI1_SUPPORT) && defined(RCC_CR_PLLSAI2RDY)
939  if(READ_BIT(RCC->CR, (RCC_CR_PLLSAI1RDY | RCC_CR_PLLSAI2RDY)) == 0U)
940  {
941  MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, RCC_PLLSOURCE_NONE);
942  }
943 #elif defined(RCC_PLLSAI1_SUPPORT)
944  if(READ_BIT(RCC->CR, RCC_CR_PLLSAI1RDY) == 0U)
945  {
946  MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, RCC_PLLSOURCE_NONE);
947  }
948 #else
949  MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, RCC_PLLSOURCE_NONE);
950 #endif /* RCC_PLLSAI1_SUPPORT && RCC_CR_PLLSAI2RDY */
951 
952 #if defined(RCC_PLLSAI2_SUPPORT)
953  __HAL_RCC_PLLCLKOUT_DISABLE(RCC_PLL_SYSCLK | RCC_PLL_48M1CLK | RCC_PLL_SAI3CLK);
954 #elif defined(RCC_PLLSAI1_SUPPORT)
955  __HAL_RCC_PLLCLKOUT_DISABLE(RCC_PLL_SYSCLK | RCC_PLL_48M1CLK | RCC_PLL_SAI2CLK);
956 #else
957  __HAL_RCC_PLLCLKOUT_DISABLE(RCC_PLL_SYSCLK | RCC_PLL_48M1CLK);
958 #endif /* RCC_PLLSAI2_SUPPORT */
959 
960  /* Get Start Tick*/
961  tickstart = HAL_GetTick();
962 
963  /* Wait till PLL is disabled */
964  while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) != 0U)
965  {
966  if((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)
967  {
968  return HAL_TIMEOUT;
969  }
970  }
971  }
972  }
973  else
974  {
975  /* Check if there is a request to disable the PLL used as System clock source */
976  if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF)
977  {
978  return HAL_ERROR;
979  }
980  else
981  {
982  pll_config = RCC->PLLCFGR;
983  /* Do not return HAL_ERROR if request repeats the current configuration */
984  if((READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) ||
985  (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != ((RCC_OscInitStruct->PLL.PLLM - 1U) << RCC_PLLCFGR_PLLM_Pos)) ||
986  (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) ||
987 #if defined(RCC_PLLP_SUPPORT)
988 #if defined(RCC_PLLP_DIV_2_31_SUPPORT)
989  (READ_BIT(pll_config, RCC_PLLCFGR_PLLPDIV) != (RCC_OscInitStruct->PLL.PLLP << RCC_PLLCFGR_PLLPDIV_Pos)) ||
990 #else
991  (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != ((RCC_OscInitStruct->PLL.PLLP == RCC_PLLP_DIV7) ? 0U : 1U)) ||
992 #endif
993 #endif
994  (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != ((((RCC_OscInitStruct->PLL.PLLQ) >> 1U) - 1U) << RCC_PLLCFGR_PLLQ_Pos)) ||
995  (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != ((((RCC_OscInitStruct->PLL.PLLR) >> 1U) - 1U) << RCC_PLLCFGR_PLLR_Pos)))
996  {
997  return HAL_ERROR;
998  }
999  }
1000  }
1001  }
1002  return HAL_OK;
1003 }
1004 
1055 HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency)
1056 {
1057  uint32_t tickstart;
1058 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
1059  uint32_t hpre = RCC_SYSCLK_DIV1;
1060 #endif
1061  HAL_StatusTypeDef status;
1062 
1063  /* Check Null pointer */
1064  if(RCC_ClkInitStruct == NULL)
1065  {
1066  return HAL_ERROR;
1067  }
1068 
1069  /* Check the parameters */
1070  assert_param(IS_RCC_CLOCKTYPE(RCC_ClkInitStruct->ClockType));
1071  assert_param(IS_FLASH_LATENCY(FLatency));
1072 
1073  /* To correctly read data from FLASH memory, the number of wait states (LATENCY)
1074  must be correctly programmed according to the frequency of the CPU clock
1075  (HCLK) and the supply voltage of the device. */
1076 
1077  /* Increasing the number of wait states because of higher CPU frequency */
1078  if(FLatency > __HAL_FLASH_GET_LATENCY())
1079  {
1080  /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
1081  __HAL_FLASH_SET_LATENCY(FLatency);
1082 
1083  /* Check that the new number of wait states is taken into account to access the Flash
1084  memory by reading the FLASH_ACR register */
1085  if(__HAL_FLASH_GET_LATENCY() != FLatency)
1086  {
1087  return HAL_ERROR;
1088  }
1089  }
1090 
1091  /*------------------------- SYSCLK Configuration ---------------------------*/
1092  if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK)
1093  {
1094  assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource));
1095 
1096  /* PLL is selected as System Clock Source */
1097  if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK)
1098  {
1099  /* Check the PLL ready flag */
1100  if(READ_BIT(RCC->CR, RCC_CR_PLLRDY) == 0U)
1101  {
1102  return HAL_ERROR;
1103  }
1104 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
1105  /* Undershoot management when selection PLL as SYSCLK source and frequency above 80Mhz */
1106  /* Compute target PLL output frequency */
1107  if(RCC_GetSysClockFreqFromPLLSource() > 80000000U)
1108  {
1109  if(READ_BIT(RCC->CFGR, RCC_CFGR_HPRE) == RCC_SYSCLK_DIV1)
1110  {
1111  /* Intermediate step with HCLK prescaler 2 necessary before to go over 80Mhz */
1112  MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_SYSCLK_DIV2);
1113  hpre = RCC_SYSCLK_DIV2;
1114  }
1115  else if((((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) && (RCC_ClkInitStruct->AHBCLKDivider == RCC_SYSCLK_DIV1))
1116  {
1117  /* Intermediate step with HCLK prescaler 2 necessary before to go over 80Mhz */
1118  MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_SYSCLK_DIV2);
1119  hpre = RCC_SYSCLK_DIV2;
1120  }
1121  else
1122  {
1123  /* nothing to do */
1124  }
1125  }
1126 #endif
1127  }
1128  else
1129  {
1130  /* HSE is selected as System Clock Source */
1131  if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE)
1132  {
1133  /* Check the HSE ready flag */
1134  if(READ_BIT(RCC->CR, RCC_CR_HSERDY) == 0U)
1135  {
1136  return HAL_ERROR;
1137  }
1138  }
1139  /* MSI is selected as System Clock Source */
1140  else if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_MSI)
1141  {
1142  /* Check the MSI ready flag */
1143  if(READ_BIT(RCC->CR, RCC_CR_MSIRDY) == 0U)
1144  {
1145  return HAL_ERROR;
1146  }
1147  }
1148  /* HSI is selected as System Clock Source */
1149  else
1150  {
1151  /* Check the HSI ready flag */
1152  if(READ_BIT(RCC->CR, RCC_CR_HSIRDY) == 0U)
1153  {
1154  return HAL_ERROR;
1155  }
1156  }
1157 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
1158  /* Overshoot management when going down from PLL as SYSCLK source and frequency above 80Mhz */
1159  if(HAL_RCC_GetSysClockFreq() > 80000000U)
1160  {
1161  /* Intermediate step with HCLK prescaler 2 necessary before to go under 80Mhz */
1162  MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_SYSCLK_DIV2);
1163  hpre = RCC_SYSCLK_DIV2;
1164  }
1165 #endif
1166 
1167  }
1168 
1169  MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_ClkInitStruct->SYSCLKSource);
1170 
1171  /* Get Start Tick*/
1172  tickstart = HAL_GetTick();
1173 
1174  while(__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos))
1175  {
1176  if((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE)
1177  {
1178  return HAL_TIMEOUT;
1179  }
1180  }
1181  }
1182 
1183  /*-------------------------- HCLK Configuration --------------------------*/
1184  if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK)
1185  {
1186  assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider));
1187  MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider);
1188  }
1189 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
1190  else
1191  {
1192  /* Is intermediate HCLK prescaler 2 applied internally, complete with HCLK prescaler 1 */
1193  if(hpre == RCC_SYSCLK_DIV2)
1194  {
1195  MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_SYSCLK_DIV1);
1196  }
1197  }
1198 #endif
1199 
1200  /* Decreasing the number of wait states because of lower CPU frequency */
1201  if(FLatency < __HAL_FLASH_GET_LATENCY())
1202  {
1203  /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
1204  __HAL_FLASH_SET_LATENCY(FLatency);
1205 
1206  /* Check that the new number of wait states is taken into account to access the Flash
1207  memory by reading the FLASH_ACR register */
1208  if(__HAL_FLASH_GET_LATENCY() != FLatency)
1209  {
1210  return HAL_ERROR;
1211  }
1212  }
1213 
1214  /*-------------------------- PCLK1 Configuration ---------------------------*/
1215  if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1)
1216  {
1217  assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider));
1218  MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider);
1219  }
1220 
1221  /*-------------------------- PCLK2 Configuration ---------------------------*/
1222  if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2)
1223  {
1224  assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider));
1225  MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3U));
1226  }
1227 
1228  /* Update the SystemCoreClock global variable */
1229  SystemCoreClock = HAL_RCC_GetSysClockFreq() >> (AHBPrescTable[READ_BIT(RCC->CFGR, RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos] & 0x1FU);
1230 
1231  /* Configure the source of time base considering new system clocks settings*/
1232  status = HAL_InitTick(uwTickPrio);
1233 
1234  return status;
1235 }
1236 
1287 void HAL_RCC_MCOConfig( uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv)
1288 {
1289  GPIO_InitTypeDef GPIO_InitStruct;
1290 
1291  /* Check the parameters */
1292  assert_param(IS_RCC_MCO(RCC_MCOx));
1293  assert_param(IS_RCC_MCODIV(RCC_MCODiv));
1294  assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource));
1295 
1296  /* Prevent unused argument(s) compilation warning if no assert_param check */
1297  UNUSED(RCC_MCOx);
1298 
1299  /* MCO Clock Enable */
1300  __MCO1_CLK_ENABLE();
1301 
1302  /* Configue the MCO1 pin in alternate function mode */
1303  GPIO_InitStruct.Pin = MCO1_PIN;
1304  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
1305  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
1306  GPIO_InitStruct.Pull = GPIO_NOPULL;
1307  GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
1308  HAL_GPIO_Init(MCO1_GPIO_PORT, &GPIO_InitStruct);
1309 
1310  /* Mask MCOSEL[] and MCOPRE[] bits then set MCO1 clock source and prescaler */
1311  MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCOSEL | RCC_CFGR_MCOPRE), (RCC_MCOSource | RCC_MCODiv ));
1312 }
1313 
1347 {
1348  uint32_t msirange = 0U, sysclockfreq = 0U;
1349  uint32_t pllvco, pllsource, pllr, pllm; /* no init needed */
1350  uint32_t sysclk_source, pll_oscsource;
1351 
1352  sysclk_source = __HAL_RCC_GET_SYSCLK_SOURCE();
1353  pll_oscsource = __HAL_RCC_GET_PLL_OSCSOURCE();
1354 
1355  if((sysclk_source == RCC_CFGR_SWS_MSI) ||
1356  ((sysclk_source == RCC_CFGR_SWS_PLL) && (pll_oscsource == RCC_PLLSOURCE_MSI)))
1357  {
1358  /* MSI or PLL with MSI source used as system clock source */
1359 
1360  /* Get SYSCLK source */
1361  if(READ_BIT(RCC->CR, RCC_CR_MSIRGSEL) == 0U)
1362  { /* MSISRANGE from RCC_CSR applies */
1363  msirange = READ_BIT(RCC->CSR, RCC_CSR_MSISRANGE) >> RCC_CSR_MSISRANGE_Pos;
1364  }
1365  else
1366  { /* MSIRANGE from RCC_CR applies */
1367  msirange = READ_BIT(RCC->CR, RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos;
1368  }
1369  /*MSI frequency range in HZ*/
1370  msirange = MSIRangeTable[msirange];
1371 
1372  if(sysclk_source == RCC_CFGR_SWS_MSI)
1373  {
1374  /* MSI used as system clock source */
1375  sysclockfreq = msirange;
1376  }
1377  }
1378  else if(sysclk_source == RCC_CFGR_SWS_HSI)
1379  {
1380  /* HSI used as system clock source */
1381  sysclockfreq = HSI_VALUE;
1382  }
1383  else if(sysclk_source == RCC_CFGR_SWS_HSE)
1384  {
1385  /* HSE used as system clock source */
1386  sysclockfreq = HSE_VALUE;
1387  }
1388  else
1389  {
1390  /* unexpected case: sysclockfreq at 0 */
1391  }
1392 
1393  if(sysclk_source == RCC_CFGR_SWS_PLL)
1394  {
1395  /* PLL used as system clock source */
1396 
1397  /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE) * PLLN / PLLM
1398  SYSCLK = PLL_VCO / PLLR
1399  */
1400  pllsource = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC);
1401 
1402  switch (pllsource)
1403  {
1404  case RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
1405  pllvco = HSI_VALUE;
1406  break;
1407 
1408  case RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
1409  pllvco = HSE_VALUE;
1410  break;
1411 
1412  case RCC_PLLSOURCE_MSI: /* MSI used as PLL clock source */
1413  default:
1414  pllvco = msirange;
1415  break;
1416  }
1417  pllm = (READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U ;
1418  pllvco = (pllvco * (READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)) / pllm;
1419  pllr = ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1U ) * 2U;
1420  sysclockfreq = pllvco / pllr;
1421  }
1422 
1423  return sysclockfreq;
1424 }
1425 
1434 uint32_t HAL_RCC_GetHCLKFreq(void)
1435 {
1436  return SystemCoreClock;
1437 }
1438 
1445 uint32_t HAL_RCC_GetPCLK1Freq(void)
1446 {
1447  /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/
1448  return (HAL_RCC_GetHCLKFreq() >> (APBPrescTable[READ_BIT(RCC->CFGR, RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos] & 0x1FU));
1449 }
1450 
1457 uint32_t HAL_RCC_GetPCLK2Freq(void)
1458 {
1459  /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/
1460  return (HAL_RCC_GetHCLKFreq()>> (APBPrescTable[READ_BIT(RCC->CFGR, RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos] & 0x1FU));
1461 }
1462 
1471 {
1472  /* Check the parameters */
1473  assert_param(RCC_OscInitStruct != (void *)NULL);
1474 
1475  /* Set all possible values for the Oscillator type parameter ---------------*/
1476 #if defined(RCC_HSI48_SUPPORT)
1477  RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_MSI | \
1478  RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_HSI48;
1479 #else
1480  RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_MSI | \
1481  RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI;
1482 #endif /* RCC_HSI48_SUPPORT */
1483 
1484  /* Get the HSE configuration -----------------------------------------------*/
1485  if(READ_BIT(RCC->CR, RCC_CR_HSEBYP) == RCC_CR_HSEBYP)
1486  {
1487  RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS;
1488  }
1489  else if(READ_BIT(RCC->CR, RCC_CR_HSEON) == RCC_CR_HSEON)
1490  {
1491  RCC_OscInitStruct->HSEState = RCC_HSE_ON;
1492  }
1493  else
1494  {
1495  RCC_OscInitStruct->HSEState = RCC_HSE_OFF;
1496  }
1497 
1498  /* Get the MSI configuration -----------------------------------------------*/
1499  if(READ_BIT(RCC->CR, RCC_CR_MSION) == RCC_CR_MSION)
1500  {
1501  RCC_OscInitStruct->MSIState = RCC_MSI_ON;
1502  }
1503  else
1504  {
1505  RCC_OscInitStruct->MSIState = RCC_MSI_OFF;
1506  }
1507 
1508  RCC_OscInitStruct->MSICalibrationValue = READ_BIT(RCC->ICSCR, RCC_ICSCR_MSITRIM) >> RCC_ICSCR_MSITRIM_Pos;
1509  RCC_OscInitStruct->MSIClockRange = READ_BIT(RCC->CR, RCC_CR_MSIRANGE);
1510 
1511  /* Get the HSI configuration -----------------------------------------------*/
1512  if(READ_BIT(RCC->CR, RCC_CR_HSION) == RCC_CR_HSION)
1513  {
1514  RCC_OscInitStruct->HSIState = RCC_HSI_ON;
1515  }
1516  else
1517  {
1518  RCC_OscInitStruct->HSIState = RCC_HSI_OFF;
1519  }
1520 
1521  RCC_OscInitStruct->HSICalibrationValue = READ_BIT(RCC->ICSCR, RCC_ICSCR_HSITRIM) >> RCC_ICSCR_HSITRIM_Pos;
1522 
1523  /* Get the LSE configuration -----------------------------------------------*/
1524  if(READ_BIT(RCC->BDCR, RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP)
1525  {
1526 #if defined(RCC_BDCR_LSESYSDIS)
1527  if((RCC->BDCR & RCC_BDCR_LSESYSDIS) == RCC_BDCR_LSESYSDIS)
1528  {
1529  RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS_RTC_ONLY;
1530  }
1531  else
1532 #endif /* RCC_BDCR_LSESYSDIS */
1533  {
1534  RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS;
1535  }
1536  }
1537  else if(READ_BIT(RCC->BDCR, RCC_BDCR_LSEON) == RCC_BDCR_LSEON)
1538  {
1539 #if defined(RCC_BDCR_LSESYSDIS)
1540  if((RCC->BDCR & RCC_BDCR_LSESYSDIS) == RCC_BDCR_LSESYSDIS)
1541  {
1542  RCC_OscInitStruct->LSEState = RCC_LSE_ON_RTC_ONLY;
1543  }
1544  else
1545 #endif /* RCC_BDCR_LSESYSDIS */
1546  {
1547  RCC_OscInitStruct->LSEState = RCC_LSE_ON;
1548  }
1549  }
1550  else
1551  {
1552  RCC_OscInitStruct->LSEState = RCC_LSE_OFF;
1553  }
1554 
1555  /* Get the LSI configuration -----------------------------------------------*/
1556  if(READ_BIT(RCC->CSR, RCC_CSR_LSION) == RCC_CSR_LSION)
1557  {
1558  RCC_OscInitStruct->LSIState = RCC_LSI_ON;
1559  }
1560  else
1561  {
1562  RCC_OscInitStruct->LSIState = RCC_LSI_OFF;
1563  }
1564 #if defined(RCC_CSR_LSIPREDIV)
1565 
1566  /* Get the LSI configuration -----------------------------------------------*/
1567  if((RCC->CSR & RCC_CSR_LSIPREDIV) == RCC_CSR_LSIPREDIV)
1568  {
1569  RCC_OscInitStruct->LSIDiv = RCC_LSI_DIV128;
1570  }
1571  else
1572  {
1573  RCC_OscInitStruct->LSIDiv = RCC_LSI_DIV1;
1574  }
1575 #endif /* RCC_CSR_LSIPREDIV */
1576 
1577 #if defined(RCC_HSI48_SUPPORT)
1578  /* Get the HSI48 configuration ---------------------------------------------*/
1579  if(READ_BIT(RCC->CRRCR, RCC_CRRCR_HSI48ON) == RCC_CRRCR_HSI48ON)
1580  {
1581  RCC_OscInitStruct->HSI48State = RCC_HSI48_ON;
1582  }
1583  else
1584  {
1585  RCC_OscInitStruct->HSI48State = RCC_HSI48_OFF;
1586  }
1587 #else
1588  RCC_OscInitStruct->HSI48State = RCC_HSI48_OFF;
1589 #endif /* RCC_HSI48_SUPPORT */
1590 
1591  /* Get the PLL configuration -----------------------------------------------*/
1592  if(READ_BIT(RCC->CR, RCC_CR_PLLON) == RCC_CR_PLLON)
1593  {
1594  RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON;
1595  }
1596  else
1597  {
1598  RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF;
1599  }
1600  RCC_OscInitStruct->PLL.PLLSource = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC);
1601  RCC_OscInitStruct->PLL.PLLM = (READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U;
1602  RCC_OscInitStruct->PLL.PLLN = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos;
1603  RCC_OscInitStruct->PLL.PLLQ = (((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos) + 1U) << 1U);
1604  RCC_OscInitStruct->PLL.PLLR = (((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1U) << 1U);
1605 #if defined(RCC_PLLP_SUPPORT)
1606 #if defined(RCC_PLLP_DIV_2_31_SUPPORT)
1607  RCC_OscInitStruct->PLL.PLLP = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLPDIV) >> RCC_PLLCFGR_PLLPDIV_Pos;
1608 #else
1609  if(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLP) != 0U)
1610  {
1611  RCC_OscInitStruct->PLL.PLLP = RCC_PLLP_DIV17;
1612  }
1613  else
1614  {
1615  RCC_OscInitStruct->PLL.PLLP = RCC_PLLP_DIV7;
1616  }
1617 #endif /* RCC_PLLP_DIV_2_31_SUPPORT */
1618 #endif /* RCC_PLLP_SUPPORT */
1619 }
1620 
1629 void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency)
1630 {
1631  /* Check the parameters */
1632  assert_param(RCC_ClkInitStruct != (void *)NULL);
1633  assert_param(pFLatency != (void *)NULL);
1634 
1635  /* Set all possible values for the Clock type parameter --------------------*/
1636  RCC_ClkInitStruct->ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
1637 
1638  /* Get the SYSCLK configuration --------------------------------------------*/
1639  RCC_ClkInitStruct->SYSCLKSource = READ_BIT(RCC->CFGR, RCC_CFGR_SW);
1640 
1641  /* Get the HCLK configuration ----------------------------------------------*/
1642  RCC_ClkInitStruct->AHBCLKDivider = READ_BIT(RCC->CFGR, RCC_CFGR_HPRE);
1643 
1644  /* Get the APB1 configuration ----------------------------------------------*/
1645  RCC_ClkInitStruct->APB1CLKDivider = READ_BIT(RCC->CFGR, RCC_CFGR_PPRE1);
1646 
1647  /* Get the APB2 configuration ----------------------------------------------*/
1648  RCC_ClkInitStruct->APB2CLKDivider = (READ_BIT(RCC->CFGR, RCC_CFGR_PPRE2) >> 3U);
1649 
1650  /* Get the Flash Wait State (Latency) configuration ------------------------*/
1651  *pFLatency = __HAL_FLASH_GET_LATENCY();
1652 }
1653 
1665 {
1666  SET_BIT(RCC->CR, RCC_CR_CSSON) ;
1667 }
1668 
1675 {
1676  /* Check RCC CSSF interrupt flag */
1677  if(__HAL_RCC_GET_IT(RCC_IT_CSS))
1678  {
1679  /* RCC Clock Security System interrupt user callback */
1681 
1682  /* Clear RCC CSS pending bit */
1683  __HAL_RCC_CLEAR_IT(RCC_IT_CSS);
1684  }
1685 }
1686 
1691 __weak void HAL_RCC_CSSCallback(void)
1692 {
1693  /* NOTE : This function should not be modified, when the callback is needed,
1694  the HAL_RCC_CSSCallback should be implemented in the user file
1695  */
1696 }
1697 
1706 /* Private function prototypes -----------------------------------------------*/
1716 static HAL_StatusTypeDef RCC_SetFlashLatencyFromMSIRange(uint32_t msirange)
1717 {
1718  uint32_t vos;
1719  uint32_t latency = FLASH_LATENCY_0; /* default value 0WS */
1720 
1721  if(__HAL_RCC_PWR_IS_CLK_ENABLED())
1722  {
1723  vos = HAL_PWREx_GetVoltageRange();
1724  }
1725  else
1726  {
1727  __HAL_RCC_PWR_CLK_ENABLE();
1728  vos = HAL_PWREx_GetVoltageRange();
1729  __HAL_RCC_PWR_CLK_DISABLE();
1730  }
1731 
1732  if(vos == PWR_REGULATOR_VOLTAGE_SCALE1)
1733  {
1734  if(msirange > RCC_MSIRANGE_8)
1735  {
1736  /* MSI > 16Mhz */
1737  if(msirange > RCC_MSIRANGE_10)
1738  {
1739  /* MSI 48Mhz */
1740  latency = FLASH_LATENCY_2; /* 2WS */
1741  }
1742  else
1743  {
1744  /* MSI 24Mhz or 32Mhz */
1745  latency = FLASH_LATENCY_1; /* 1WS */
1746  }
1747  }
1748  /* else MSI <= 16Mhz default FLASH_LATENCY_0 0WS */
1749  }
1750  else
1751  {
1752 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
1753  if(msirange >= RCC_MSIRANGE_8)
1754  {
1755  /* MSI >= 16Mhz */
1756  latency = FLASH_LATENCY_2; /* 2WS */
1757  }
1758  else
1759  {
1760  if(msirange == RCC_MSIRANGE_7)
1761  {
1762  /* MSI 8Mhz */
1763  latency = FLASH_LATENCY_1; /* 1WS */
1764  }
1765  /* else MSI < 8Mhz default FLASH_LATENCY_0 0WS */
1766  }
1767 #else
1768  if(msirange > RCC_MSIRANGE_8)
1769  {
1770  /* MSI > 16Mhz */
1771  latency = FLASH_LATENCY_3; /* 3WS */
1772  }
1773  else
1774  {
1775  if(msirange == RCC_MSIRANGE_8)
1776  {
1777  /* MSI 16Mhz */
1778  latency = FLASH_LATENCY_2; /* 2WS */
1779  }
1780  else if(msirange == RCC_MSIRANGE_7)
1781  {
1782  /* MSI 8Mhz */
1783  latency = FLASH_LATENCY_1; /* 1WS */
1784  }
1785  /* else MSI < 8Mhz default FLASH_LATENCY_0 0WS */
1786  }
1787 #endif
1788  }
1789 
1790  __HAL_FLASH_SET_LATENCY(latency);
1791 
1792  /* Check that the new number of wait states is taken into account to access the Flash
1793  memory by reading the FLASH_ACR register */
1794  if(__HAL_FLASH_GET_LATENCY() != latency)
1795  {
1796  return HAL_ERROR;
1797  }
1798 
1799  return HAL_OK;
1800 }
1801 
1802 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
1803 
1808 {
1809  uint32_t msirange = 0U;
1810  uint32_t pllvco, pllsource, pllr, pllm, sysclockfreq; /* no init needed */
1811 
1812  if(__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_MSI)
1813  {
1814  /* Get MSI range source */
1815  if(READ_BIT(RCC->CR, RCC_CR_MSIRGSEL) == 0U)
1816  { /* MSISRANGE from RCC_CSR applies */
1817  msirange = READ_BIT(RCC->CSR, RCC_CSR_MSISRANGE) >> RCC_CSR_MSISRANGE_Pos;
1818  }
1819  else
1820  { /* MSIRANGE from RCC_CR applies */
1821  msirange = READ_BIT(RCC->CR, RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos;
1822  }
1823  /*MSI frequency range in HZ*/
1824  msirange = MSIRangeTable[msirange];
1825  }
1826 
1827  /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE) * PLLN / PLLM
1828  SYSCLK = PLL_VCO / PLLR
1829  */
1830  pllsource = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC);
1831 
1832  switch (pllsource)
1833  {
1834  case RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
1835  pllvco = HSI_VALUE;
1836  break;
1837 
1838  case RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
1839  pllvco = HSE_VALUE;
1840  break;
1841 
1842  case RCC_PLLSOURCE_MSI: /* MSI used as PLL clock source */
1843  default:
1844  pllvco = msirange;
1845  break;
1846  }
1847  pllm = (READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U ;
1848  pllvco = (pllvco * (READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)) / pllm;
1849  pllr = ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1U ) * 2U;
1850  sysclockfreq = pllvco / pllr;
1851 
1852  return sysclockfreq;
1853 }
1854 #endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */
1855 
1860 #endif /* HAL_RCC_MODULE_ENABLED */
1861 
1869 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct)
Configure the RCC_OscInitStruct according to the internal RCC configuration registers.
This file contains all the functions prototypes for the HAL module driver.
void HAL_RCC_NMI_IRQHandler(void)
Handle the RCC Clock Security System interrupt request.
HAL_StatusTypeDef HAL_RCC_DeInit(void)
Reset the RCC clock configuration to the default reset state.
RCC Internal/External Oscillator (HSE, HSI, MSI, LSE and LSI) configuration structure definition...
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
uint32_t HAL_RCC_GetPCLK2Freq(void)
Return the PCLK2 frequency.
void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency)
Configure the RCC_ClkInitStruct according to the internal RCC configuration registers.
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
RCC_PLLInitTypeDef PLL
HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct)
Initialize the RCC Oscillators according to the specified parameters in the RCC_OscInitTypeDef.
void HAL_RCC_CSSCallback(void)
RCC Clock Security System interrupt callback.
return HAL_OK
HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency)
Initialize the CPU, AHB and APB busses clocks according to the specified parameters in the RCC_ClkIni...
static HAL_StatusTypeDef RCC_SetFlashLatencyFromMSIRange(uint32_t msirange)
Update number of Flash wait states in line with MSI range and current voltage range.
void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv)
Select the clock source to output on MCO pin(PA8).
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
Initialize the GPIOx peripheral according to the specified parameters in the GPIO_Init.
uint32_t HAL_RCC_GetHCLKFreq(void)
Return the HCLK frequency.
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
This function configures the source of the time base: The time source is configured to have 1ms time ...
RCC System, AHB and APB busses clock configuration structure definition.
static uint32_t RCC_GetSysClockFreqFromPLLSource(void)
Compute SYSCLK frequency based on PLL SYSCLK source.
uint32_t HAL_PWREx_GetVoltageRange(void)
Return Voltage Scaling Range.
ADC handle Structure definition.
uint32_t HAL_RCC_GetSysClockFreq(void)
Return the SYSCLK frequency.
void HAL_RCC_EnableCSS(void)
Enable the Clock Security System.
MODIFY_REG(hrtc->Instance->CR, RTC_CR_WUCKSEL,(uint32_t) WakeUpClock)
uint32_t HAL_RCC_GetPCLK1Freq(void)
Return the PCLK1 frequency.
uint32_t uwTickPrio
Definition: stm32l4xx_hal.c:91
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))