STM32H735xx HAL User Manual
stm32h7xx_ll_rcc.c
Go to the documentation of this file.
00001 /**
00002   ******************************************************************************
00003   * @file    stm32h7xx_ll_rcc.c
00004   * @author  MCD Application Team
00005   * @brief   RCC LL module driver.
00006   ******************************************************************************
00007   * @attention
00008   *
00009   * Copyright (c) 2017 STMicroelectronics.
00010   * All rights reserved.
00011   *
00012   * This software is licensed under terms that can be found in the LICENSE file in
00013   * the root directory of this software component.
00014   * If no LICENSE file comes with this software, it is provided AS-IS.
00015   ******************************************************************************
00016   */
00017 #if defined(USE_FULL_LL_DRIVER)
00018 
00019 /* Includes ------------------------------------------------------------------*/
00020 #include "stm32h7xx_ll_rcc.h"
00021 #include "stm32h7xx_ll_bus.h"
00022 #ifdef  USE_FULL_ASSERT
00023   #include "stm32_assert.h"
00024 #else
00025   #define assert_param(expr) ((void)0U)
00026 #endif
00027 
00028 /** @addtogroup STM32H7xx_LL_Driver
00029   * @{
00030   */
00031 
00032 #if defined(RCC)
00033 
00034 /** @addtogroup RCC_LL
00035   * @{
00036   */
00037 
00038 /* Private types -------------------------------------------------------------*/
00039 /* Private variables ---------------------------------------------------------*/
00040 const uint8_t LL_RCC_PrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9};
00041 /* Private constants ---------------------------------------------------------*/
00042 /* Private macros ------------------------------------------------------------*/
00043 /** @addtogroup RCC_LL_Private_Macros
00044   * @{
00045   */
00046 #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_USART16_CLKSOURCE) \
00047                                             || ((__VALUE__) == LL_RCC_USART234578_CLKSOURCE))
00048 
00049 
00050 #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_I2C123_CLKSOURCE) \
00051                                             || ((__VALUE__) == LL_RCC_I2C4_CLKSOURCE))
00052 
00053 #define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE)  \
00054                                             || ((__VALUE__) == LL_RCC_LPTIM2_CLKSOURCE)  \
00055                                             || ((__VALUE__) == LL_RCC_LPTIM345_CLKSOURCE))
00056 
00057 #if defined(SAI3)
00058 #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \
00059                                             || ((__VALUE__) == LL_RCC_SAI23_CLKSOURCE) \
00060                                             || ((__VALUE__) == LL_RCC_SAI4A_CLKSOURCE) \
00061                                             || ((__VALUE__) == LL_RCC_SAI4B_CLKSOURCE))
00062 #elif defined(SAI4)
00063 #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \
00064                                             || ((__VALUE__) == LL_RCC_SAI4A_CLKSOURCE) \
00065                                             || ((__VALUE__) == LL_RCC_SAI4B_CLKSOURCE))
00066 #else
00067 #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \
00068                                             || ((__VALUE__) == LL_RCC_SAI2A_CLKSOURCE) \
00069                                             || ((__VALUE__) == LL_RCC_SAI2B_CLKSOURCE))
00070 #endif /* SAI3 */
00071 
00072 #define IS_LL_RCC_SPI_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_SPI123_CLKSOURCE) \
00073                                             || ((__VALUE__) == LL_RCC_SPI45_CLKSOURCE) \
00074                                             || ((__VALUE__) == LL_RCC_SPI6_CLKSOURCE))
00075 
00076 /**
00077   * @}
00078   */
00079 
00080 /* Private function prototypes -----------------------------------------------*/
00081 /** @defgroup RCC_LL_Private_Functions RCC Private functions
00082   * @{
00083   */
00084 static uint32_t RCC_GetSystemClockFreq(void);
00085 static uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency);
00086 static uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency);
00087 static uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency);
00088 static uint32_t RCC_GetPCLK3ClockFreq(uint32_t HCLK_Frequency);
00089 static uint32_t RCC_GetPCLK4ClockFreq(uint32_t HCLK_Frequency);
00090 
00091 /**
00092   * @}
00093   */
00094 
00095 
00096 /* Exported functions --------------------------------------------------------*/
00097 /** @addtogroup RCC_LL_Exported_Functions
00098   * @{
00099   */
00100 
00101 /** @addtogroup RCC_LL_EF_Init
00102   * @{
00103   */
00104 
00105 /**
00106   * @brief  Resets the RCC clock configuration to the default reset state.
00107   * @note   The default reset state of the clock configuration is given below:
00108   *            - HSI ON and used as system clock source
00109   *            - HSE, PLL1, PLL2 and PLL3 OFF
00110   *            - AHB, APB Bus pre-scaler set to 1.
00111   *            - CSS, MCO1 and MCO2 OFF
00112   *            - All interrupts disabled
00113   * @note   This function doesn't modify the configuration of the
00114   *            - Peripheral clocks
00115   *            - LSI, LSE and RTC clocks
00116   * @retval None
00117   */
00118 void LL_RCC_DeInit(void)
00119 {
00120    /* Increasing the CPU frequency */
00121   if(FLASH_LATENCY_DEFAULT  > (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY)))
00122   {
00123     /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
00124     MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, (uint32_t)(FLASH_LATENCY_DEFAULT));
00125   }
00126 
00127   /* Set HSION bit */
00128   SET_BIT(RCC->CR, RCC_CR_HSION);
00129 
00130   /* Wait for HSI READY bit */
00131   while(LL_RCC_HSI_IsReady() == 0U)
00132   {}
00133 
00134   /* Reset CFGR register */
00135   CLEAR_REG(RCC->CFGR);
00136 
00137   /* Reset CSION , CSIKERON, HSEON, HSI48ON, HSECSSON,HSIDIV, PLL1ON, PLL2ON, PLL3ON bits */
00138   CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSIKERON| RCC_CR_HSIDIV| RCC_CR_HSIDIVF| RCC_CR_CSION | RCC_CR_CSIKERON |  RCC_CR_HSI48ON  \
00139   |RCC_CR_CSSHSEON | RCC_CR_PLL1ON | RCC_CR_PLL2ON | RCC_CR_PLL3ON);
00140 
00141   /* Wait for PLL1 READY bit to be reset */
00142   while(LL_RCC_PLL1_IsReady() != 0U)
00143   {}
00144 
00145   /* Wait for PLL2 READY bit to be reset */
00146   while(LL_RCC_PLL2_IsReady() != 0U)
00147   {}
00148 
00149   /* Wait for PLL3 READY bit to be reset */
00150   while(LL_RCC_PLL3_IsReady() != 0U)
00151   {}
00152 
00153 #if defined(RCC_D1CFGR_HPRE)
00154   /* Reset D1CFGR register */
00155   CLEAR_REG(RCC->D1CFGR);
00156 
00157   /* Reset D2CFGR register */
00158   CLEAR_REG(RCC->D2CFGR);
00159 
00160   /* Reset D3CFGR register */
00161   CLEAR_REG(RCC->D3CFGR);
00162 #else
00163   /* Reset CDCFGR1 register */
00164   CLEAR_REG(RCC->CDCFGR1);
00165 
00166   /* Reset CDCFGR2 register */
00167   CLEAR_REG(RCC->CDCFGR2);
00168 
00169   /* Reset SRDCFGR register */
00170   CLEAR_REG(RCC->SRDCFGR);
00171 
00172 #endif /* RCC_D1CFGR_HPRE */
00173 
00174   /* Reset PLLCKSELR register to default value */
00175   RCC->PLLCKSELR= RCC_PLLCKSELR_DIVM1_5|RCC_PLLCKSELR_DIVM2_5|RCC_PLLCKSELR_DIVM3_5;
00176 
00177   /* Reset PLLCFGR register to default value */
00178   LL_RCC_WriteReg(PLLCFGR, 0x01FF0000U);
00179 
00180   /* Reset PLL1DIVR register to default value */
00181   LL_RCC_WriteReg(PLL1DIVR, 0x01010280U);
00182 
00183   /* Reset PLL1FRACR register */
00184   CLEAR_REG(RCC->PLL1FRACR);
00185 
00186   /* Reset PLL2DIVR register to default value */
00187   LL_RCC_WriteReg(PLL2DIVR, 0x01010280U);
00188 
00189   /* Reset PLL2FRACR register */
00190   CLEAR_REG(RCC->PLL2FRACR);
00191 
00192   /* Reset PLL3DIVR register to default value */
00193   LL_RCC_WriteReg(PLL3DIVR, 0x01010280U);
00194 
00195   /* Reset PLL3FRACR register */
00196   CLEAR_REG(RCC->PLL3FRACR);
00197 
00198   /* Reset HSEBYP bit */
00199   CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP);
00200 
00201   /* Disable all interrupts */
00202   CLEAR_REG(RCC->CIER);
00203 
00204   /* Clear all interrupts */
00205   SET_BIT(RCC->CICR, RCC_CICR_LSIRDYC | RCC_CICR_LSERDYC | RCC_CICR_HSIRDYC | RCC_CICR_HSERDYC
00206                    | RCC_CICR_CSIRDYC | RCC_CICR_HSI48RDYC | RCC_CICR_PLLRDYC | RCC_CICR_PLL2RDYC
00207                    | RCC_CICR_PLL3RDYC | RCC_CICR_LSECSSC | RCC_CICR_HSECSSC);
00208 
00209   /* Clear reset source flags */
00210   SET_BIT(RCC->RSR, RCC_RSR_RMVF);
00211   
00212    /* Decreasing the number of wait states because of lower CPU frequency */
00213   if(FLASH_LATENCY_DEFAULT  < (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY)))
00214   {
00215     /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
00216     MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, (uint32_t)(FLASH_LATENCY_DEFAULT));
00217   }
00218 
00219 }
00220 
00221 /**
00222   * @}
00223   */
00224 
00225 /** @addtogroup RCC_LL_EF_Get_Freq
00226   * @brief  Return the frequencies of different on chip clocks;  System, AHB, APB1, APB2, APB3 and APB4 buses clocks.
00227   *         and different peripheral clocks available on the device.
00228   * @note   If SYSCLK source is HSI, function returns values based on HSI_VALUE(*)
00229   * @note   If SYSCLK source is HSE, function returns values based on HSE_VALUE(**)
00230   * @note   If SYSCLK source is CSI, function returns values based on CSI_VALUE(***)
00231   * @note   If SYSCLK source is PLL, function returns values based on HSE_VALUE(**)
00232   *         or HSI_VALUE(*) multiplied/divided by the PLL factors.
00233   * @note   (*) HSI_VALUE is a constant defined in header file (default value
00234   *             64 MHz) divider by HSIDIV, but the real value may vary depending on
00235   *             on the variations in voltage and temperature.
00236   * @note   (**) HSE_VALUE is a constant defined in header file (default value
00237   *              25 MHz), user has to ensure that HSE_VALUE is same as the real
00238   *              frequency of the crystal used. Otherwise, this function may
00239   *              have wrong result.
00240   * @note   (***) CSI_VALUE is a constant defined in header file (default value
00241   *               4 MHz) but the real value may vary depending on the variations
00242   *               in voltage and temperature.
00243   * @note   The result of this function could be incorrect when using fractional
00244   *         value for HSE crystal.
00245   * @note   This function can be used by the user application to compute the
00246   *         baud-rate for the communication peripherals or configure other parameters.
00247   * @{
00248   */
00249 
00250 /**
00251   * @brief  Return the frequencies of different on chip clocks;  System, AHB, APB1, APB2, APB3 and APB4 buses clocks.
00252   * @note   Each time SYSCLK, HCLK, PCLK1, PCLK2, PCLK3 and/or PCLK4 clock changes, this function
00253   *         must be called to update structure fields. Otherwise, any
00254   *         configuration based on this function will be incorrect.
00255   * @param  RCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies
00256   * @retval None
00257   */
00258 void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks)
00259 {
00260   /* Get SYSCLK frequency */
00261   RCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq();
00262 
00263   /* HCLK clock frequency */
00264   RCC_Clocks->HCLK_Frequency   = RCC_GetHCLKClockFreq(RCC_Clocks->SYSCLK_Frequency);
00265 
00266   /* PCLK1 clock frequency */
00267   RCC_Clocks->PCLK1_Frequency  = RCC_GetPCLK1ClockFreq(RCC_Clocks->HCLK_Frequency);
00268 
00269   /* PCLK2 clock frequency */
00270   RCC_Clocks->PCLK2_Frequency  = RCC_GetPCLK2ClockFreq(RCC_Clocks->HCLK_Frequency);
00271 
00272   /* PCLK3 clock frequency */
00273   RCC_Clocks->PCLK3_Frequency  = RCC_GetPCLK3ClockFreq(RCC_Clocks->HCLK_Frequency);
00274 
00275   /* PCLK4 clock frequency */
00276   RCC_Clocks->PCLK4_Frequency  = RCC_GetPCLK4ClockFreq(RCC_Clocks->HCLK_Frequency);
00277 }
00278 
00279 /**
00280   * @brief  Return PLL1 clocks frequencies
00281   * @note   LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
00282   * @retval None
00283   */
00284 void LL_RCC_GetPLL1ClockFreq(LL_PLL_ClocksTypeDef *PLL_Clocks)
00285 {
00286   uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO, pllsource;
00287   uint32_t m, n, fracn = 0U;
00288 
00289   /* PLL_VCO = (HSE_VALUE, CSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
00290      SYSCLK = PLL_VCO / PLLP
00291   */
00292   pllsource = LL_RCC_PLL_GetSource();
00293 
00294   switch (pllsource)
00295   {
00296     case LL_RCC_PLLSOURCE_HSI:
00297       if (LL_RCC_HSI_IsReady() != 0U)
00298       {
00299         pllinputfreq = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
00300       }
00301       break;
00302 
00303     case LL_RCC_PLLSOURCE_CSI:
00304       if (LL_RCC_CSI_IsReady() != 0U)
00305       {
00306         pllinputfreq = CSI_VALUE;
00307       }
00308       break;
00309 
00310     case LL_RCC_PLLSOURCE_HSE:
00311       if (LL_RCC_HSE_IsReady() != 0U)
00312       {
00313         pllinputfreq = HSE_VALUE;
00314       }
00315       break;
00316 
00317     case LL_RCC_PLLSOURCE_NONE:
00318     default:
00319       /* PLL clock disabled */
00320       break;
00321   }
00322 
00323   PLL_Clocks->PLL_P_Frequency = 0U;
00324   PLL_Clocks->PLL_Q_Frequency = 0U;
00325   PLL_Clocks->PLL_R_Frequency = 0U;
00326 
00327   m = LL_RCC_PLL1_GetM();
00328   n = LL_RCC_PLL1_GetN();
00329   if (LL_RCC_PLL1FRACN_IsEnabled() != 0U)
00330   {
00331     fracn = LL_RCC_PLL1_GetFRACN();
00332   }
00333 
00334   if (m != 0U)
00335   {
00336     if (LL_RCC_PLL1P_IsEnabled() != 0U)
00337     {
00338       PLL_Clocks->PLL_P_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL1_GetP());
00339     }
00340 
00341     if (LL_RCC_PLL1Q_IsEnabled() != 0U)
00342     {
00343       PLL_Clocks->PLL_Q_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL1_GetQ());
00344     }
00345 
00346     if (LL_RCC_PLL1R_IsEnabled() != 0U)
00347     {
00348       PLL_Clocks->PLL_R_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL1_GetR());
00349     }
00350   }
00351 }
00352 
00353 /**
00354   * @brief  Return PLL2 clocks frequencies
00355   * @note   LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
00356   * @retval None
00357   */
00358 void LL_RCC_GetPLL2ClockFreq(LL_PLL_ClocksTypeDef *PLL_Clocks)
00359 {
00360   uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO, pllsource;
00361   uint32_t m, n, fracn = 0U;
00362 
00363   /* PLL_VCO = (HSE_VALUE, CSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
00364      SYSCLK = PLL_VCO / PLLP
00365   */
00366   pllsource = LL_RCC_PLL_GetSource();
00367 
00368   switch (pllsource)
00369   {
00370     case LL_RCC_PLLSOURCE_HSI:
00371       if (LL_RCC_HSI_IsReady() != 0U)
00372       {
00373         pllinputfreq = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
00374       }
00375       break;
00376 
00377     case LL_RCC_PLLSOURCE_CSI:
00378       if (LL_RCC_CSI_IsReady() != 0U)
00379       {
00380         pllinputfreq = CSI_VALUE;
00381       }
00382       break;
00383 
00384     case LL_RCC_PLLSOURCE_HSE:
00385       if (LL_RCC_HSE_IsReady() != 0U)
00386       {
00387         pllinputfreq = HSE_VALUE;
00388       }
00389       break;
00390 
00391     case LL_RCC_PLLSOURCE_NONE:
00392     default:
00393       /* PLL clock disabled */
00394       break;
00395   }
00396 
00397   PLL_Clocks->PLL_P_Frequency = 0U;
00398   PLL_Clocks->PLL_Q_Frequency = 0U;
00399   PLL_Clocks->PLL_R_Frequency = 0U;
00400 
00401   m = LL_RCC_PLL2_GetM();
00402   n = LL_RCC_PLL2_GetN();
00403   if (LL_RCC_PLL2FRACN_IsEnabled() != 0U)
00404   {
00405     fracn = LL_RCC_PLL2_GetFRACN();
00406   }
00407 
00408   if (m != 0U)
00409   {
00410     if (LL_RCC_PLL2P_IsEnabled() != 0U)
00411     {
00412       PLL_Clocks->PLL_P_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL2_GetP());
00413     }
00414 
00415     if (LL_RCC_PLL2Q_IsEnabled() != 0U)
00416     {
00417       PLL_Clocks->PLL_Q_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL2_GetQ());
00418     }
00419 
00420     if (LL_RCC_PLL2R_IsEnabled() != 0U)
00421     {
00422       PLL_Clocks->PLL_R_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL2_GetR());
00423     }
00424   }
00425 }
00426 
00427 /**
00428   * @brief  Return PLL3 clocks frequencies
00429   * @note   LL_RCC_PERIPH_FREQUENCY_NO returned for non activated output or oscillator not ready
00430   * @retval None
00431   */
00432 void LL_RCC_GetPLL3ClockFreq(LL_PLL_ClocksTypeDef *PLL_Clocks)
00433 {
00434   uint32_t pllinputfreq = LL_RCC_PERIPH_FREQUENCY_NO, pllsource;
00435   uint32_t m, n, fracn = 0U;
00436 
00437   /* PLL_VCO = (HSE_VALUE, CSI_VALUE or HSI_VALUE/HSIDIV) / PLLM * (PLLN + FRACN)
00438      SYSCLK = PLL_VCO / PLLP
00439   */
00440   pllsource = LL_RCC_PLL_GetSource();
00441 
00442   switch (pllsource)
00443   {
00444     case LL_RCC_PLLSOURCE_HSI:
00445       if (LL_RCC_HSI_IsReady() != 0U)
00446       {
00447         pllinputfreq = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
00448       }
00449       break;
00450 
00451     case LL_RCC_PLLSOURCE_CSI:
00452       if (LL_RCC_CSI_IsReady() != 0U)
00453       {
00454         pllinputfreq = CSI_VALUE;
00455       }
00456       break;
00457 
00458     case LL_RCC_PLLSOURCE_HSE:
00459       if (LL_RCC_HSE_IsReady() != 0U)
00460       {
00461         pllinputfreq = HSE_VALUE;
00462       }
00463       break;
00464 
00465     case LL_RCC_PLLSOURCE_NONE:
00466     default:
00467       /* PLL clock disabled */
00468       break;
00469   }
00470 
00471   PLL_Clocks->PLL_P_Frequency = 0U;
00472   PLL_Clocks->PLL_Q_Frequency = 0U;
00473   PLL_Clocks->PLL_R_Frequency = 0U;
00474 
00475   m = LL_RCC_PLL3_GetM();
00476   n = LL_RCC_PLL3_GetN();
00477   if (LL_RCC_PLL3FRACN_IsEnabled() != 0U)
00478   {
00479     fracn = LL_RCC_PLL3_GetFRACN();
00480   }
00481 
00482   if ((m != 0U) && (pllinputfreq != 0U))
00483   {
00484     if (LL_RCC_PLL3P_IsEnabled() != 0U)
00485     {
00486       PLL_Clocks->PLL_P_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL3_GetP());
00487     }
00488 
00489     if (LL_RCC_PLL3Q_IsEnabled() != 0U)
00490     {
00491       PLL_Clocks->PLL_Q_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL3_GetQ());
00492     }
00493 
00494     if (LL_RCC_PLL3R_IsEnabled() != 0U)
00495     {
00496       PLL_Clocks->PLL_R_Frequency = LL_RCC_CalcPLLClockFreq(pllinputfreq, m, n, fracn, LL_RCC_PLL3_GetR());
00497     }
00498   }
00499 }
00500 
00501 /**
00502   * @brief  Helper function to calculate the PLL frequency output
00503   * @note ex: @ref LL_RCC_CalcPLLClockFreq (HSE_VALUE, @ref LL_RCC_PLL1_GetM (),
00504   *             @ref LL_RCC_PLL1_GetN (), @ref LL_RCC_PLL1_GetFRACN (), @ref LL_RCC_PLL1_GetP ());
00505   * @param  PLLInputFreq PLL Input frequency (based on HSE/(HSI/HSIDIV)/CSI)
00506   * @param  M      Between 1 and 63
00507   * @param  N      Between 4 and 512
00508   * @param  FRACN  Between 0 and 0x1FFF
00509   * @param  PQR    VCO output divider (P, Q or R)
00510   *                Between 1 and 128, except for PLL1P Odd value not allowed
00511   * @retval PLL1 clock frequency (in Hz)
00512   */
00513 uint32_t LL_RCC_CalcPLLClockFreq(uint32_t PLLInputFreq, uint32_t M, uint32_t N, uint32_t FRACN, uint32_t PQR)
00514 {
00515   float_t freq;
00516 
00517   freq = ((float_t)PLLInputFreq / (float_t)M) * ((float_t)N + ((float_t)FRACN/(float_t)0x2000));
00518 
00519   freq = freq/(float_t)PQR;
00520 
00521   return (uint32_t)freq;
00522 }
00523 
00524 /**
00525   * @brief  Return USARTx clock frequency
00526   * @param  USARTxSource This parameter can be one of the following values:
00527   *         @arg @ref LL_RCC_USART16_CLKSOURCE
00528   *         @arg @ref LL_RCC_USART234578_CLKSOURCE
00529   * @retval USART clock frequency (in Hz)
00530   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
00531   */
00532 uint32_t LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource)
00533 {
00534   uint32_t usart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00535   LL_PLL_ClocksTypeDef PLL_Clocks;
00536 
00537   /* Check parameter */
00538   assert_param(IS_LL_RCC_USART_CLKSOURCE(USARTxSource));
00539 
00540   switch (LL_RCC_GetUSARTClockSource(USARTxSource))
00541   {
00542     case LL_RCC_USART16_CLKSOURCE_PCLK2:
00543       usart_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
00544       break;
00545 
00546     case LL_RCC_USART234578_CLKSOURCE_PCLK1:
00547       usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
00548       break;
00549 
00550     case LL_RCC_USART16_CLKSOURCE_PLL2Q:
00551     case LL_RCC_USART234578_CLKSOURCE_PLL2Q:
00552       if (LL_RCC_PLL2_IsReady() != 0U)
00553       {
00554         LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
00555         usart_frequency = PLL_Clocks.PLL_Q_Frequency;
00556       }
00557       break;
00558 
00559     case LL_RCC_USART16_CLKSOURCE_PLL3Q:
00560     case LL_RCC_USART234578_CLKSOURCE_PLL3Q:
00561       if (LL_RCC_PLL3_IsReady() != 0U)
00562       {
00563         LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
00564         usart_frequency = PLL_Clocks.PLL_Q_Frequency;
00565       }
00566       break;
00567 
00568     case LL_RCC_USART16_CLKSOURCE_HSI:
00569     case LL_RCC_USART234578_CLKSOURCE_HSI:
00570       if (LL_RCC_HSI_IsReady() != 0U)
00571       {
00572         usart_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
00573       }
00574       break;
00575 
00576     case LL_RCC_USART16_CLKSOURCE_CSI:
00577     case LL_RCC_USART234578_CLKSOURCE_CSI:
00578       if (LL_RCC_CSI_IsReady() != 0U)
00579       {
00580         usart_frequency = CSI_VALUE;
00581       }
00582       break;
00583 
00584     case LL_RCC_USART16_CLKSOURCE_LSE:
00585     case LL_RCC_USART234578_CLKSOURCE_LSE:
00586       if (LL_RCC_LSE_IsReady() != 0U)
00587       {
00588         usart_frequency = LSE_VALUE;
00589       }
00590       break;
00591 
00592     default:
00593       /* Kernel clock disabled */
00594       break;
00595   }
00596 
00597   return usart_frequency;
00598 }
00599 
00600 /**
00601   * @brief  Return LPUART clock frequency
00602   * @param  LPUARTxSource This parameter can be one of the following values:
00603   *         @arg @ref LL_RCC_LPUART1_CLKSOURCE
00604   * @retval LPUART clock frequency (in Hz)
00605   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
00606   */
00607 uint32_t LL_RCC_GetLPUARTClockFreq(uint32_t LPUARTxSource)
00608 {
00609   uint32_t lpuart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00610   LL_PLL_ClocksTypeDef PLL_Clocks;
00611 
00612   switch (LL_RCC_GetLPUARTClockSource(LPUARTxSource))
00613   {
00614     case LL_RCC_LPUART1_CLKSOURCE_PCLK4:
00615       lpuart_frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
00616       break;
00617 
00618     case LL_RCC_LPUART1_CLKSOURCE_PLL2Q:
00619       if (LL_RCC_PLL2_IsReady() != 0U)
00620       {
00621         LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
00622         lpuart_frequency = PLL_Clocks.PLL_Q_Frequency;
00623       }
00624       break;
00625 
00626     case LL_RCC_LPUART1_CLKSOURCE_PLL3Q:
00627       if (LL_RCC_PLL3_IsReady() != 0U)
00628       {
00629         LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
00630         lpuart_frequency = PLL_Clocks.PLL_Q_Frequency;
00631       }
00632       break;
00633 
00634     case LL_RCC_LPUART1_CLKSOURCE_HSI:
00635       if (LL_RCC_HSI_IsReady() != 0U)
00636       {
00637         lpuart_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
00638       }
00639       break;
00640 
00641     case LL_RCC_LPUART1_CLKSOURCE_CSI:
00642       if (LL_RCC_CSI_IsReady() != 0U)
00643       {
00644         lpuart_frequency = CSI_VALUE;
00645       }
00646       break;
00647 
00648     case LL_RCC_LPUART1_CLKSOURCE_LSE:
00649       if (LL_RCC_LSE_IsReady() != 0U)
00650       {
00651         lpuart_frequency = LSE_VALUE;
00652       }
00653       break;
00654 
00655     default:
00656       /* Kernel clock disabled */
00657       break;
00658   }
00659 
00660   return lpuart_frequency;
00661 }
00662 
00663 /**
00664   * @brief  Return I2Cx clock frequency
00665   * @param  I2CxSource This parameter can be one of the following values:
00666   *         @arg @ref LL_RCC_I2C123_CLKSOURCE
00667   *         @arg @ref LL_RCC_I2C4_CLKSOURCE
00668   * @retval I2C clock frequency (in Hz)
00669   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
00670   */
00671 uint32_t LL_RCC_GetI2CClockFreq(uint32_t I2CxSource)
00672 {
00673   uint32_t i2c_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00674   LL_PLL_ClocksTypeDef PLL_Clocks;
00675 
00676   /* Check parameter */
00677   assert_param(IS_LL_RCC_I2C_CLKSOURCE(I2CxSource));
00678 
00679   switch (LL_RCC_GetI2CClockSource(I2CxSource))
00680   {
00681     case LL_RCC_I2C123_CLKSOURCE_PCLK1:
00682       i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
00683       break;
00684 
00685     case LL_RCC_I2C4_CLKSOURCE_PCLK4:
00686       i2c_frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
00687       break;
00688 
00689     case LL_RCC_I2C123_CLKSOURCE_PLL3R:
00690     case LL_RCC_I2C4_CLKSOURCE_PLL3R:
00691       if (LL_RCC_PLL3_IsReady() != 0U)
00692       {
00693         LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
00694         i2c_frequency = PLL_Clocks.PLL_R_Frequency;
00695       }
00696       break;
00697 
00698     case LL_RCC_I2C123_CLKSOURCE_HSI:
00699     case LL_RCC_I2C4_CLKSOURCE_HSI:
00700       if (LL_RCC_HSI_IsReady() != 0U)
00701       {
00702         i2c_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
00703       }
00704       break;
00705 
00706     case LL_RCC_I2C123_CLKSOURCE_CSI:
00707     case LL_RCC_I2C4_CLKSOURCE_CSI:
00708       if (LL_RCC_CSI_IsReady() != 0U)
00709       {
00710         i2c_frequency = CSI_VALUE;
00711       }
00712       break;
00713 
00714     default:
00715       /* Nothing to do */
00716       break;
00717   }
00718 
00719   return i2c_frequency;
00720 }
00721 
00722 /**
00723   * @brief  Return LPTIMx clock frequency
00724   * @param  LPTIMxSource This parameter can be one of the following values:
00725   *         @arg @ref LL_RCC_LPTIM1_CLKSOURCE
00726   *         @arg @ref LL_RCC_LPTIM2_CLKSOURCE
00727   *         @arg @ref LL_RCC_LPTIM345_CLKSOURCE
00728   * @retval LPTIM clock frequency (in Hz)
00729   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
00730   */
00731 uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)
00732 {
00733   uint32_t lptim_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00734   LL_PLL_ClocksTypeDef PLL_Clocks;
00735 
00736   /* Check parameter */
00737   assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource));
00738 
00739   switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
00740   {
00741     case LL_RCC_LPTIM1_CLKSOURCE_PCLK1:
00742       lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
00743       break;
00744 
00745     case LL_RCC_LPTIM2_CLKSOURCE_PCLK4:
00746     case LL_RCC_LPTIM345_CLKSOURCE_PCLK4:
00747       lptim_frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
00748       break;
00749 
00750     case LL_RCC_LPTIM1_CLKSOURCE_PLL2P:
00751     case LL_RCC_LPTIM2_CLKSOURCE_PLL2P:
00752     case LL_RCC_LPTIM345_CLKSOURCE_PLL2P:
00753       if (LL_RCC_PLL2_IsReady() != 0U)
00754       {
00755         LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
00756         lptim_frequency = PLL_Clocks.PLL_P_Frequency;
00757       }
00758       break;
00759 
00760     case LL_RCC_LPTIM1_CLKSOURCE_PLL3R:
00761     case LL_RCC_LPTIM2_CLKSOURCE_PLL3R:
00762     case LL_RCC_LPTIM345_CLKSOURCE_PLL3R:
00763       if (LL_RCC_PLL3_IsReady() != 0U)
00764       {
00765         LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
00766         lptim_frequency = PLL_Clocks.PLL_R_Frequency;
00767       }
00768       break;
00769 
00770     case LL_RCC_LPTIM1_CLKSOURCE_LSE:
00771     case LL_RCC_LPTIM2_CLKSOURCE_LSE:
00772     case LL_RCC_LPTIM345_CLKSOURCE_LSE:
00773       if (LL_RCC_LSE_IsReady() != 0U)
00774       {
00775         lptim_frequency = LSE_VALUE;
00776       }
00777       break;
00778 
00779     case LL_RCC_LPTIM1_CLKSOURCE_LSI:
00780     case LL_RCC_LPTIM2_CLKSOURCE_LSI:
00781     case LL_RCC_LPTIM345_CLKSOURCE_LSI:
00782       if (LL_RCC_LSI_IsReady() != 0U)
00783       {
00784         lptim_frequency = LSI_VALUE;
00785       }
00786       break;
00787 
00788     case LL_RCC_LPTIM1_CLKSOURCE_CLKP:
00789     case LL_RCC_LPTIM2_CLKSOURCE_CLKP:
00790     case LL_RCC_LPTIM345_CLKSOURCE_CLKP:
00791       lptim_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
00792       break;
00793 
00794     default:
00795       /* Kernel clock disabled */
00796       break;
00797   }
00798 
00799   return lptim_frequency;
00800 }
00801 
00802 /**
00803   * @brief  Return SAIx clock frequency
00804   * @param  SAIxSource This parameter can be one of the following values:
00805   *         @arg @ref LL_RCC_SAI1_CLKSOURCE
00806   *         @arg @ref LL_RCC_SAI23_CLKSOURCE (*)
00807   *         @arg @ref LL_RCC_SAI2A_CLKSOURCE (*)
00808   *         @arg @ref LL_RCC_SAI2B_CLKSOURCE (*)
00809   *         @arg @ref LL_RCC_SAI4A_CLKSOURCE (*)
00810   *         @arg @ref LL_RCC_SAI4B_CLKSOURCE (*)
00811   * @retval SAI clock frequency (in Hz)
00812   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
00813   *
00814   * (*) : Available on some STM32H7 lines only.
00815   */
00816 uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource)
00817 {
00818   uint32_t sai_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00819   LL_PLL_ClocksTypeDef PLL_Clocks;
00820 
00821   /* Check parameter */
00822   assert_param(IS_LL_RCC_SAI_CLKSOURCE(SAIxSource));
00823 
00824   switch (LL_RCC_GetSAIClockSource(SAIxSource))
00825   {
00826     case LL_RCC_SAI1_CLKSOURCE_PLL1Q:
00827 #if defined(SAI3)
00828     case LL_RCC_SAI23_CLKSOURCE_PLL1Q:
00829 #endif /* SAI3 */
00830 #if defined(SAI4)
00831     case LL_RCC_SAI4A_CLKSOURCE_PLL1Q:
00832     case LL_RCC_SAI4B_CLKSOURCE_PLL1Q:
00833 #endif /* SAI4 */
00834 #if defined (RCC_CDCCIP1R_SAI2ASEL) || defined(RCC_CDCCIP1R_SAI2BSEL)
00835     case LL_RCC_SAI2A_CLKSOURCE_PLL1Q:
00836     case LL_RCC_SAI2B_CLKSOURCE_PLL1Q:
00837 #endif /* RCC_CDCCIP1R_SAI2ASEL || RCC_CDCCIP1R_SAI2BSEL */ 
00838       if (LL_RCC_PLL1_IsReady() != 0U)
00839       {
00840         LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
00841         sai_frequency = PLL_Clocks.PLL_Q_Frequency;
00842       }
00843       break;
00844 
00845     case LL_RCC_SAI1_CLKSOURCE_PLL2P:
00846 #if defined(SAI3)
00847     case LL_RCC_SAI23_CLKSOURCE_PLL2P:
00848 #endif /* SAI3 */
00849 #if defined(SAI4)
00850     case LL_RCC_SAI4A_CLKSOURCE_PLL2P:
00851     case LL_RCC_SAI4B_CLKSOURCE_PLL2P:
00852 #endif /* SAI4 */
00853 #if defined (RCC_CDCCIP1R_SAI2ASEL) || defined(RCC_CDCCIP1R_SAI2BSEL)
00854     case LL_RCC_SAI2A_CLKSOURCE_PLL2P:
00855     case LL_RCC_SAI2B_CLKSOURCE_PLL2P:
00856 #endif /* RCC_CDCCIP1R_SAI2ASEL || RCC_CDCCIP1R_SAI2BSEL */
00857       if (LL_RCC_PLL2_IsReady() != 0U)
00858       {
00859         LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
00860         sai_frequency = PLL_Clocks.PLL_P_Frequency;
00861       }
00862       break;
00863 
00864     case LL_RCC_SAI1_CLKSOURCE_PLL3P:
00865 #if defined(SAI3)
00866     case LL_RCC_SAI23_CLKSOURCE_PLL3P:
00867 #endif /* SAI3 */
00868 #if defined(SAI4)
00869     case LL_RCC_SAI4A_CLKSOURCE_PLL3P:
00870     case LL_RCC_SAI4B_CLKSOURCE_PLL3P:
00871 #endif /* SAI4 */
00872 #if defined (RCC_CDCCIP1R_SAI2ASEL) || defined(RCC_CDCCIP1R_SAI2BSEL)
00873     case LL_RCC_SAI2A_CLKSOURCE_PLL3P:
00874     case LL_RCC_SAI2B_CLKSOURCE_PLL3P:
00875 #endif /* RCC_CDCCIP1R_SAI2ASEL || RCC_CDCCIP1R_SAI2BSEL */
00876       if (LL_RCC_PLL3_IsReady() != 0U)
00877       {
00878         LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
00879         sai_frequency = PLL_Clocks.PLL_P_Frequency;
00880       }
00881       break;
00882 
00883     case LL_RCC_SAI1_CLKSOURCE_I2S_CKIN:
00884 #if defined(SAI3)
00885     case LL_RCC_SAI23_CLKSOURCE_I2S_CKIN:
00886 #endif /* SAI3 */
00887 #if defined(SAI4)
00888     case LL_RCC_SAI4A_CLKSOURCE_I2S_CKIN:
00889     case LL_RCC_SAI4B_CLKSOURCE_I2S_CKIN:
00890 #endif /* SAI4 */
00891 #if defined (RCC_CDCCIP1R_SAI2ASEL) || defined(RCC_CDCCIP1R_SAI2BSEL)
00892     case LL_RCC_SAI2A_CLKSOURCE_I2S_CKIN:
00893     case LL_RCC_SAI2B_CLKSOURCE_I2S_CKIN:
00894 #endif /* RCC_CDCCIP1R_SAI2ASEL || RCC_CDCCIP1R_SAI2BSEL */
00895       sai_frequency = EXTERNAL_CLOCK_VALUE;
00896       break;
00897 
00898     case LL_RCC_SAI1_CLKSOURCE_CLKP:
00899 #if defined(SAI3)
00900     case LL_RCC_SAI23_CLKSOURCE_CLKP:
00901 #endif /* SAI3 */
00902 #if defined(SAI4)
00903     case LL_RCC_SAI4A_CLKSOURCE_CLKP:
00904     case LL_RCC_SAI4B_CLKSOURCE_CLKP:
00905 #endif /* SAI4 */
00906 #if defined (RCC_CDCCIP1R_SAI2ASEL) || defined(RCC_CDCCIP1R_SAI2BSEL)
00907     case LL_RCC_SAI2A_CLKSOURCE_CLKP:
00908     case LL_RCC_SAI2B_CLKSOURCE_CLKP:
00909 #endif /* RCC_CDCCIP1R_SAI2ASEL || RCC_CDCCIP1R_SAI2BSEL */
00910       sai_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
00911       break;
00912 
00913     default:
00914       /* Kernel clock disabled */
00915       break;
00916   }
00917 
00918   return sai_frequency;
00919 }
00920 
00921 /**
00922   * @brief  Return ADC clock frequency
00923   * @param  ADCxSource This parameter can be one of the following values:
00924   *         @arg @ref LL_RCC_ADC_CLKSOURCE
00925   * @retval ADC clock frequency (in Hz)
00926   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
00927   */
00928 uint32_t LL_RCC_GetADCClockFreq(uint32_t ADCxSource)
00929 {
00930   uint32_t adc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00931   LL_PLL_ClocksTypeDef PLL_Clocks;
00932 
00933   switch (LL_RCC_GetADCClockSource(ADCxSource))
00934   {
00935     case LL_RCC_ADC_CLKSOURCE_PLL2P:
00936       if (LL_RCC_PLL2_IsReady() != 0U)
00937       {
00938         LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
00939         adc_frequency = PLL_Clocks.PLL_P_Frequency;
00940       }
00941       break;
00942 
00943     case LL_RCC_ADC_CLKSOURCE_PLL3R:
00944       if (LL_RCC_PLL3_IsReady() != 0U)
00945       {
00946         LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
00947         adc_frequency = PLL_Clocks.PLL_R_Frequency;
00948       }
00949       break;
00950 
00951     case LL_RCC_ADC_CLKSOURCE_CLKP:
00952       adc_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
00953       break;
00954 
00955     default:
00956       /* Kernel clock disabled */
00957       break;
00958   }
00959 
00960   return adc_frequency;
00961 }
00962 
00963 /**
00964   * @brief  Return SDMMC clock frequency
00965   * @param  SDMMCxSource This parameter can be one of the following values:
00966   *         @arg @ref LL_RCC_SDMMC_CLKSOURCE
00967   * @retval SDMMC clock frequency (in Hz)
00968   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
00969   */
00970 uint32_t LL_RCC_GetSDMMCClockFreq(uint32_t SDMMCxSource)
00971 {
00972   uint32_t sdmmc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00973   LL_PLL_ClocksTypeDef PLL_Clocks;
00974 
00975   switch (LL_RCC_GetSDMMCClockSource(SDMMCxSource))
00976   {
00977     case LL_RCC_SDMMC_CLKSOURCE_PLL1Q:
00978       if (LL_RCC_PLL1_IsReady() != 0U)
00979       {
00980         LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
00981         sdmmc_frequency = PLL_Clocks.PLL_Q_Frequency;
00982       }
00983       break;
00984 
00985     case LL_RCC_SDMMC_CLKSOURCE_PLL2R:
00986       if (LL_RCC_PLL2_IsReady() != 0U)
00987       {
00988         LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
00989         sdmmc_frequency = PLL_Clocks.PLL_R_Frequency;
00990       }
00991       break;
00992 
00993     default:
00994       /* Nothing to do */
00995       break;
00996   }
00997 
00998   return sdmmc_frequency;
00999 }
01000 
01001 /**
01002   * @brief  Return RNG clock frequency
01003   * @param  RNGxSource This parameter can be one of the following values:
01004   *         @arg @ref LL_RCC_RNG_CLKSOURCE
01005   * @retval RNG clock frequency (in Hz)
01006   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
01007   */
01008 uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource)
01009 {
01010   uint32_t rng_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01011   LL_PLL_ClocksTypeDef PLL_Clocks;
01012 
01013   switch (LL_RCC_GetRNGClockSource(RNGxSource))
01014   {
01015     case LL_RCC_RNG_CLKSOURCE_PLL1Q:
01016       if (LL_RCC_PLL1_IsReady() != 0U)
01017       {
01018         LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
01019         rng_frequency = PLL_Clocks.PLL_Q_Frequency;
01020       }
01021       break;
01022 
01023     case LL_RCC_RNG_CLKSOURCE_HSI48:
01024       if (LL_RCC_HSI48_IsReady() != 0U)
01025       {
01026         rng_frequency = 48000000U;
01027       }
01028       break;
01029 
01030     case LL_RCC_RNG_CLKSOURCE_LSE:
01031       if (LL_RCC_LSE_IsReady() != 0U)
01032       {
01033         rng_frequency = LSE_VALUE;
01034       }
01035       break;
01036 
01037     case LL_RCC_RNG_CLKSOURCE_LSI:
01038       if (LL_RCC_LSI_IsReady() != 0U)
01039       {
01040         rng_frequency = LSI_VALUE;
01041       }
01042       break;
01043 
01044     default:
01045       /* Nothing to do */
01046       break;
01047   }
01048 
01049   return rng_frequency;
01050 }
01051 
01052 /**
01053   * @brief  Return CEC clock frequency
01054   * @param  CECxSource This parameter can be one of the following values:
01055   *         @arg @ref LL_RCC_RNG_CLKSOURCE
01056   * @retval CEC clock frequency (in Hz)
01057   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
01058   */
01059 uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource)
01060 {
01061   uint32_t cec_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01062 
01063   switch (LL_RCC_GetCECClockSource(CECxSource))
01064   {
01065     case LL_RCC_CEC_CLKSOURCE_LSE:
01066       if (LL_RCC_LSE_IsReady() != 0U)
01067       {
01068         cec_frequency = LSE_VALUE;
01069       }
01070       break;
01071 
01072     case LL_RCC_CEC_CLKSOURCE_LSI:
01073       if (LL_RCC_LSI_IsReady() != 0U)
01074       {
01075         cec_frequency = LSI_VALUE;
01076       }
01077       break;
01078 
01079     case LL_RCC_CEC_CLKSOURCE_CSI_DIV122:
01080       if (LL_RCC_CSI_IsReady() != 0U)
01081       {
01082         cec_frequency = CSI_VALUE / 122U;
01083       }
01084       break;
01085 
01086     default:
01087       /* Kernel clock disabled */
01088       break;
01089   }
01090 
01091   return cec_frequency;
01092 }
01093 
01094 /**
01095   * @brief  Return USB clock frequency
01096   * @param  USBxSource This parameter can be one of the following values:
01097   *         @arg @ref LL_RCC_USB_CLKSOURCE
01098   * @retval USB clock frequency (in Hz)
01099   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready or Disabled
01100   */
01101 uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource)
01102 {
01103   uint32_t usb_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01104   LL_PLL_ClocksTypeDef PLL_Clocks;
01105 
01106   switch (LL_RCC_GetUSBClockSource(USBxSource))
01107   {
01108     case LL_RCC_USB_CLKSOURCE_PLL1Q:
01109       if (LL_RCC_PLL1_IsReady() != 0U)
01110       {
01111         LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
01112         usb_frequency = PLL_Clocks.PLL_Q_Frequency;
01113       }
01114       break;
01115 
01116     case LL_RCC_USB_CLKSOURCE_PLL3Q:
01117       if (LL_RCC_PLL3_IsReady() != 0U)
01118       {
01119         LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
01120         usb_frequency = PLL_Clocks.PLL_Q_Frequency;
01121       }
01122       break;
01123 
01124     case LL_RCC_USB_CLKSOURCE_HSI48:
01125       if (LL_RCC_HSI48_IsReady() != 0U)
01126       {
01127         usb_frequency = HSI48_VALUE;
01128       }
01129       break;
01130 
01131     case LL_RCC_USB_CLKSOURCE_DISABLE:
01132     default:
01133       /* Nothing to do */
01134       break;
01135   }
01136 
01137   return usb_frequency;
01138 }
01139 
01140 /**
01141   * @brief  Return DFSDM clock frequency
01142   * @param  DFSDMxSource This parameter can be one of the following values:
01143   *         @arg @ref LL_RCC_DFSDM1_CLKSOURCE
01144   * @retval DFSDM clock frequency (in Hz)
01145   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
01146   */
01147 uint32_t LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource)
01148 {
01149   uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01150 
01151   switch (LL_RCC_GetDFSDMClockSource(DFSDMxSource))
01152   {
01153     case LL_RCC_DFSDM1_CLKSOURCE_SYSCLK:
01154       dfsdm_frequency = RCC_GetSystemClockFreq();
01155       break;
01156 
01157     case LL_RCC_DFSDM1_CLKSOURCE_PCLK2:
01158       dfsdm_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
01159       break;
01160 
01161     default:
01162       /* Nothing to do */
01163       break;
01164   }
01165 
01166   return dfsdm_frequency;
01167 }
01168 
01169 #if defined(DFSDM2_BASE)
01170 /**
01171   * @brief  Return DFSDM clock frequency
01172   * @param  DFSDMxSource This parameter can be one of the following values:
01173   *         @arg @ref LL_RCC_DFSDM2_CLKSOURCE
01174   * @retval DFSDM clock frequency (in Hz)
01175   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
01176   */
01177 uint32_t LL_RCC_GetDFSDM2ClockFreq(uint32_t DFSDMxSource)
01178 {
01179   uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01180 
01181 
01182   switch (LL_RCC_GetDFSDM2ClockSource(DFSDMxSource))
01183   {
01184 
01185     case LL_RCC_DFSDM2_CLKSOURCE_SYSCLK:
01186       dfsdm_frequency = RCC_GetSystemClockFreq();
01187       break;
01188 
01189     case LL_RCC_DFSDM2_CLKSOURCE_PCLK4:
01190       dfsdm_frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
01191       break;
01192 
01193     default:
01194       /* Nothing to do */
01195       break;
01196   }
01197 
01198   return dfsdm_frequency;
01199 }
01200 #endif /* DFSDM2_BASE */
01201 
01202 #if defined(DSI)
01203 /**
01204   * @brief  Return DSI clock frequency
01205   * @param  DSIxSource This parameter can be one of the following values:
01206   *         @arg @ref LL_RCC_DSI_CLKSOURCE
01207   * @retval DSI clock frequency (in Hz)
01208   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
01209   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NA indicates that external clock is used
01210   */
01211 uint32_t LL_RCC_GetDSIClockFreq(uint32_t DSIxSource)
01212 {
01213   uint32_t dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01214   LL_PLL_ClocksTypeDef PLL_Clocks;
01215 
01216   switch (LL_RCC_GetDSIClockSource(DSIxSource))
01217   {
01218     case LL_RCC_DSI_CLKSOURCE_PLL2Q:
01219       if (LL_RCC_PLL2_IsReady() != 0U)
01220       {
01221         LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
01222         dsi_frequency = PLL_Clocks.PLL_Q_Frequency;
01223       }
01224       break;
01225 
01226     case LL_RCC_DSI_CLKSOURCE_PHY:
01227       dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
01228       break;
01229 
01230     default:
01231       /* Nothing to do */
01232       break;
01233   }
01234 
01235   return dsi_frequency;
01236 }
01237 #endif /* DSI */
01238 
01239 /**
01240   * @brief  Return SPDIF clock frequency
01241   * @param  SPDIFxSource This parameter can be one of the following values:
01242   *         @arg @ref LL_RCC_SPDIF_CLKSOURCE
01243   * @retval SPDIF clock frequency (in Hz)
01244   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
01245   */
01246 uint32_t LL_RCC_GetSPDIFClockFreq(uint32_t SPDIFxSource)
01247 {
01248   uint32_t spdif_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01249   LL_PLL_ClocksTypeDef PLL_Clocks;
01250 
01251   switch (LL_RCC_GetSPDIFClockSource(SPDIFxSource))
01252   {
01253     case LL_RCC_SPDIF_CLKSOURCE_PLL1Q:
01254       if (LL_RCC_PLL1_IsReady() != 0U)
01255       {
01256         LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
01257         spdif_frequency = PLL_Clocks.PLL_Q_Frequency;
01258       }
01259       break;
01260 
01261     case LL_RCC_SPDIF_CLKSOURCE_PLL2R:
01262       if (LL_RCC_PLL2_IsReady() != 0U)
01263       {
01264         LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
01265         spdif_frequency = PLL_Clocks.PLL_R_Frequency;
01266       }
01267       break;
01268 
01269     case LL_RCC_SPDIF_CLKSOURCE_PLL3R:
01270       if (LL_RCC_PLL3_IsReady() != 0U)
01271       {
01272         LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
01273         spdif_frequency = PLL_Clocks.PLL_R_Frequency;
01274       }
01275       break;
01276 
01277     case LL_RCC_SPDIF_CLKSOURCE_HSI:
01278       if (LL_RCC_HSI_IsReady() != 0U)
01279       {
01280         spdif_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
01281       }
01282       break;
01283 
01284     default:
01285       /* Nothing to do */
01286       break;
01287   }
01288 
01289   return spdif_frequency;
01290 }
01291 
01292 /**
01293   * @brief  Return SPIx clock frequency
01294   * @param  SPIxSource This parameter can be one of the following values:
01295   *         @arg @ref LL_RCC_SPI123_CLKSOURCE
01296   *         @arg @ref LL_RCC_SPI45_CLKSOURCE
01297   *         @arg @ref LL_RCC_SPI6_CLKSOURCE
01298   * @retval SPI clock frequency (in Hz)
01299   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
01300   */
01301 uint32_t LL_RCC_GetSPIClockFreq(uint32_t SPIxSource)
01302 {
01303   uint32_t spi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01304   LL_PLL_ClocksTypeDef PLL_Clocks;
01305 
01306   /* Check parameter */
01307   assert_param(IS_LL_RCC_SPI_CLKSOURCE(SPIxSource));
01308 
01309   switch (LL_RCC_GetSPIClockSource(SPIxSource))
01310   {
01311     case LL_RCC_SPI123_CLKSOURCE_PLL1Q:
01312       if (LL_RCC_PLL1_IsReady() != 0U)
01313       {
01314         LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
01315         spi_frequency = PLL_Clocks.PLL_Q_Frequency;
01316       }
01317       break;
01318 
01319     case LL_RCC_SPI123_CLKSOURCE_PLL2P:
01320       if (LL_RCC_PLL2_IsReady() != 0U)
01321       {
01322         LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
01323         spi_frequency = PLL_Clocks.PLL_P_Frequency;
01324       }
01325       break;
01326 
01327     case LL_RCC_SPI123_CLKSOURCE_PLL3P:
01328       if (LL_RCC_PLL3_IsReady() != 0U)
01329       {
01330         LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
01331         spi_frequency = PLL_Clocks.PLL_P_Frequency;
01332       }
01333       break;
01334 
01335     case LL_RCC_SPI123_CLKSOURCE_I2S_CKIN:
01336 #if defined(LL_RCC_SPI6_CLKSOURCE_I2S_CKIN)
01337     case LL_RCC_SPI6_CLKSOURCE_I2S_CKIN:
01338 #endif /* LL_RCC_SPI6_CLKSOURCE_I2S_CKIN */
01339       spi_frequency = EXTERNAL_CLOCK_VALUE;
01340       break;
01341 
01342     case LL_RCC_SPI123_CLKSOURCE_CLKP:
01343       spi_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
01344       break;
01345 
01346     case LL_RCC_SPI45_CLKSOURCE_PCLK2:
01347       spi_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
01348       break;
01349 
01350     case LL_RCC_SPI6_CLKSOURCE_PCLK4:
01351       spi_frequency = RCC_GetPCLK4ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
01352       break;
01353 
01354     case LL_RCC_SPI45_CLKSOURCE_PLL2Q:
01355     case LL_RCC_SPI6_CLKSOURCE_PLL2Q:
01356       if (LL_RCC_PLL2_IsReady() != 0U)
01357       {
01358         LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
01359         spi_frequency = PLL_Clocks.PLL_Q_Frequency;
01360       }
01361       break;
01362 
01363     case LL_RCC_SPI45_CLKSOURCE_PLL3Q:
01364     case LL_RCC_SPI6_CLKSOURCE_PLL3Q:
01365       if (LL_RCC_PLL3_IsReady() != 0U)
01366       {
01367         LL_RCC_GetPLL3ClockFreq(&PLL_Clocks);
01368         spi_frequency = PLL_Clocks.PLL_Q_Frequency;
01369       }
01370       break;
01371 
01372     case LL_RCC_SPI45_CLKSOURCE_HSI:
01373     case LL_RCC_SPI6_CLKSOURCE_HSI:
01374       if (LL_RCC_HSI_IsReady() != 0U)
01375       {
01376         spi_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
01377       }
01378       break;
01379 
01380     case LL_RCC_SPI45_CLKSOURCE_CSI:
01381     case LL_RCC_SPI6_CLKSOURCE_CSI:
01382       if (LL_RCC_CSI_IsReady() != 0U)
01383       {
01384         spi_frequency = CSI_VALUE;
01385       }
01386       break;
01387 
01388     case LL_RCC_SPI45_CLKSOURCE_HSE:
01389     case LL_RCC_SPI6_CLKSOURCE_HSE:
01390       if (LL_RCC_HSE_IsReady() != 0U)
01391       {
01392         spi_frequency = HSE_VALUE;
01393       }
01394       break;
01395 
01396     default:
01397       /* Kernel clock disabled */
01398       break;
01399   }
01400 
01401   return spi_frequency;
01402 }
01403 
01404 /**
01405   * @brief  Return SWP clock frequency
01406   * @param  SWPxSource This parameter can be one of the following values:
01407   *         @arg @ref LL_RCC_SWP_CLKSOURCE
01408   * @retval SWP clock frequency (in Hz)
01409   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
01410   */
01411 uint32_t LL_RCC_GetSWPClockFreq(uint32_t SWPxSource)
01412 {
01413   uint32_t swp_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01414 
01415   switch (LL_RCC_GetSWPClockSource(SWPxSource))
01416   {
01417     case LL_RCC_SWP_CLKSOURCE_PCLK1:
01418       swp_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler())));
01419       break;
01420 
01421     case LL_RCC_SWP_CLKSOURCE_HSI:
01422       if (LL_RCC_HSI_IsReady() != 0U)
01423       {
01424         swp_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
01425       }
01426       break;
01427 
01428     default:
01429       /* Nothing to do */
01430       break;
01431   }
01432 
01433   return swp_frequency;
01434 }
01435 
01436 /**
01437   * @brief  Return FDCAN clock frequency
01438   * @param  FDCANxSource This parameter can be one of the following values:
01439   *         @arg @ref LL_RCC_FDCAN_CLKSOURCE
01440   * @retval FDCAN clock frequency (in Hz)
01441   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
01442   */
01443 uint32_t LL_RCC_GetFDCANClockFreq(uint32_t FDCANxSource)
01444 {
01445   uint32_t fdcan_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01446   LL_PLL_ClocksTypeDef PLL_Clocks;
01447 
01448   switch (LL_RCC_GetFDCANClockSource(FDCANxSource))
01449   {
01450     case LL_RCC_FDCAN_CLKSOURCE_HSE:
01451       if (LL_RCC_HSE_IsReady() != 0U)
01452       {
01453         fdcan_frequency = HSE_VALUE;
01454       }
01455       break;
01456 
01457     case LL_RCC_FDCAN_CLKSOURCE_PLL1Q:
01458       if (LL_RCC_PLL1_IsReady() != 0U)
01459       {
01460         LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
01461         fdcan_frequency = PLL_Clocks.PLL_Q_Frequency;
01462       }
01463       break;
01464 
01465     case LL_RCC_FDCAN_CLKSOURCE_PLL2Q:
01466       if (LL_RCC_PLL2_IsReady() != 0U)
01467       {
01468         LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
01469         fdcan_frequency = PLL_Clocks.PLL_Q_Frequency;
01470       }
01471       break;
01472 
01473     default:
01474       /* Kernel clock disabled */
01475       break;
01476   }
01477 
01478   return fdcan_frequency;
01479 }
01480 
01481 /**
01482   * @brief  Return FMC clock frequency
01483   * @param  FMCxSource This parameter can be one of the following values:
01484   *         @arg @ref LL_RCC_FMC_CLKSOURCE
01485   * @retval FMC clock frequency (in Hz)
01486   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
01487   */
01488 uint32_t LL_RCC_GetFMCClockFreq(uint32_t FMCxSource)
01489 {
01490   uint32_t fmc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01491   LL_PLL_ClocksTypeDef PLL_Clocks;
01492 
01493   switch (LL_RCC_GetFMCClockSource(FMCxSource))
01494   {
01495     case LL_RCC_FMC_CLKSOURCE_HCLK:
01496       fmc_frequency = RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()));
01497       break;
01498 
01499     case LL_RCC_FMC_CLKSOURCE_PLL1Q:
01500       if (LL_RCC_PLL1_IsReady() != 0U)
01501       {
01502         LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
01503         fmc_frequency = PLL_Clocks.PLL_Q_Frequency;
01504       }
01505       break;
01506 
01507     case LL_RCC_FMC_CLKSOURCE_PLL2R:
01508       if (LL_RCC_PLL2_IsReady() != 0U)
01509       {
01510         LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
01511         fmc_frequency = PLL_Clocks.PLL_R_Frequency;
01512       }
01513       break;
01514 
01515     case LL_RCC_FMC_CLKSOURCE_CLKP:
01516       fmc_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
01517       break;
01518 
01519     default:
01520       /* Nothing to do */
01521       break;
01522   }
01523 
01524   return fmc_frequency;
01525 }
01526 
01527 #if defined(QUADSPI)
01528 /**
01529   * @brief  Return QSPI clock frequency
01530   * @param  QSPIxSource This parameter can be one of the following values:
01531   *         @arg @ref LL_RCC_QSPI_CLKSOURCE
01532   * @retval QSPI clock frequency (in Hz)
01533   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
01534   */
01535 uint32_t LL_RCC_GetQSPIClockFreq(uint32_t QSPIxSource)
01536 {
01537   uint32_t qspi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01538   LL_PLL_ClocksTypeDef PLL_Clocks;
01539 
01540   switch (LL_RCC_GetQSPIClockSource(QSPIxSource))
01541   {
01542     case LL_RCC_QSPI_CLKSOURCE_HCLK:
01543       qspi_frequency = RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()));
01544       break;
01545 
01546     case LL_RCC_QSPI_CLKSOURCE_PLL1Q:
01547       if (LL_RCC_PLL1_IsReady() != 0U)
01548       {
01549         LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
01550         qspi_frequency = PLL_Clocks.PLL_Q_Frequency;
01551       }
01552       break;
01553 
01554     case LL_RCC_QSPI_CLKSOURCE_PLL2R:
01555       if (LL_RCC_PLL2_IsReady() != 0U)
01556       {
01557         LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
01558         qspi_frequency = PLL_Clocks.PLL_R_Frequency;
01559       }
01560       break;
01561 
01562     case LL_RCC_QSPI_CLKSOURCE_CLKP:
01563       qspi_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
01564       break;
01565 
01566     default:
01567       /* Nothing to do */
01568       break;
01569   }
01570 
01571   return qspi_frequency;
01572 }
01573 #endif /* QUADSPI */
01574 
01575 #if defined(OCTOSPI1) || defined(OCTOSPI2)
01576 /**
01577   * @brief  Return OSPI clock frequency
01578   * @param  OSPIxSource This parameter can be one of the following values:
01579   *         @arg @ref LL_RCC_OSPI_CLKSOURCE
01580   * @retval OSPI clock frequency (in Hz)
01581   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
01582   */
01583 
01584 uint32_t LL_RCC_GetOSPIClockFreq(uint32_t OSPIxSource)
01585 {
01586   uint32_t ospi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01587   LL_PLL_ClocksTypeDef PLL_Clocks;
01588 
01589   switch (LL_RCC_GetOSPIClockSource(OSPIxSource))
01590   {
01591     case LL_RCC_OSPI_CLKSOURCE_HCLK:
01592       ospi_frequency = RCC_GetHCLKClockFreq(LL_RCC_CALC_SYSCLK_FREQ(RCC_GetSystemClockFreq(),LL_RCC_GetSysPrescaler()));
01593       break;
01594 
01595     case LL_RCC_OSPI_CLKSOURCE_PLL1Q:
01596       if (LL_RCC_PLL1_IsReady() != 0U)
01597       {
01598         LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
01599         ospi_frequency = PLL_Clocks.PLL_Q_Frequency;
01600       }
01601       break;
01602 
01603     case LL_RCC_OSPI_CLKSOURCE_PLL2R:
01604       if (LL_RCC_PLL2_IsReady() != 0U)
01605       {
01606         LL_RCC_GetPLL2ClockFreq(&PLL_Clocks);
01607         ospi_frequency = PLL_Clocks.PLL_R_Frequency;
01608       }
01609       break;
01610 
01611     case LL_RCC_OSPI_CLKSOURCE_CLKP:
01612       ospi_frequency = LL_RCC_GetCLKPClockFreq(LL_RCC_CLKP_CLKSOURCE);
01613       break;
01614 
01615     default:
01616       /* Nothing to do */
01617       break;
01618   }
01619 
01620   return ospi_frequency;
01621 }
01622 #endif /* defined(OCTOSPI1) || defined(OCTOSPI2) */
01623 
01624 /**
01625   * @brief  Return CLKP clock frequency
01626   * @param  CLKPxSource This parameter can be one of the following values:
01627   *         @arg @ref LL_RCC_CLKP_CLKSOURCE
01628   * @retval CLKP clock frequency (in Hz)
01629   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
01630   */
01631 uint32_t LL_RCC_GetCLKPClockFreq(uint32_t CLKPxSource)
01632 {
01633   uint32_t clkp_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01634 
01635   switch (LL_RCC_GetCLKPClockSource(CLKPxSource))
01636   {
01637     case LL_RCC_CLKP_CLKSOURCE_HSI:
01638       if (LL_RCC_HSI_IsReady() != 0U)
01639       {
01640         clkp_frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
01641       }
01642       break;
01643 
01644     case LL_RCC_CLKP_CLKSOURCE_CSI:
01645       if (LL_RCC_CSI_IsReady() != 0U)
01646       {
01647         clkp_frequency = CSI_VALUE;
01648       }
01649       break;
01650 
01651     case LL_RCC_CLKP_CLKSOURCE_HSE:
01652       if (LL_RCC_HSE_IsReady() != 0U)
01653       {
01654         clkp_frequency = HSE_VALUE;
01655       }
01656       break;
01657 
01658     default:
01659       /* CLKP clock disabled */
01660       break;
01661   }
01662 
01663   return clkp_frequency;
01664 }
01665 
01666 /**
01667   * @}
01668   */
01669 
01670 /**
01671   * @}
01672   */
01673 
01674 /** @addtogroup RCC_LL_Private_Functions
01675   * @{
01676   */
01677 
01678 /**
01679   * @brief  Return SYSTEM clock frequency
01680   * @retval SYSTEM clock frequency (in Hz)
01681   */
01682 static uint32_t RCC_GetSystemClockFreq(void)
01683 {
01684   uint32_t frequency = 0U;
01685   LL_PLL_ClocksTypeDef PLL_Clocks;
01686 
01687   /* Get SYSCLK source -------------------------------------------------------*/
01688   switch (LL_RCC_GetSysClkSource())
01689   {
01690     /* No check on Ready: Won't be selected by hardware if not */
01691     case LL_RCC_SYS_CLKSOURCE_STATUS_HSI:
01692       frequency = HSI_VALUE >> (LL_RCC_HSI_GetDivider()>> RCC_CR_HSIDIV_Pos);
01693       break;
01694 
01695     case LL_RCC_SYS_CLKSOURCE_STATUS_CSI:
01696       frequency = CSI_VALUE;
01697       break;
01698 
01699     case LL_RCC_SYS_CLKSOURCE_STATUS_HSE:
01700       frequency = HSE_VALUE;
01701       break;
01702 
01703     case LL_RCC_SYS_CLKSOURCE_STATUS_PLL1:
01704       LL_RCC_GetPLL1ClockFreq(&PLL_Clocks);
01705       frequency = PLL_Clocks.PLL_P_Frequency;
01706       break;
01707 
01708     default:
01709       /* Nothing to do */
01710       break;
01711   }
01712 
01713   return frequency;
01714 }
01715 
01716 /**
01717   * @brief  Return HCLK clock frequency
01718   * @param  SYSCLK_Frequency SYSCLK clock frequency
01719   * @retval HCLK clock frequency (in Hz)
01720   */
01721 static uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)
01722 {
01723   /* HCLK clock frequency */
01724   return LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler());
01725 }
01726 
01727 /**
01728   * @brief  Return PCLK1 clock frequency
01729   * @param  HCLK_Frequency HCLK clock frequency
01730   * @retval PCLK1 clock frequency (in Hz)
01731   */
01732 static uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)
01733 {
01734   /* PCLK1 clock frequency */
01735   return LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler());
01736 }
01737 
01738 /**
01739   * @brief  Return PCLK2 clock frequency
01740   * @param  HCLK_Frequency HCLK clock frequency
01741   * @retval PCLK2 clock frequency (in Hz)
01742   */
01743 static uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency)
01744 {
01745   /* PCLK2 clock frequency */
01746   return LL_RCC_CALC_PCLK2_FREQ(HCLK_Frequency, LL_RCC_GetAPB2Prescaler());
01747 }
01748 
01749 /**
01750   * @brief  Return PCLK3 clock frequency
01751   * @param  HCLK_Frequency HCLK clock frequency
01752   * @retval PCLK3 clock frequency (in Hz)
01753   */
01754 static uint32_t RCC_GetPCLK3ClockFreq(uint32_t HCLK_Frequency)
01755 {
01756   /* PCLK3 clock frequency */
01757   return LL_RCC_CALC_PCLK3_FREQ(HCLK_Frequency, LL_RCC_GetAPB3Prescaler());
01758 }
01759 
01760 /**
01761   * @brief  Return PCLK4 clock frequency
01762   * @param  HCLK_Frequency HCLK clock frequency
01763   * @retval PCLK4 clock frequency (in Hz)
01764   */
01765 static uint32_t RCC_GetPCLK4ClockFreq(uint32_t HCLK_Frequency)
01766 {
01767   /* PCLK4 clock frequency */
01768   return LL_RCC_CALC_PCLK4_FREQ(HCLK_Frequency, LL_RCC_GetAPB4Prescaler());
01769 }
01770 
01771 /**
01772   * @}
01773   */
01774 
01775 /**
01776   * @}
01777   */
01778 
01779 #endif /* defined(RCC) */
01780 
01781 /**
01782   * @}
01783   */
01784 
01785 #endif /* USE_FULL_LL_DRIVER */
01786