STM32F479xx HAL User Manual
stm32f4xx_ll_rcc.c
Go to the documentation of this file.
00001 /**
00002   ******************************************************************************
00003   * @file    stm32f4xx_ll_rcc.c
00004   * @author  MCD Application Team
00005   * @brief   RCC LL module driver.
00006   ******************************************************************************
00007   * @attention
00008   *
00009   * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
00010   * All rights reserved.</center></h2>
00011   *
00012   * This software component is licensed by ST under BSD 3-Clause license,
00013   * the "License"; You may not use this file except in compliance with the
00014   * License. You may obtain a copy of the License at:
00015   *                        opensource.org/licenses/BSD-3-Clause
00016   *
00017   ******************************************************************************
00018   */
00019 #if defined(USE_FULL_LL_DRIVER)
00020 
00021 /* Includes ------------------------------------------------------------------*/
00022 #include "stm32f4xx_ll_rcc.h"
00023 #ifdef  USE_FULL_ASSERT
00024   #include "stm32_assert.h"
00025 #else
00026   #define assert_param(expr) ((void)0U)
00027 #endif
00028 /** @addtogroup STM32F4xx_LL_Driver
00029   * @{
00030   */
00031 
00032 #if defined(RCC)
00033 
00034 /** @addtogroup RCC_LL
00035   * @{
00036   */
00037 
00038 /* Private types -------------------------------------------------------------*/
00039 /* Private variables ---------------------------------------------------------*/
00040 /* Private constants ---------------------------------------------------------*/
00041 /* Private macros ------------------------------------------------------------*/
00042 /** @addtogroup RCC_LL_Private_Macros
00043   * @{
00044   */
00045 #if defined(FMPI2C1)
00046 #define IS_LL_RCC_FMPI2C_CLKSOURCE(__VALUE__)     ((__VALUE__) == LL_RCC_FMPI2C1_CLKSOURCE)
00047 #endif /* FMPI2C1 */
00048 
00049 #if defined(LPTIM1)
00050 #define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE))
00051 #endif /* LPTIM1 */
00052 
00053 #if defined(SAI1)
00054 #if defined(RCC_DCKCFGR_SAI1SRC)
00055 #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \
00056                                             || ((__VALUE__) == LL_RCC_SAI2_CLKSOURCE))
00057 #elif defined(RCC_DCKCFGR_SAI1ASRC)
00058 #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_SAI1_A_CLKSOURCE) \
00059                                             || ((__VALUE__) == LL_RCC_SAI1_B_CLKSOURCE))
00060 #endif /* RCC_DCKCFGR_SAI1SRC */
00061 #endif /* SAI1 */
00062 
00063 #if defined(SDIO)
00064 #define IS_LL_RCC_SDIO_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_SDIO_CLKSOURCE))
00065 #endif /* SDIO */
00066 
00067 #if defined(RNG)
00068 #define IS_LL_RCC_RNG_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_RNG_CLKSOURCE))
00069 #endif /* RNG */
00070 
00071 #if defined(USB_OTG_FS) || defined(USB_OTG_HS)
00072 #define IS_LL_RCC_USB_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_USB_CLKSOURCE))
00073 #endif /* USB_OTG_FS || USB_OTG_HS */
00074 
00075 #if defined(DFSDM2_Channel0)
00076 #define IS_LL_RCC_DFSDM_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_DFSDM1_CLKSOURCE))
00077 
00078 #define IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_DFSDM1_AUDIO_CLKSOURCE) \
00079                                                     || ((__VALUE__) == LL_RCC_DFSDM2_AUDIO_CLKSOURCE))
00080 #elif defined(DFSDM1_Channel0)
00081 #define IS_LL_RCC_DFSDM_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_DFSDM1_CLKSOURCE))
00082 
00083 #define IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_DFSDM1_AUDIO_CLKSOURCE))
00084 #endif /* DFSDM2_Channel0 */
00085 
00086 #if defined(RCC_DCKCFGR_I2S2SRC)
00087 #define IS_LL_RCC_I2S_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_I2S1_CLKSOURCE) \
00088                                             || ((__VALUE__) == LL_RCC_I2S2_CLKSOURCE))
00089 #else
00090 #define IS_LL_RCC_I2S_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_I2S1_CLKSOURCE))
00091 #endif /* RCC_DCKCFGR_I2S2SRC */
00092 
00093 #if defined(CEC)
00094 #define IS_LL_RCC_CEC_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_CEC_CLKSOURCE))
00095 #endif /* CEC */
00096 
00097 #if defined(DSI)
00098 #define IS_LL_RCC_DSI_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_DSI_CLKSOURCE))
00099 #endif /* DSI */
00100 
00101 #if defined(LTDC)
00102 #define IS_LL_RCC_LTDC_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_LTDC_CLKSOURCE))
00103 #endif /* LTDC */
00104 
00105 #if defined(SPDIFRX)
00106 #define IS_LL_RCC_SPDIFRX_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_SPDIFRX1_CLKSOURCE))
00107 #endif /* SPDIFRX */
00108 /**
00109   * @}
00110   */
00111 
00112 /* Private function prototypes -----------------------------------------------*/
00113 /** @defgroup RCC_LL_Private_Functions RCC Private functions
00114   * @{
00115   */
00116 uint32_t RCC_GetSystemClockFreq(void);
00117 uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency);
00118 uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency);
00119 uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency);
00120 uint32_t RCC_PLL_GetFreqDomain_SYS(uint32_t SYSCLK_Source);
00121 uint32_t RCC_PLL_GetFreqDomain_48M(void);
00122 #if defined(RCC_DCKCFGR_I2SSRC) || defined(RCC_DCKCFGR_I2S1SRC)
00123 uint32_t RCC_PLL_GetFreqDomain_I2S(void);
00124 #endif /* RCC_DCKCFGR_I2SSRC || RCC_DCKCFGR_I2S1SRC */
00125 #if defined(SPDIFRX)
00126 uint32_t RCC_PLL_GetFreqDomain_SPDIFRX(void);
00127 #endif /* SPDIFRX */
00128 #if defined(RCC_PLLCFGR_PLLR)
00129 #if defined(SAI1)
00130 uint32_t RCC_PLL_GetFreqDomain_SAI(void);
00131 #endif /* SAI1 */
00132 #endif /* RCC_PLLCFGR_PLLR */
00133 #if defined(DSI)
00134 uint32_t RCC_PLL_GetFreqDomain_DSI(void);
00135 #endif /* DSI */
00136 #if defined(RCC_PLLSAI_SUPPORT)
00137 uint32_t RCC_PLLSAI_GetFreqDomain_SAI(void);
00138 #if defined(RCC_PLLSAICFGR_PLLSAIP)
00139 uint32_t RCC_PLLSAI_GetFreqDomain_48M(void);
00140 #endif /* RCC_PLLSAICFGR_PLLSAIP */
00141 #if defined(LTDC)
00142 uint32_t RCC_PLLSAI_GetFreqDomain_LTDC(void);
00143 #endif /* LTDC */
00144 #endif /* RCC_PLLSAI_SUPPORT */
00145 #if defined(RCC_PLLI2S_SUPPORT)
00146 uint32_t RCC_PLLI2S_GetFreqDomain_I2S(void);
00147 #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
00148 uint32_t RCC_PLLI2S_GetFreqDomain_48M(void);
00149 #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
00150 #if defined(SAI1)
00151 uint32_t RCC_PLLI2S_GetFreqDomain_SAI(void);
00152 #endif /* SAI1 */
00153 #if defined(SPDIFRX)
00154 uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void);
00155 #endif /* SPDIFRX */
00156 #endif /* RCC_PLLI2S_SUPPORT */
00157 /**
00158   * @}
00159   */
00160 
00161 
00162 /* Exported functions --------------------------------------------------------*/
00163 /** @addtogroup RCC_LL_Exported_Functions
00164   * @{
00165   */
00166 
00167 /** @addtogroup RCC_LL_EF_Init
00168   * @{
00169   */
00170 
00171 /**
00172   * @brief  Reset the RCC clock configuration to the default reset state.
00173   * @note   The default reset state of the clock configuration is given below:
00174   *         - HSI ON and used as system clock source
00175   *         - HSE and PLL OFF
00176   *         - AHB, APB1 and APB2 prescaler set to 1.
00177   *         - CSS, MCO OFF
00178   *         - All interrupts disabled
00179   * @note   This function doesn't modify the configuration of the
00180   *         - Peripheral clocks
00181   *         - LSI, LSE and RTC clocks
00182   * @retval An ErrorStatus enumeration value:
00183   *          - SUCCESS: RCC registers are de-initialized
00184   *          - ERROR: not applicable
00185   */
00186 ErrorStatus LL_RCC_DeInit(void)
00187 {
00188   __IO uint32_t vl_mask;
00189 
00190   /* Set HSION bit */
00191   LL_RCC_HSI_Enable();
00192 
00193   /* Wait for HSI READY bit */
00194   while(LL_RCC_HSI_IsReady() != 1U)
00195   {}
00196 
00197   /* Reset CFGR register */
00198   LL_RCC_WriteReg(CFGR, 0x00000000U);
00199 
00200   /* Read CR register */
00201   vl_mask = LL_RCC_ReadReg(CR);
00202 
00203   /* Reset HSEON, HSEBYP, PLLON, CSSON bits */
00204   CLEAR_BIT(vl_mask,
00205             (RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_PLLON | RCC_CR_CSSON));
00206 
00207 #if defined(RCC_PLLSAI_SUPPORT)
00208   /* Reset PLLSAION bit */
00209   CLEAR_BIT(vl_mask, RCC_CR_PLLSAION);
00210 #endif /* RCC_PLLSAI_SUPPORT */
00211 
00212 #if defined(RCC_PLLI2S_SUPPORT)
00213   /* Reset PLLI2SON bit */
00214   CLEAR_BIT(vl_mask, RCC_CR_PLLI2SON);
00215 #endif /* RCC_PLLI2S_SUPPORT */
00216 
00217   /* Write new value in CR register */
00218   LL_RCC_WriteReg(CR, vl_mask);
00219 
00220   /* Set HSITRIM bits to the reset value*/
00221   LL_RCC_HSI_SetCalibTrimming(0x10U);
00222 
00223   /* Wait for PLL READY bit to be reset */
00224   while(LL_RCC_PLL_IsReady() != 0U)
00225   {}
00226 
00227   /* Reset PLLCFGR register */
00228   LL_RCC_WriteReg(PLLCFGR, RCC_PLLCFGR_RST_VALUE);
00229 
00230 #if defined(RCC_PLLI2S_SUPPORT)
00231   /* Reset PLLI2SCFGR register */
00232   LL_RCC_WriteReg(PLLI2SCFGR, RCC_PLLI2SCFGR_RST_VALUE);
00233 #endif /* RCC_PLLI2S_SUPPORT */
00234 
00235 #if defined(RCC_PLLSAI_SUPPORT)
00236   /* Reset PLLSAICFGR register */
00237   LL_RCC_WriteReg(PLLSAICFGR, RCC_PLLSAICFGR_RST_VALUE);
00238 #endif /* RCC_PLLSAI_SUPPORT */
00239 
00240   /* Disable all interrupts */
00241   CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE | RCC_CIR_LSERDYIE | RCC_CIR_HSIRDYIE | RCC_CIR_HSERDYIE | RCC_CIR_PLLRDYIE);
00242 
00243 #if defined(RCC_CIR_PLLI2SRDYIE)
00244   CLEAR_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE);
00245 #endif /* RCC_CIR_PLLI2SRDYIE */
00246 
00247 #if defined(RCC_CIR_PLLSAIRDYIE)
00248   CLEAR_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE);
00249 #endif /* RCC_CIR_PLLSAIRDYIE */
00250 
00251   /* Clear all interrupt flags */
00252   SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC | RCC_CIR_LSERDYC | RCC_CIR_HSIRDYC | RCC_CIR_HSERDYC | RCC_CIR_PLLRDYC | RCC_CIR_CSSC);
00253 
00254 #if defined(RCC_CIR_PLLI2SRDYC)
00255   SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYC);
00256 #endif /* RCC_CIR_PLLI2SRDYC */
00257 
00258 #if defined(RCC_CIR_PLLSAIRDYC)
00259   SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYC);
00260 #endif /* RCC_CIR_PLLSAIRDYC */
00261 
00262   /* Clear LSION bit */
00263   CLEAR_BIT(RCC->CSR, RCC_CSR_LSION);
00264 
00265   /* Reset all CSR flags */
00266   SET_BIT(RCC->CSR, RCC_CSR_RMVF);
00267 
00268   return SUCCESS;
00269 }
00270 
00271 /**
00272   * @}
00273   */
00274 
00275 /** @addtogroup RCC_LL_EF_Get_Freq
00276   * @brief  Return the frequencies of different on chip clocks;  System, AHB, APB1 and APB2 buses clocks
00277   *         and different peripheral clocks available on the device.
00278   * @note   If SYSCLK source is HSI, function returns values based on HSI_VALUE(**)
00279   * @note   If SYSCLK source is HSE, function returns values based on HSE_VALUE(***)
00280   * @note   If SYSCLK source is PLL, function returns values based on HSE_VALUE(***)
00281   *         or HSI_VALUE(**) multiplied/divided by the PLL factors.
00282   * @note   (**) HSI_VALUE is a constant defined in this file (default value
00283   *              16 MHz) but the real value may vary depending on the variations
00284   *              in voltage and temperature.
00285   * @note   (***) HSE_VALUE is a constant defined in this file (default value
00286   *               25 MHz), user has to ensure that HSE_VALUE is same as the real
00287   *               frequency of the crystal used. Otherwise, this function may
00288   *               have wrong result.
00289   * @note   The result of this function could be incorrect when using fractional
00290   *         value for HSE crystal.
00291   * @note   This function can be used by the user application to compute the
00292   *         baud-rate for the communication peripherals or configure other parameters.
00293   * @{
00294   */
00295 
00296 /**
00297   * @brief  Return the frequencies of different on chip clocks;  System, AHB, APB1 and APB2 buses clocks
00298   * @note   Each time SYSCLK, HCLK, PCLK1 and/or PCLK2 clock changes, this function
00299   *         must be called to update structure fields. Otherwise, any
00300   *         configuration based on this function will be incorrect.
00301   * @param  RCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies
00302   * @retval None
00303   */
00304 void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks)
00305 {
00306   /* Get SYSCLK frequency */
00307   RCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq();
00308 
00309   /* HCLK clock frequency */
00310   RCC_Clocks->HCLK_Frequency   = RCC_GetHCLKClockFreq(RCC_Clocks->SYSCLK_Frequency);
00311 
00312   /* PCLK1 clock frequency */
00313   RCC_Clocks->PCLK1_Frequency  = RCC_GetPCLK1ClockFreq(RCC_Clocks->HCLK_Frequency);
00314 
00315   /* PCLK2 clock frequency */
00316   RCC_Clocks->PCLK2_Frequency  = RCC_GetPCLK2ClockFreq(RCC_Clocks->HCLK_Frequency);
00317 }
00318 
00319 #if defined(FMPI2C1)
00320 /**
00321   * @brief  Return FMPI2Cx clock frequency
00322   * @param  FMPI2CxSource This parameter can be one of the following values:
00323   *         @arg @ref LL_RCC_FMPI2C1_CLKSOURCE
00324   * @retval FMPI2C clock frequency (in Hz)
00325   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that HSI oscillator is not ready
00326   */
00327 uint32_t LL_RCC_GetFMPI2CClockFreq(uint32_t FMPI2CxSource)
00328 {
00329   uint32_t FMPI2C_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00330 
00331   /* Check parameter */
00332   assert_param(IS_LL_RCC_FMPI2C_CLKSOURCE(FMPI2CxSource));
00333 
00334   if (FMPI2CxSource == LL_RCC_FMPI2C1_CLKSOURCE)
00335   {
00336     /* FMPI2C1 CLK clock frequency */
00337     switch (LL_RCC_GetFMPI2CClockSource(FMPI2CxSource))
00338     {
00339       case LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK: /* FMPI2C1 Clock is System Clock */
00340         FMPI2C_frequency = RCC_GetSystemClockFreq();
00341         break;
00342 
00343       case LL_RCC_FMPI2C1_CLKSOURCE_HSI:    /* FMPI2C1 Clock is HSI Osc. */
00344         if (LL_RCC_HSI_IsReady())
00345         {
00346           FMPI2C_frequency = HSI_VALUE;
00347         }
00348         break;
00349 
00350       case LL_RCC_FMPI2C1_CLKSOURCE_PCLK1:  /* FMPI2C1 Clock is PCLK1 */
00351       default:
00352         FMPI2C_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
00353         break;
00354     }
00355   }
00356 
00357   return FMPI2C_frequency;
00358 }
00359 #endif /* FMPI2C1 */
00360 
00361 /**
00362   * @brief  Return I2Sx clock frequency
00363   * @param  I2SxSource This parameter can be one of the following values:
00364   *         @arg @ref LL_RCC_I2S1_CLKSOURCE
00365   *         @arg @ref LL_RCC_I2S2_CLKSOURCE (*)
00366   *
00367   *         (*) value not defined in all devices.
00368   * @retval I2S clock frequency (in Hz)
00369   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
00370   */
00371 uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource)
00372 {
00373   uint32_t i2s_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00374 
00375   /* Check parameter */
00376   assert_param(IS_LL_RCC_I2S_CLKSOURCE(I2SxSource));
00377 
00378   if (I2SxSource == LL_RCC_I2S1_CLKSOURCE)
00379   {
00380     /* I2S1 CLK clock frequency */
00381     switch (LL_RCC_GetI2SClockSource(I2SxSource))
00382     {
00383 #if defined(RCC_PLLI2S_SUPPORT)
00384       case LL_RCC_I2S1_CLKSOURCE_PLLI2S:       /* I2S1 Clock is PLLI2S */
00385         if (LL_RCC_PLLI2S_IsReady())
00386         {
00387           i2s_frequency = RCC_PLLI2S_GetFreqDomain_I2S();
00388         }
00389         break;
00390 #endif /* RCC_PLLI2S_SUPPORT */
00391 
00392 #if defined(RCC_DCKCFGR_I2SSRC) || defined(RCC_DCKCFGR_I2S1SRC)
00393       case LL_RCC_I2S1_CLKSOURCE_PLL:          /* I2S1 Clock is PLL */
00394         if (LL_RCC_PLL_IsReady())
00395         {
00396           i2s_frequency = RCC_PLL_GetFreqDomain_I2S();
00397         }
00398         break;
00399 
00400       case LL_RCC_I2S1_CLKSOURCE_PLLSRC:       /* I2S1 Clock is PLL Main source */
00401         switch (LL_RCC_PLL_GetMainSource())
00402         {
00403            case LL_RCC_PLLSOURCE_HSE:          /* I2S1 Clock is HSE Osc. */
00404              if (LL_RCC_HSE_IsReady())
00405              {
00406                i2s_frequency = HSE_VALUE;
00407              }
00408              break;
00409 
00410            case LL_RCC_PLLSOURCE_HSI:          /* I2S1 Clock is HSI Osc. */
00411            default:
00412              if (LL_RCC_HSI_IsReady())
00413              {
00414                i2s_frequency = HSI_VALUE;
00415              }
00416              break;
00417         }
00418         break;
00419 #endif /* RCC_DCKCFGR_I2SSRC || RCC_DCKCFGR_I2S1SRC */
00420 
00421       case LL_RCC_I2S1_CLKSOURCE_PIN:          /* I2S1 Clock is External clock */
00422       default:
00423         i2s_frequency = EXTERNAL_CLOCK_VALUE;
00424         break;
00425     }
00426   }
00427 #if defined(RCC_DCKCFGR_I2S2SRC)
00428   else
00429   {
00430     /* I2S2 CLK clock frequency */
00431     switch (LL_RCC_GetI2SClockSource(I2SxSource))
00432     {
00433       case LL_RCC_I2S2_CLKSOURCE_PLLI2S:       /* I2S2 Clock is PLLI2S */
00434         if (LL_RCC_PLLI2S_IsReady())
00435         {
00436           i2s_frequency = RCC_PLLI2S_GetFreqDomain_I2S();
00437         }
00438         break;
00439 
00440       case LL_RCC_I2S2_CLKSOURCE_PLL:          /* I2S2 Clock is PLL */
00441         if (LL_RCC_PLL_IsReady())
00442         {
00443           i2s_frequency = RCC_PLL_GetFreqDomain_I2S();
00444         }
00445         break;
00446 
00447       case LL_RCC_I2S2_CLKSOURCE_PLLSRC:       /* I2S2 Clock is PLL Main source */
00448         switch (LL_RCC_PLL_GetMainSource())
00449         {
00450            case LL_RCC_PLLSOURCE_HSE:          /* I2S2 Clock is HSE Osc. */
00451              if (LL_RCC_HSE_IsReady())
00452              {
00453                i2s_frequency = HSE_VALUE;
00454              }
00455              break;
00456 
00457            case LL_RCC_PLLSOURCE_HSI:          /* I2S2 Clock is HSI Osc. */
00458            default:
00459              if (LL_RCC_HSI_IsReady())
00460              {
00461                i2s_frequency = HSI_VALUE;
00462              }
00463              break;
00464         }
00465         break;
00466 
00467       case LL_RCC_I2S2_CLKSOURCE_PIN:          /* I2S2 Clock is External clock */
00468       default:
00469         i2s_frequency = EXTERNAL_CLOCK_VALUE;
00470         break;
00471     } 
00472   }
00473 #endif /* RCC_DCKCFGR_I2S2SRC */
00474 
00475   return i2s_frequency;
00476 }
00477 
00478 #if defined(LPTIM1)
00479 /**
00480   * @brief  Return LPTIMx clock frequency
00481   * @param  LPTIMxSource This parameter can be one of the following values:
00482   *         @arg @ref LL_RCC_LPTIM1_CLKSOURCE
00483   * @retval LPTIM clock frequency (in Hz)
00484   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI, LSI or LSE) is not ready
00485   */
00486 uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)
00487 {
00488   uint32_t lptim_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00489 
00490   /* Check parameter */
00491   assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource));
00492 
00493   if (LPTIMxSource == LL_RCC_LPTIM1_CLKSOURCE)
00494   {
00495     /* LPTIM1CLK clock frequency */
00496     switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
00497     {
00498       case LL_RCC_LPTIM1_CLKSOURCE_LSI:    /* LPTIM1 Clock is LSI Osc. */
00499         if (LL_RCC_LSI_IsReady())
00500         {
00501           lptim_frequency = LSI_VALUE;
00502         }
00503         break;
00504 
00505       case LL_RCC_LPTIM1_CLKSOURCE_HSI:    /* LPTIM1 Clock is HSI Osc. */
00506         if (LL_RCC_HSI_IsReady())
00507         {
00508           lptim_frequency = HSI_VALUE;
00509         }
00510         break;
00511 
00512       case LL_RCC_LPTIM1_CLKSOURCE_LSE:    /* LPTIM1 Clock is LSE Osc. */
00513         if (LL_RCC_LSE_IsReady())
00514         {
00515           lptim_frequency = LSE_VALUE;
00516         }
00517         break;
00518 
00519       case LL_RCC_LPTIM1_CLKSOURCE_PCLK1:  /* LPTIM1 Clock is PCLK1 */
00520       default:
00521         lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
00522         break;
00523     }
00524   }
00525 
00526   return lptim_frequency;
00527 }
00528 #endif /* LPTIM1 */
00529 
00530 #if defined(SAI1)
00531 /**
00532   * @brief  Return SAIx clock frequency
00533   * @param  SAIxSource This parameter can be one of the following values:
00534   *         @arg @ref LL_RCC_SAI1_CLKSOURCE (*)
00535   *         @arg @ref LL_RCC_SAI2_CLKSOURCE (*)
00536   *         @arg @ref LL_RCC_SAI1_A_CLKSOURCE (*)
00537   *         @arg @ref LL_RCC_SAI1_B_CLKSOURCE (*)
00538   *
00539   *         (*) value not defined in all devices.
00540   * @retval SAI clock frequency (in Hz)
00541   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
00542   */
00543 uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource)
00544 {
00545   uint32_t sai_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00546 
00547   /* Check parameter */
00548   assert_param(IS_LL_RCC_SAI_CLKSOURCE(SAIxSource));
00549 
00550 #if defined(RCC_DCKCFGR_SAI1SRC)
00551   if ((SAIxSource == LL_RCC_SAI1_CLKSOURCE) || (SAIxSource == LL_RCC_SAI2_CLKSOURCE))
00552   {
00553     /* SAI1CLK clock frequency */
00554     switch (LL_RCC_GetSAIClockSource(SAIxSource))
00555     {
00556       case LL_RCC_SAI1_CLKSOURCE_PLLSAI:     /* PLLSAI clock used as SAI1 clock source */
00557       case LL_RCC_SAI2_CLKSOURCE_PLLSAI:     /* PLLSAI clock used as SAI2 clock source */
00558         if (LL_RCC_PLLSAI_IsReady())
00559         {
00560           sai_frequency = RCC_PLLSAI_GetFreqDomain_SAI();
00561         }
00562         break;
00563 
00564       case LL_RCC_SAI1_CLKSOURCE_PLLI2S:     /* PLLI2S clock used as SAI1 clock source */
00565       case LL_RCC_SAI2_CLKSOURCE_PLLI2S:     /* PLLI2S clock used as SAI2 clock source */
00566         if (LL_RCC_PLLI2S_IsReady())
00567         {
00568           sai_frequency = RCC_PLLI2S_GetFreqDomain_SAI();
00569         }
00570         break;
00571 
00572       case LL_RCC_SAI1_CLKSOURCE_PLL:        /* PLL clock used as SAI1 clock source */
00573       case LL_RCC_SAI2_CLKSOURCE_PLL:        /* PLL clock used as SAI2 clock source */
00574         if (LL_RCC_PLL_IsReady())
00575         {
00576           sai_frequency = RCC_PLL_GetFreqDomain_SAI();
00577         }
00578         break;
00579 
00580       case LL_RCC_SAI2_CLKSOURCE_PLLSRC:
00581         switch (LL_RCC_PLL_GetMainSource())
00582         {
00583            case LL_RCC_PLLSOURCE_HSE:        /* HSE clock used as SAI2 clock source */
00584              if (LL_RCC_HSE_IsReady())
00585              {
00586                sai_frequency = HSE_VALUE;
00587              }
00588              break;
00589 
00590            case LL_RCC_PLLSOURCE_HSI:        /* HSI clock used as SAI2 clock source */
00591            default:
00592              if (LL_RCC_HSI_IsReady())
00593              {
00594                sai_frequency = HSI_VALUE;
00595              }
00596              break;
00597         }
00598         break;
00599 
00600       case LL_RCC_SAI1_CLKSOURCE_PIN:        /* External input clock used as SAI1 clock source */
00601       default:
00602         sai_frequency = EXTERNAL_CLOCK_VALUE;
00603         break;
00604     }
00605   }
00606 #endif /* RCC_DCKCFGR_SAI1SRC */
00607 #if defined(RCC_DCKCFGR_SAI1ASRC)
00608   if ((SAIxSource == LL_RCC_SAI1_A_CLKSOURCE) || (SAIxSource == LL_RCC_SAI1_B_CLKSOURCE))
00609   {
00610     /* SAI1CLK clock frequency */
00611     switch (LL_RCC_GetSAIClockSource(SAIxSource))
00612     {
00613 #if defined(RCC_PLLSAI_SUPPORT)
00614       case LL_RCC_SAI1_A_CLKSOURCE_PLLSAI:     /* PLLSAI clock used as SAI1 Block A clock source */
00615       case LL_RCC_SAI1_B_CLKSOURCE_PLLSAI:     /* PLLSAI clock used as SAI1 Block B clock source */
00616         if (LL_RCC_PLLSAI_IsReady())
00617         {
00618           sai_frequency = RCC_PLLSAI_GetFreqDomain_SAI();
00619         }
00620         break;
00621 #endif /* RCC_PLLSAI_SUPPORT */
00622 
00623       case LL_RCC_SAI1_A_CLKSOURCE_PLLI2S:     /* PLLI2S clock used as SAI1 Block A clock source */
00624       case LL_RCC_SAI1_B_CLKSOURCE_PLLI2S:     /* PLLI2S clock used as SAI1 Block B clock source */
00625         if (LL_RCC_PLLI2S_IsReady())
00626         {
00627           sai_frequency = RCC_PLLI2S_GetFreqDomain_SAI();
00628         }
00629         break;
00630 
00631 #if defined(RCC_SAI1A_PLLSOURCE_SUPPORT)
00632       case LL_RCC_SAI1_A_CLKSOURCE_PLL:        /* PLL clock used as SAI1 Block A clock source */
00633       case LL_RCC_SAI1_B_CLKSOURCE_PLL:        /* PLL clock used as SAI1 Block B clock source */
00634         if (LL_RCC_PLL_IsReady())
00635         {
00636           sai_frequency = RCC_PLL_GetFreqDomain_SAI();
00637         }
00638         break;
00639 
00640       case LL_RCC_SAI1_A_CLKSOURCE_PLLSRC:
00641       case LL_RCC_SAI1_B_CLKSOURCE_PLLSRC:
00642         switch (LL_RCC_PLL_GetMainSource())
00643         {
00644            case LL_RCC_PLLSOURCE_HSE:          /* HSE clock used as SAI1 Block A or B clock source */
00645              if (LL_RCC_HSE_IsReady())
00646              {
00647                sai_frequency = HSE_VALUE;
00648              }
00649              break;
00650 
00651            case LL_RCC_PLLSOURCE_HSI:          /* HSI clock used as SAI1 Block A or B clock source */
00652            default:
00653              if (LL_RCC_HSI_IsReady())
00654              {
00655                sai_frequency = HSI_VALUE;
00656              }
00657              break;
00658         }
00659         break;
00660 #endif /* RCC_SAI1A_PLLSOURCE_SUPPORT */
00661 
00662       case LL_RCC_SAI1_A_CLKSOURCE_PIN:        /* External input clock used as SAI1 Block A clock source */
00663       case LL_RCC_SAI1_B_CLKSOURCE_PIN:        /* External input clock used as SAI1 Block B clock source */
00664       default:
00665         sai_frequency = EXTERNAL_CLOCK_VALUE;
00666         break;
00667     }
00668   }
00669 #endif /* RCC_DCKCFGR_SAI1ASRC */
00670 
00671   return sai_frequency;
00672 }
00673 #endif /* SAI1 */
00674 
00675 #if defined(SDIO)
00676 /**
00677   * @brief  Return SDIOx clock frequency
00678   * @param  SDIOxSource This parameter can be one of the following values:
00679   *         @arg @ref LL_RCC_SDIO_CLKSOURCE
00680   * @retval SDIO clock frequency (in Hz)
00681   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
00682   */
00683 uint32_t LL_RCC_GetSDIOClockFreq(uint32_t SDIOxSource)
00684 {
00685   uint32_t SDIO_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00686 
00687   /* Check parameter */
00688   assert_param(IS_LL_RCC_SDIO_CLKSOURCE(SDIOxSource));
00689 
00690   if (SDIOxSource == LL_RCC_SDIO_CLKSOURCE)
00691   {
00692 #if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL)
00693     /* SDIOCLK clock frequency */
00694     switch (LL_RCC_GetSDIOClockSource(SDIOxSource))
00695     {
00696       case LL_RCC_SDIO_CLKSOURCE_PLL48CLK:         /* PLL48M clock used as SDIO clock source */
00697         switch (LL_RCC_GetCK48MClockSource(LL_RCC_CK48M_CLKSOURCE))
00698         {
00699           case LL_RCC_CK48M_CLKSOURCE_PLL:         /* PLL clock used as 48Mhz domain clock */
00700             if (LL_RCC_PLL_IsReady())
00701             {
00702               SDIO_frequency = RCC_PLL_GetFreqDomain_48M();
00703             }
00704           break;
00705 
00706 #if defined(RCC_PLLSAI_SUPPORT)
00707           case LL_RCC_CK48M_CLKSOURCE_PLLSAI:      /* PLLSAI clock used as 48Mhz domain clock */
00708           default:
00709             if (LL_RCC_PLLSAI_IsReady())
00710             {
00711               SDIO_frequency = RCC_PLLSAI_GetFreqDomain_48M();
00712             }
00713             break;
00714 #endif /* RCC_PLLSAI_SUPPORT */
00715 
00716 #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
00717           case LL_RCC_CK48M_CLKSOURCE_PLLI2S:      /* PLLI2S clock used as 48Mhz domain clock */
00718           default:
00719             if (LL_RCC_PLLI2S_IsReady())
00720             {
00721               SDIO_frequency = RCC_PLLI2S_GetFreqDomain_48M();
00722             }
00723             break;
00724 #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
00725         }
00726         break;
00727 
00728       case LL_RCC_SDIO_CLKSOURCE_SYSCLK:           /* PLL clock used as SDIO clock source */
00729       default:
00730       SDIO_frequency = RCC_GetSystemClockFreq();
00731       break;
00732     }
00733 #else
00734     /* PLL clock used as 48Mhz domain clock */
00735     if (LL_RCC_PLL_IsReady())
00736     {
00737       SDIO_frequency = RCC_PLL_GetFreqDomain_48M();
00738     }
00739 #endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */
00740   }
00741 
00742   return SDIO_frequency;
00743 }
00744 #endif /* SDIO */
00745 
00746 #if defined(RNG)
00747 /**
00748   * @brief  Return RNGx clock frequency
00749   * @param  RNGxSource This parameter can be one of the following values:
00750   *         @arg @ref LL_RCC_RNG_CLKSOURCE
00751   * @retval RNG clock frequency (in Hz)
00752   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
00753   */
00754 uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource)
00755 {
00756   uint32_t rng_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00757 
00758   /* Check parameter */
00759   assert_param(IS_LL_RCC_RNG_CLKSOURCE(RNGxSource));
00760 
00761 #if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL)
00762   /* RNGCLK clock frequency */
00763   switch (LL_RCC_GetRNGClockSource(RNGxSource))
00764   {
00765 #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
00766     case LL_RCC_RNG_CLKSOURCE_PLLI2S:        /* PLLI2S clock used as RNG clock source */
00767       if (LL_RCC_PLLI2S_IsReady())
00768       {
00769         rng_frequency = RCC_PLLI2S_GetFreqDomain_48M();
00770       }
00771       break;
00772 #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
00773 
00774 #if defined(RCC_PLLSAI_SUPPORT)
00775     case LL_RCC_RNG_CLKSOURCE_PLLSAI:        /* PLLSAI clock used as RNG clock source */
00776       if (LL_RCC_PLLSAI_IsReady())
00777       {
00778         rng_frequency = RCC_PLLSAI_GetFreqDomain_48M();
00779       }
00780       break;
00781 #endif /* RCC_PLLSAI_SUPPORT */
00782 
00783     case LL_RCC_RNG_CLKSOURCE_PLL:           /* PLL clock used as RNG clock source */
00784     default:
00785       if (LL_RCC_PLL_IsReady())
00786       {
00787         rng_frequency = RCC_PLL_GetFreqDomain_48M();
00788       }
00789       break;
00790   }
00791 #else
00792   /* PLL clock used as RNG clock source */
00793   if (LL_RCC_PLL_IsReady())
00794   {
00795     rng_frequency = RCC_PLL_GetFreqDomain_48M();
00796   }
00797 #endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */
00798 
00799   return rng_frequency;
00800 }
00801 #endif /* RNG */
00802 
00803 #if defined(CEC)
00804 /**
00805   * @brief  Return CEC clock frequency
00806   * @param  CECxSource This parameter can be one of the following values:
00807   *         @arg @ref LL_RCC_CEC_CLKSOURCE
00808   * @retval CEC clock frequency (in Hz)
00809   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
00810   */
00811 uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource)
00812 {
00813   uint32_t cec_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00814 
00815   /* Check parameter */
00816   assert_param(IS_LL_RCC_CEC_CLKSOURCE(CECxSource));
00817 
00818   /* CECCLK clock frequency */
00819   switch (LL_RCC_GetCECClockSource(CECxSource))
00820   {
00821     case LL_RCC_CEC_CLKSOURCE_LSE:           /* CEC Clock is LSE Osc. */
00822       if (LL_RCC_LSE_IsReady())
00823       {
00824         cec_frequency = LSE_VALUE;
00825       }
00826       break;
00827 
00828     case LL_RCC_CEC_CLKSOURCE_HSI_DIV488:    /* CEC Clock is HSI Osc. */
00829     default:
00830       if (LL_RCC_HSI_IsReady())
00831       {
00832         cec_frequency = HSI_VALUE/488U;
00833       }
00834       break;
00835   }
00836 
00837   return cec_frequency;
00838 }
00839 #endif /* CEC */
00840 
00841 #if defined(USB_OTG_FS) || defined(USB_OTG_HS)
00842 /**
00843   * @brief  Return USBx clock frequency
00844   * @param  USBxSource This parameter can be one of the following values:
00845   *         @arg @ref LL_RCC_USB_CLKSOURCE
00846   * @retval USB clock frequency (in Hz)
00847   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
00848   */
00849 uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource)
00850 {
00851   uint32_t usb_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00852 
00853   /* Check parameter */
00854   assert_param(IS_LL_RCC_USB_CLKSOURCE(USBxSource));
00855 
00856 #if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL)
00857   /* USBCLK clock frequency */
00858   switch (LL_RCC_GetUSBClockSource(USBxSource))
00859   {
00860 #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
00861     case LL_RCC_USB_CLKSOURCE_PLLI2S:       /* PLLI2S clock used as USB clock source */
00862       if (LL_RCC_PLLI2S_IsReady())
00863       {
00864         usb_frequency = RCC_PLLI2S_GetFreqDomain_48M();
00865       }
00866       break;
00867 
00868 #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
00869 
00870 #if defined(RCC_PLLSAI_SUPPORT)
00871     case LL_RCC_USB_CLKSOURCE_PLLSAI:       /* PLLSAI clock used as USB clock source */
00872       if (LL_RCC_PLLSAI_IsReady())
00873       {
00874         usb_frequency = RCC_PLLSAI_GetFreqDomain_48M();
00875       }
00876       break;
00877 #endif /* RCC_PLLSAI_SUPPORT */
00878 
00879     case LL_RCC_USB_CLKSOURCE_PLL:          /* PLL clock used as USB clock source */
00880     default:
00881       if (LL_RCC_PLL_IsReady())
00882       {
00883         usb_frequency = RCC_PLL_GetFreqDomain_48M();
00884       }
00885       break;
00886   }
00887 #else
00888   /* PLL clock used as USB clock source */
00889   if (LL_RCC_PLL_IsReady())
00890   {
00891     usb_frequency = RCC_PLL_GetFreqDomain_48M();
00892   }
00893 #endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */
00894 
00895   return usb_frequency;
00896 }
00897 #endif /* USB_OTG_FS || USB_OTG_HS */
00898 
00899 #if defined(DFSDM1_Channel0)
00900 /**
00901   * @brief  Return DFSDMx clock frequency
00902   * @param  DFSDMxSource This parameter can be one of the following values:
00903   *         @arg @ref LL_RCC_DFSDM1_CLKSOURCE
00904   *         @arg @ref LL_RCC_DFSDM2_CLKSOURCE (*)
00905   *
00906   *         (*) value not defined in all devices.
00907   * @retval DFSDM clock frequency (in Hz)
00908   */
00909 uint32_t LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource)
00910 {
00911   uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00912 
00913   /* Check parameter */
00914   assert_param(IS_LL_RCC_DFSDM_CLKSOURCE(DFSDMxSource));
00915 
00916   if (DFSDMxSource == LL_RCC_DFSDM1_CLKSOURCE)
00917   {
00918     /* DFSDM1CLK clock frequency */
00919     switch (LL_RCC_GetDFSDMClockSource(DFSDMxSource))
00920     {
00921       case LL_RCC_DFSDM1_CLKSOURCE_SYSCLK:      /* DFSDM1 Clock is SYSCLK */
00922         dfsdm_frequency = RCC_GetSystemClockFreq();
00923         break;
00924 
00925       case LL_RCC_DFSDM1_CLKSOURCE_PCLK2:       /* DFSDM1 Clock is PCLK2 */
00926       default:
00927         dfsdm_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
00928         break;
00929     }
00930   }
00931 #if defined(DFSDM2_Channel0)
00932   else
00933   {
00934     /* DFSDM2CLK clock frequency */
00935     switch (LL_RCC_GetDFSDMClockSource(DFSDMxSource))
00936     {
00937       case LL_RCC_DFSDM2_CLKSOURCE_SYSCLK:      /* DFSDM2 Clock is SYSCLK */
00938         dfsdm_frequency = RCC_GetSystemClockFreq();
00939         break;
00940 
00941       case LL_RCC_DFSDM2_CLKSOURCE_PCLK2:       /* DFSDM2 Clock is PCLK2 */
00942       default:
00943         dfsdm_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
00944         break;
00945     }
00946   }
00947 #endif /* DFSDM2_Channel0 */
00948 
00949   return dfsdm_frequency;
00950 }
00951 
00952 /**
00953   * @brief  Return DFSDMx Audio clock frequency
00954   * @param  DFSDMxSource This parameter can be one of the following values:
00955   *         @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE
00956   *         @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE (*)
00957   *
00958   *         (*) value not defined in all devices.
00959   * @retval DFSDM clock frequency (in Hz)
00960   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
00961   */
00962 uint32_t LL_RCC_GetDFSDMAudioClockFreq(uint32_t DFSDMxSource)
00963 {
00964   uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00965 
00966   /* Check parameter */
00967   assert_param(IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(DFSDMxSource));
00968 
00969   if (DFSDMxSource == LL_RCC_DFSDM1_AUDIO_CLKSOURCE)
00970   {
00971     /* DFSDM1CLK clock frequency */
00972     switch (LL_RCC_GetDFSDMAudioClockSource(DFSDMxSource))
00973     {
00974       case LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1:     /* I2S1 clock used as DFSDM1 clock */
00975         dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S1_CLKSOURCE);
00976         break;
00977 
00978       case LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2:     /* I2S2 clock used as DFSDM1 clock */
00979       default:
00980         dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S2_CLKSOURCE);
00981         break;
00982     }
00983   }
00984 #if defined(DFSDM2_Channel0)
00985   else
00986   {
00987     /* DFSDM2CLK clock frequency */
00988     switch (LL_RCC_GetDFSDMAudioClockSource(DFSDMxSource))
00989     {
00990       case LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1:     /* I2S1 clock used as DFSDM2 clock */
00991         dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S1_CLKSOURCE);
00992         break;
00993 
00994       case LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2:     /* I2S2 clock used as DFSDM2 clock */
00995       default:
00996         dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S2_CLKSOURCE);
00997         break;
00998     }
00999   }
01000 #endif /* DFSDM2_Channel0 */
01001 
01002   return dfsdm_frequency;
01003 }
01004 #endif /* DFSDM1_Channel0 */
01005 
01006 #if defined(DSI)
01007 /**
01008   * @brief  Return DSI clock frequency
01009   * @param  DSIxSource This parameter can be one of the following values:
01010   *         @arg @ref LL_RCC_DSI_CLKSOURCE
01011   * @retval DSI clock frequency (in Hz)
01012   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
01013   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NA indicates that external clock is used
01014   */
01015 uint32_t LL_RCC_GetDSIClockFreq(uint32_t DSIxSource)
01016 {
01017   uint32_t dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01018 
01019   /* Check parameter */
01020   assert_param(IS_LL_RCC_DSI_CLKSOURCE(DSIxSource));
01021 
01022   /* DSICLK clock frequency */
01023   switch (LL_RCC_GetDSIClockSource(DSIxSource))
01024   {
01025     case LL_RCC_DSI_CLKSOURCE_PLL:     /* DSI Clock is PLL Osc. */
01026       if (LL_RCC_PLL_IsReady())
01027       {
01028         dsi_frequency = RCC_PLL_GetFreqDomain_DSI();
01029       }
01030       break;
01031 
01032     case LL_RCC_DSI_CLKSOURCE_PHY:    /* DSI Clock is DSI physical clock. */
01033     default:
01034       dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
01035       break;
01036   }
01037 
01038   return dsi_frequency;
01039 }
01040 #endif /* DSI */
01041 
01042 #if defined(LTDC)
01043 /**
01044   * @brief  Return LTDC clock frequency
01045   * @param  LTDCxSource This parameter can be one of the following values:
01046   *         @arg @ref LL_RCC_LTDC_CLKSOURCE
01047   * @retval LTDC clock frequency (in Hz)
01048   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator PLLSAI is not ready
01049   */
01050 uint32_t LL_RCC_GetLTDCClockFreq(uint32_t LTDCxSource)
01051 {
01052   uint32_t ltdc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01053 
01054   /* Check parameter */
01055   assert_param(IS_LL_RCC_LTDC_CLKSOURCE(LTDCxSource));
01056 
01057   if (LL_RCC_PLLSAI_IsReady())
01058   {
01059      ltdc_frequency = RCC_PLLSAI_GetFreqDomain_LTDC();
01060   }
01061 
01062   return ltdc_frequency;
01063 }
01064 #endif /* LTDC */
01065 
01066 #if defined(SPDIFRX)
01067 /**
01068   * @brief  Return SPDIFRX clock frequency
01069   * @param  SPDIFRXxSource This parameter can be one of the following values:
01070   *         @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE
01071   * @retval SPDIFRX clock frequency (in Hz)
01072   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
01073   */
01074 uint32_t LL_RCC_GetSPDIFRXClockFreq(uint32_t SPDIFRXxSource)
01075 {
01076   uint32_t spdifrx_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01077 
01078   /* Check parameter */
01079   assert_param(IS_LL_RCC_SPDIFRX_CLKSOURCE(SPDIFRXxSource));
01080 
01081   /* SPDIFRX1CLK clock frequency */
01082   switch (LL_RCC_GetSPDIFRXClockSource(SPDIFRXxSource))
01083   {
01084     case LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S:  /* SPDIFRX Clock is PLLI2S Osc. */
01085       if (LL_RCC_PLLI2S_IsReady())
01086       {
01087         spdifrx_frequency = RCC_PLLI2S_GetFreqDomain_SPDIFRX();
01088       }
01089       break;
01090 
01091     case LL_RCC_SPDIFRX1_CLKSOURCE_PLL:     /* SPDIFRX Clock is PLL Osc. */
01092     default:
01093       if (LL_RCC_PLL_IsReady())
01094       {
01095         spdifrx_frequency = RCC_PLL_GetFreqDomain_SPDIFRX();
01096       }
01097       break;
01098   }
01099 
01100   return spdifrx_frequency;
01101 }
01102 #endif /* SPDIFRX */
01103 
01104 /**
01105   * @}
01106   */
01107 
01108 /**
01109   * @}
01110   */
01111 
01112 /** @addtogroup RCC_LL_Private_Functions
01113   * @{
01114   */
01115 
01116 /**
01117   * @brief  Return SYSTEM clock frequency
01118   * @retval SYSTEM clock frequency (in Hz)
01119   */
01120 uint32_t RCC_GetSystemClockFreq(void)
01121 {
01122   uint32_t frequency = 0U;
01123 
01124   /* Get SYSCLK source -------------------------------------------------------*/
01125   switch (LL_RCC_GetSysClkSource())
01126   {
01127     case LL_RCC_SYS_CLKSOURCE_STATUS_HSI:  /* HSI used as system clock  source */
01128       frequency = HSI_VALUE;
01129       break;
01130 
01131     case LL_RCC_SYS_CLKSOURCE_STATUS_HSE:  /* HSE used as system clock  source */
01132       frequency = HSE_VALUE;
01133       break;
01134 
01135     case LL_RCC_SYS_CLKSOURCE_STATUS_PLL:  /* PLL used as system clock  source */
01136       frequency = RCC_PLL_GetFreqDomain_SYS(LL_RCC_SYS_CLKSOURCE_STATUS_PLL);
01137       break;
01138 
01139 #if defined(RCC_PLLR_SYSCLK_SUPPORT)
01140     case LL_RCC_SYS_CLKSOURCE_STATUS_PLLR: /* PLLR used as system clock  source */
01141       frequency = RCC_PLL_GetFreqDomain_SYS(LL_RCC_SYS_CLKSOURCE_STATUS_PLLR);
01142       break;
01143 #endif /* RCC_PLLR_SYSCLK_SUPPORT */
01144 
01145     default:
01146       frequency = HSI_VALUE;
01147       break;
01148   }
01149 
01150   return frequency;
01151 }
01152 
01153 /**
01154   * @brief  Return HCLK clock frequency
01155   * @param  SYSCLK_Frequency SYSCLK clock frequency
01156   * @retval HCLK clock frequency (in Hz)
01157   */
01158 uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)
01159 {
01160   /* HCLK clock frequency */
01161   return __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler());
01162 }
01163 
01164 /**
01165   * @brief  Return PCLK1 clock frequency
01166   * @param  HCLK_Frequency HCLK clock frequency
01167   * @retval PCLK1 clock frequency (in Hz)
01168   */
01169 uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)
01170 {
01171   /* PCLK1 clock frequency */
01172   return __LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler());
01173 }
01174 
01175 /**
01176   * @brief  Return PCLK2 clock frequency
01177   * @param  HCLK_Frequency HCLK clock frequency
01178   * @retval PCLK2 clock frequency (in Hz)
01179   */
01180 uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency)
01181 {
01182   /* PCLK2 clock frequency */
01183   return __LL_RCC_CALC_PCLK2_FREQ(HCLK_Frequency, LL_RCC_GetAPB2Prescaler());
01184 }
01185 
01186 /**
01187   * @brief  Return PLL clock frequency used for system domain
01188   * @param  SYSCLK_Source System clock source
01189   * @retval PLL clock frequency (in Hz)
01190   */
01191 uint32_t RCC_PLL_GetFreqDomain_SYS(uint32_t SYSCLK_Source)
01192 {
01193   uint32_t pllinputfreq = 0U, pllsource = 0U, plloutputfreq = 0U;
01194 
01195   /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
01196      SYSCLK = PLL_VCO / (PLLP or PLLR)
01197   */
01198   pllsource = LL_RCC_PLL_GetMainSource();
01199 
01200   switch (pllsource)
01201   {
01202     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
01203       pllinputfreq = HSI_VALUE;
01204       break;
01205 
01206     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
01207       pllinputfreq = HSE_VALUE;
01208       break;
01209 
01210     default:
01211       pllinputfreq = HSI_VALUE;
01212       break;
01213   }
01214 
01215   if (SYSCLK_Source == LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
01216   {
01217     plloutputfreq = __LL_RCC_CALC_PLLCLK_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
01218                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetP());
01219   }
01220 #if defined(RCC_PLLR_SYSCLK_SUPPORT)
01221   else
01222   {
01223     plloutputfreq = __LL_RCC_CALC_PLLRCLK_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
01224                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
01225   }
01226 #endif /* RCC_PLLR_SYSCLK_SUPPORT */
01227 
01228   return plloutputfreq;
01229 }
01230 
01231 /**
01232   * @brief  Return PLL clock frequency used for 48 MHz domain
01233   * @retval PLL clock frequency (in Hz)
01234   */
01235 uint32_t RCC_PLL_GetFreqDomain_48M(void)
01236 {
01237   uint32_t pllinputfreq = 0U, pllsource = 0U;
01238 
01239   /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM ) * PLLN
01240      48M Domain clock = PLL_VCO / PLLQ
01241   */
01242   pllsource = LL_RCC_PLL_GetMainSource();
01243 
01244   switch (pllsource)
01245   {
01246     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
01247       pllinputfreq = HSI_VALUE;
01248       break;
01249 
01250     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
01251       pllinputfreq = HSE_VALUE;
01252       break;
01253 
01254     default:
01255       pllinputfreq = HSI_VALUE;
01256       break;
01257   }
01258   return __LL_RCC_CALC_PLLCLK_48M_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
01259                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ());
01260 }
01261 
01262 #if defined(DSI)
01263 /**
01264   * @brief  Return PLL clock frequency used for DSI clock
01265   * @retval PLL clock frequency (in Hz)
01266   */
01267 uint32_t RCC_PLL_GetFreqDomain_DSI(void)
01268 {
01269   uint32_t pllinputfreq = 0U, pllsource = 0U;
01270 
01271   /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
01272      DSICLK = PLL_VCO / PLLR
01273   */
01274   pllsource = LL_RCC_PLL_GetMainSource();
01275 
01276   switch (pllsource)
01277   {
01278     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
01279       pllinputfreq = HSE_VALUE;
01280       break;
01281 
01282     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
01283     default:
01284       pllinputfreq = HSI_VALUE;
01285       break;
01286   }
01287   return __LL_RCC_CALC_PLLCLK_DSI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
01288                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
01289 }
01290 #endif /* DSI */
01291 
01292 #if defined(RCC_DCKCFGR_I2SSRC) || defined(RCC_DCKCFGR_I2S1SRC)
01293 /**
01294   * @brief  Return PLL clock frequency used for I2S clock
01295   * @retval PLL clock frequency (in Hz)
01296   */
01297 uint32_t RCC_PLL_GetFreqDomain_I2S(void)
01298 {
01299   uint32_t pllinputfreq = 0U, pllsource = 0U;
01300 
01301   /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
01302      I2SCLK = PLL_VCO / PLLR
01303   */
01304   pllsource = LL_RCC_PLL_GetMainSource();
01305 
01306   switch (pllsource)
01307   {
01308     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
01309       pllinputfreq = HSE_VALUE;
01310       break;
01311 
01312     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
01313     default:
01314       pllinputfreq = HSI_VALUE;
01315       break;
01316   }
01317   return __LL_RCC_CALC_PLLCLK_I2S_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
01318                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
01319 }
01320 #endif /* RCC_DCKCFGR_I2SSRC || RCC_DCKCFGR_I2S1SRC */
01321 
01322 #if defined(SPDIFRX)
01323 /**
01324   * @brief  Return PLL clock frequency used for SPDIFRX clock
01325   * @retval PLL clock frequency (in Hz)
01326   */
01327 uint32_t RCC_PLL_GetFreqDomain_SPDIFRX(void)
01328 {
01329   uint32_t pllinputfreq = 0U, pllsource = 0U;
01330 
01331   /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
01332      SPDIFRXCLK = PLL_VCO / PLLR
01333   */
01334   pllsource = LL_RCC_PLL_GetMainSource();
01335 
01336   switch (pllsource)
01337   {
01338     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
01339       pllinputfreq = HSE_VALUE;
01340       break;
01341 
01342     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
01343     default:
01344       pllinputfreq = HSI_VALUE;
01345       break;
01346   }
01347   return __LL_RCC_CALC_PLLCLK_SPDIFRX_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
01348                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
01349 }
01350 #endif /* SPDIFRX */
01351 
01352 #if defined(RCC_PLLCFGR_PLLR)
01353 #if defined(SAI1)
01354 /**
01355   * @brief  Return PLL clock frequency used for SAI clock
01356   * @retval PLL clock frequency (in Hz)
01357   */
01358 uint32_t RCC_PLL_GetFreqDomain_SAI(void)
01359 {
01360   uint32_t pllinputfreq = 0U, pllsource = 0U, plloutputfreq = 0U;
01361 
01362   /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
01363      SAICLK = (PLL_VCO / PLLR) / PLLDIVR
01364      or
01365      SAICLK = PLL_VCO / PLLR
01366   */
01367   pllsource = LL_RCC_PLL_GetMainSource();
01368 
01369   switch (pllsource)
01370   {
01371     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
01372       pllinputfreq = HSE_VALUE;
01373       break;
01374 
01375     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
01376     default:
01377       pllinputfreq = HSI_VALUE;
01378       break;
01379   }
01380 
01381 #if defined(RCC_DCKCFGR_PLLDIVR)
01382   plloutputfreq = __LL_RCC_CALC_PLLCLK_SAI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
01383                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR(), LL_RCC_PLL_GetDIVR());
01384 #else
01385   plloutputfreq = __LL_RCC_CALC_PLLCLK_SAI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
01386                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
01387 #endif /* RCC_DCKCFGR_PLLDIVR */
01388 
01389   return plloutputfreq;
01390 }
01391 #endif /* SAI1 */
01392 #endif /* RCC_PLLCFGR_PLLR */
01393 
01394 #if defined(RCC_PLLSAI_SUPPORT)
01395 /**
01396   * @brief  Return PLLSAI clock frequency used for SAI domain
01397   * @retval PLLSAI clock frequency (in Hz)
01398   */
01399 uint32_t RCC_PLLSAI_GetFreqDomain_SAI(void)
01400 {
01401   uint32_t pllinputfreq = 0U, pllsource = 0U;
01402 
01403   /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLSAIM) * PLLSAIN
01404      SAI domain clock  = (PLLSAI_VCO / PLLSAIQ) / PLLSAIDIVQ
01405   */
01406   pllsource = LL_RCC_PLL_GetMainSource();
01407 
01408   switch (pllsource)
01409   {
01410     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLLSAI clock source */
01411       pllinputfreq = HSI_VALUE;
01412       break;
01413 
01414     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLLSAI clock source */
01415       pllinputfreq = HSE_VALUE;
01416       break;
01417 
01418     default:
01419       pllinputfreq = HSI_VALUE;
01420       break;
01421   }
01422   return __LL_RCC_CALC_PLLSAI_SAI_FREQ(pllinputfreq, LL_RCC_PLLSAI_GetDivider(),
01423                                         LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetQ(), LL_RCC_PLLSAI_GetDIVQ());
01424 }
01425 
01426 #if defined(RCC_PLLSAICFGR_PLLSAIP)
01427 /**
01428   * @brief  Return PLLSAI clock frequency used for 48Mhz domain
01429   * @retval PLLSAI clock frequency (in Hz)
01430   */
01431 uint32_t RCC_PLLSAI_GetFreqDomain_48M(void)
01432 {
01433   uint32_t pllinputfreq = 0U, pllsource = 0U;
01434 
01435   /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLSAIM) * PLLSAIN
01436      48M Domain clock  = PLLSAI_VCO / PLLSAIP
01437   */
01438   pllsource = LL_RCC_PLL_GetMainSource();
01439 
01440   switch (pllsource)
01441   {
01442     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLLSAI clock source */
01443       pllinputfreq = HSI_VALUE;
01444       break;
01445 
01446     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLLSAI clock source */
01447       pllinputfreq = HSE_VALUE;
01448       break;
01449 
01450     default:
01451       pllinputfreq = HSI_VALUE;
01452       break;
01453   }
01454   return __LL_RCC_CALC_PLLSAI_48M_FREQ(pllinputfreq, LL_RCC_PLLSAI_GetDivider(),
01455                                         LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetP());
01456 }
01457 #endif /* RCC_PLLSAICFGR_PLLSAIP */
01458 
01459 #if defined(LTDC)
01460 /**
01461   * @brief  Return PLLSAI clock frequency used for LTDC domain
01462   * @retval PLLSAI clock frequency (in Hz)
01463   */
01464 uint32_t RCC_PLLSAI_GetFreqDomain_LTDC(void)
01465 {
01466   uint32_t pllinputfreq = 0U, pllsource = 0U;
01467 
01468   /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLSAIM) * PLLSAIN
01469      LTDC Domain clock  = (PLLSAI_VCO / PLLSAIR) / PLLSAIDIVR
01470   */
01471   pllsource = LL_RCC_PLL_GetMainSource();
01472 
01473   switch (pllsource)
01474   {
01475     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLLSAI clock source */
01476       pllinputfreq = HSI_VALUE;
01477       break;
01478 
01479     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLLSAI clock source */
01480       pllinputfreq = HSE_VALUE;
01481       break;
01482 
01483     default:
01484       pllinputfreq = HSI_VALUE;
01485       break;
01486   }
01487   return __LL_RCC_CALC_PLLSAI_LTDC_FREQ(pllinputfreq, LL_RCC_PLLSAI_GetDivider(),
01488                                         LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetR(), LL_RCC_PLLSAI_GetDIVR());
01489 }
01490 #endif /* LTDC */
01491 #endif /* RCC_PLLSAI_SUPPORT */
01492 
01493 #if defined(RCC_PLLI2S_SUPPORT)
01494 #if defined(SAI1)
01495 /**
01496   * @brief  Return PLLI2S clock frequency used for SAI domains
01497   * @retval PLLI2S clock frequency (in Hz)
01498   */
01499 uint32_t RCC_PLLI2S_GetFreqDomain_SAI(void)
01500 {
01501   uint32_t plli2sinputfreq = 0U, plli2ssource = 0U, plli2soutputfreq = 0U;
01502 
01503   /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN
01504      SAI domain clock  = (PLLI2S_VCO / PLLI2SQ) / PLLI2SDIVQ
01505      or
01506      SAI domain clock  = (PLLI2S_VCO / PLLI2SR) / PLLI2SDIVR
01507   */
01508   plli2ssource = LL_RCC_PLLI2S_GetMainSource();
01509 
01510   switch (plli2ssource)
01511   {
01512     case LL_RCC_PLLSOURCE_HSE:     /* HSE used as PLLI2S clock source */
01513       plli2sinputfreq = HSE_VALUE;
01514       break;
01515 
01516 #if defined(RCC_PLLI2SCFGR_PLLI2SSRC)
01517     case LL_RCC_PLLI2SSOURCE_PIN:  /* External pin input clock used as PLLI2S clock source */
01518       plli2sinputfreq = EXTERNAL_CLOCK_VALUE;
01519       break;
01520 #endif /* RCC_PLLI2SCFGR_PLLI2SSRC */
01521 
01522     case LL_RCC_PLLSOURCE_HSI:     /* HSI used as PLLI2S clock source */
01523     default:
01524       plli2sinputfreq = HSI_VALUE;
01525       break;
01526   }
01527 
01528 #if defined(RCC_DCKCFGR_PLLI2SDIVQ)
01529   plli2soutputfreq = __LL_RCC_CALC_PLLI2S_SAI_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(),
01530                                           LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetQ(), LL_RCC_PLLI2S_GetDIVQ());
01531 #else
01532   plli2soutputfreq = __LL_RCC_CALC_PLLI2S_SAI_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(),
01533                                           LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetR(), LL_RCC_PLLI2S_GetDIVR());
01534 #endif /* RCC_DCKCFGR_PLLI2SDIVQ */
01535 
01536   return plli2soutputfreq;
01537 }
01538 #endif /* SAI1 */
01539 
01540 #if defined(SPDIFRX)
01541 /**
01542   * @brief  Return PLLI2S clock frequency used for SPDIFRX domain
01543   * @retval PLLI2S clock frequency (in Hz)
01544   */
01545 uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void)
01546 {
01547   uint32_t pllinputfreq = 0U, pllsource = 0U;
01548 
01549   /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN
01550      SPDIFRX Domain clock  = PLLI2S_VCO / PLLI2SP
01551   */
01552   pllsource = LL_RCC_PLLI2S_GetMainSource();
01553 
01554   switch (pllsource)
01555   {
01556     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLLI2S clock source */
01557       pllinputfreq = HSE_VALUE;
01558       break;
01559 
01560     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLLI2S clock source */
01561     default:
01562       pllinputfreq = HSI_VALUE;
01563       break;
01564   }
01565 
01566   return __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ(pllinputfreq, LL_RCC_PLLI2S_GetDivider(),
01567                                            LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetP());
01568 }
01569 #endif /* SPDIFRX */
01570 
01571 /**
01572   * @brief  Return PLLI2S clock frequency used for I2S domain
01573   * @retval PLLI2S clock frequency (in Hz)
01574   */
01575 uint32_t RCC_PLLI2S_GetFreqDomain_I2S(void)
01576 {
01577   uint32_t plli2sinputfreq = 0U, plli2ssource = 0U, plli2soutputfreq = 0U;
01578 
01579   /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN
01580      I2S Domain clock  = PLLI2S_VCO / PLLI2SR
01581   */
01582   plli2ssource = LL_RCC_PLLI2S_GetMainSource();
01583 
01584   switch (plli2ssource)
01585   {
01586     case LL_RCC_PLLSOURCE_HSE:     /* HSE used as PLLI2S clock source */
01587       plli2sinputfreq = HSE_VALUE;
01588       break;
01589 
01590 #if defined(RCC_PLLI2SCFGR_PLLI2SSRC)
01591     case LL_RCC_PLLI2SSOURCE_PIN:  /* External pin input clock used as PLLI2S clock source */
01592       plli2sinputfreq = EXTERNAL_CLOCK_VALUE;
01593       break;
01594 #endif /* RCC_PLLI2SCFGR_PLLI2SSRC */
01595 
01596     case LL_RCC_PLLSOURCE_HSI:     /* HSI used as PLLI2S clock source */
01597     default:
01598       plli2sinputfreq = HSI_VALUE;
01599       break;
01600   }
01601 
01602   plli2soutputfreq = __LL_RCC_CALC_PLLI2S_I2S_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(),
01603                                                    LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetR());
01604 
01605   return plli2soutputfreq;
01606 }
01607 
01608 #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
01609 /**
01610   * @brief  Return PLLI2S clock frequency used for 48Mhz domain
01611   * @retval PLLI2S clock frequency (in Hz)
01612   */
01613 uint32_t RCC_PLLI2S_GetFreqDomain_48M(void)
01614 {
01615   uint32_t plli2sinputfreq = 0U, plli2ssource = 0U, plli2soutputfreq = 0U;
01616 
01617   /* PLL48M_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN
01618      48M Domain clock  = PLLI2S_VCO / PLLI2SQ
01619   */
01620   plli2ssource = LL_RCC_PLLI2S_GetMainSource();
01621 
01622   switch (plli2ssource)
01623   {
01624     case LL_RCC_PLLSOURCE_HSE:     /* HSE used as PLLI2S clock source */
01625       plli2sinputfreq = HSE_VALUE;
01626       break;
01627 
01628 #if defined(RCC_PLLI2SCFGR_PLLI2SSRC)
01629     case LL_RCC_PLLI2SSOURCE_PIN:  /* External pin input clock used as PLLI2S clock source */
01630       plli2sinputfreq = EXTERNAL_CLOCK_VALUE;
01631       break;
01632 #endif /* RCC_PLLI2SCFGR_PLLI2SSRC */
01633 
01634     case LL_RCC_PLLSOURCE_HSI:     /* HSI used as PLLI2S clock source */
01635     default:
01636       plli2sinputfreq = HSI_VALUE;
01637       break;
01638   }
01639 
01640   plli2soutputfreq = __LL_RCC_CALC_PLLI2S_48M_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(),
01641                                                    LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetQ());
01642 
01643   return plli2soutputfreq;
01644 }
01645 #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
01646 #endif /* RCC_PLLI2S_SUPPORT */
01647 /**
01648   * @}
01649   */
01650 
01651 /**
01652   * @}
01653   */
01654 
01655 #endif /* defined(RCC) */
01656 
01657 /**
01658   * @}
01659   */
01660 
01661 #endif /* USE_FULL_LL_DRIVER */
01662 
01663 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/