STM32L443xx HAL User Manual
stm32l4xx_ll_rcc.c
Go to the documentation of this file.
00001 /**
00002   ******************************************************************************
00003   * @file    stm32l4xx_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 "stm32l4xx_ll_rcc.h"
00021 #ifdef  USE_FULL_ASSERT
00022   #include "stm32_assert.h"
00023 #else
00024   #define assert_param(expr) ((void)0U)
00025 #endif
00026 /** @addtogroup STM32L4xx_LL_Driver
00027   * @{
00028   */
00029 
00030 #if defined(RCC)
00031 
00032 /** @addtogroup RCC_LL
00033   * @{
00034   */
00035 
00036 /* Private types -------------------------------------------------------------*/
00037 /* Private variables ---------------------------------------------------------*/
00038 /* Private constants ---------------------------------------------------------*/
00039 /* Private macros ------------------------------------------------------------*/
00040 /** @addtogroup RCC_LL_Private_Macros
00041   * @{
00042   */
00043 #if   defined(RCC_CCIPR_USART3SEL)
00044 #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \
00045                                             || ((__VALUE__) == LL_RCC_USART2_CLKSOURCE) \
00046                                             || ((__VALUE__) == LL_RCC_USART3_CLKSOURCE))
00047 #else
00048 #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \
00049                                             || ((__VALUE__) == LL_RCC_USART2_CLKSOURCE))
00050 
00051 #endif /* RCC_CCIPR_USART3SEL */
00052 #if defined(RCC_CCIPR_UART4SEL) && defined(RCC_CCIPR_UART5SEL)
00053 #define IS_LL_RCC_UART_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_UART4_CLKSOURCE) \
00054                                              || ((__VALUE__) == LL_RCC_UART5_CLKSOURCE))
00055 #elif defined(RCC_CCIPR_UART4SEL)
00056 #define IS_LL_RCC_UART_CLKSOURCE(__VALUE__)    ((__VALUE__) == LL_RCC_UART4_CLKSOURCE)
00057 #elif defined(RCC_CCIPR_UART5SEL)
00058 #define IS_LL_RCC_UART_CLKSOURCE(__VALUE__)    ((__VALUE__) == LL_RCC_UART5_CLKSOURCE)
00059 #endif /* RCC_CCIPR_UART4SEL && RCC_CCIPR_UART5SEL*/
00060 
00061 #define IS_LL_RCC_LPUART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPUART1_CLKSOURCE))
00062 
00063 #if defined(RCC_CCIPR_I2C2SEL) && defined(RCC_CCIPR_I2C3SEL) && defined(RCC_CCIPR2_I2C4SEL)
00064 #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
00065                                             || ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE) \
00066                                             || ((__VALUE__) == LL_RCC_I2C3_CLKSOURCE) \
00067                                             || ((__VALUE__) == LL_RCC_I2C4_CLKSOURCE))
00068 #elif defined(RCC_CCIPR_I2C2SEL) && defined(RCC_CCIPR_I2C3SEL)
00069 #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
00070                                             || ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE) \
00071                                             || ((__VALUE__) == LL_RCC_I2C3_CLKSOURCE))
00072 
00073 #elif !defined(RCC_CCIPR_I2C2SEL) && defined(RCC_CCIPR_I2C3SEL)
00074 #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
00075                                             || ((__VALUE__) == LL_RCC_I2C3_CLKSOURCE))
00076 
00077 #else
00078 #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__)     ((__VALUE__) == LL_RCC_I2C1_CLKSOURCE)
00079 
00080 #endif /* RCC_CCIPR_I2C2SEL && RCC_CCIPR_I2C3SEL && RCC_CCIPR2_I2C4SEL */
00081 #define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE) \
00082                                             || ((__VALUE__) == LL_RCC_LPTIM2_CLKSOURCE))
00083 
00084 #if defined(RCC_CCIPR_SAI2SEL) || defined(RCC_CCIPR2_SAI2SEL)
00085 #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \
00086                                             || ((__VALUE__) == LL_RCC_SAI2_CLKSOURCE))
00087 #elif defined(RCC_CCIPR_SAI1SEL) || defined(RCC_CCIPR2_SAI1SEL)
00088 #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__)    ((__VALUE__) == LL_RCC_SAI1_CLKSOURCE)
00089 #endif /* RCC_CCIPR_SAI2SEL RCC_CCIPR2_SAI2SEL ||*/
00090 
00091 #if defined(SDMMC1)
00092 #if defined(RCC_CCIPR2_SDMMCSEL)
00093 #define IS_LL_RCC_SDMMC_KERNELCLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_SDMMC1_KERNELCLKSOURCE))
00094 #endif /* RCC_CCIPR2_SDMMCSEL */
00095 
00096 #define IS_LL_RCC_SDMMC_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_SDMMC1_CLKSOURCE))
00097 #endif /* SDMMC1 */
00098 
00099 #define IS_LL_RCC_RNG_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_RNG_CLKSOURCE))
00100 
00101 #if defined(USB_OTG_FS) || defined(USB)
00102 #define IS_LL_RCC_USB_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_USB_CLKSOURCE))
00103 #endif /* USB_OTG_FS || USB */
00104 
00105 #define IS_LL_RCC_ADC_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_ADC_CLKSOURCE))
00106 
00107 #if defined(SWPMI1)
00108 #define IS_LL_RCC_SWPMI_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_SWPMI1_CLKSOURCE))
00109 #endif /* SWPMI1 */
00110 
00111 #if   defined(DFSDM1_Channel0)
00112 #define IS_LL_RCC_DFSDM_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_DFSDM1_CLKSOURCE))
00113 #if defined(RCC_CCIPR2_DFSDM1SEL)
00114 #define IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_DFSDM1_AUDIO_CLKSOURCE))
00115 #endif /* RCC_CCIPR2_DFSDM1SEL */
00116 #endif /* DFSDM1_Channel0 */
00117 
00118 #if defined(DSI)
00119 #define IS_LL_RCC_DSI_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_DSI_CLKSOURCE))
00120 #endif /* DSI */
00121 
00122 #if defined(LTDC)
00123 #define IS_LL_RCC_LTDC_CLKSOURCE(__VALUE__)    (((__VALUE__) == LL_RCC_LTDC_CLKSOURCE))
00124 #endif /* LTDC */
00125 
00126 #if defined(OCTOSPI1)
00127 #define IS_LL_RCC_OCTOSPI_CLKSOURCE(__VALUE__)  (((__VALUE__) == LL_RCC_OCTOSPI_CLKSOURCE))
00128 #endif /* OCTOSPI */
00129 
00130 /**
00131   * @}
00132   */
00133 
00134 /* Private function prototypes -----------------------------------------------*/
00135 /** @defgroup RCC_LL_Private_Functions RCC Private functions
00136   * @{
00137   */
00138 static uint32_t RCC_GetSystemClockFreq(void);
00139 static uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency);
00140 static uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency);
00141 static uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency);
00142 static uint32_t RCC_PLL_GetFreqDomain_SYS(void);
00143 #if defined(RCC_CCIPR_SAI1SEL) || defined(RCC_CCIPR_SAI2SEL) || defined(RCC_CCIPR2_SAI1SEL) || defined(RCC_CCIPR2_SAI2SEL)
00144 static uint32_t RCC_PLL_GetFreqDomain_SAI(void);
00145 #endif
00146 static uint32_t RCC_PLL_GetFreqDomain_48M(void);
00147 #if defined(RCC_PLLSAI1_SUPPORT)
00148 static uint32_t RCC_PLLSAI1_GetFreqDomain_SAI(void);
00149 static uint32_t RCC_PLLSAI1_GetFreqDomain_48M(void);
00150 static uint32_t RCC_PLLSAI1_GetFreqDomain_ADC(void);
00151 #endif /* RCC_PLLSAI1_SUPPORT */
00152 #if defined(RCC_PLLSAI2_SUPPORT)
00153 static uint32_t RCC_PLLSAI2_GetFreqDomain_SAI(void);
00154 #if defined(LTDC)
00155 static uint32_t RCC_PLLSAI2_GetFreqDomain_LTDC(void);
00156 #else
00157 static uint32_t RCC_PLLSAI2_GetFreqDomain_ADC(void);
00158 #endif /* LTDC */
00159 #if defined(DSI)
00160 static uint32_t RCC_PLLSAI2_GetFreqDomain_DSI(void);
00161 #endif /* DSI */
00162 #endif /*RCC_PLLSAI2_SUPPORT*/
00163 /**
00164   * @}
00165   */
00166 
00167 
00168 /* Exported functions --------------------------------------------------------*/
00169 /** @addtogroup RCC_LL_Exported_Functions
00170   * @{
00171   */
00172 
00173 /** @addtogroup RCC_LL_EF_Init
00174   * @{
00175   */
00176 
00177 /**
00178   * @brief  Reset the RCC clock configuration to the default reset state.
00179   * @note   The default reset state of the clock configuration is given below:
00180   *         - MSI  ON and used as system clock source
00181   *         - HSE, HSI, PLL, PLLSAI1 and PLLSAI2 OFF
00182   *         - AHB, APB1 and APB2 prescaler set to 1.
00183   *         - CSS, MCO OFF
00184   *         - All interrupts disabled
00185   * @note   This function doesn't modify the configuration of the
00186   *         - Peripheral clocks
00187   *         - LSI, LSE and RTC clocks
00188   * @retval An ErrorStatus enumeration value:
00189   *          - SUCCESS: RCC registers are de-initialized
00190   *          - ERROR: not applicable
00191   */
00192 ErrorStatus LL_RCC_DeInit(void)
00193 {
00194   __IO uint32_t vl_mask;
00195 
00196   /* Set MSION bit */
00197   LL_RCC_MSI_Enable();
00198 
00199   /* Insure MSIRDY bit is set before writing default MSIRANGE value */
00200   while (LL_RCC_MSI_IsReady() == 0U)
00201   {
00202   }
00203 
00204   /* Set MSIRANGE default value */
00205   LL_RCC_MSI_SetRange(LL_RCC_MSIRANGE_6);
00206 
00207   /* Set MSITRIM bits to the reset value*/
00208   LL_RCC_MSI_SetCalibTrimming(0);
00209 
00210   /* Set HSITRIM bits to the reset value*/
00211 #if defined(RCC_ICSCR_HSITRIM_6)
00212   LL_RCC_HSI_SetCalibTrimming(0x40U);
00213 #else
00214   LL_RCC_HSI_SetCalibTrimming(0x10U);
00215 #endif /* RCC_ICSCR_HSITRIM_6 */
00216 
00217   /* Reset CFGR register */
00218   LL_RCC_WriteReg(CFGR, 0x00000000U);
00219 
00220   /* Read CR register */
00221   vl_mask = LL_RCC_ReadReg(CR);
00222 
00223   /* Reset HSION, HSIKERON, HSIASFS, HSEON, PLLON bits */
00224   CLEAR_BIT(vl_mask,
00225             (RCC_CR_HSION | RCC_CR_HSIASFS | RCC_CR_HSIKERON  | RCC_CR_HSEON | RCC_CR_PLLON));
00226 
00227 #if defined(RCC_PLLSAI1_SUPPORT)
00228   /* Reset PLLSAI1ON bit */
00229   CLEAR_BIT(vl_mask, RCC_CR_PLLSAI1ON);
00230 #endif /*RCC_PLLSAI1_SUPPORT*/
00231 
00232 #if defined(RCC_PLLSAI2_SUPPORT)
00233   /* Reset PLLSAI2ON bit */
00234   CLEAR_BIT(vl_mask, RCC_CR_PLLSAI2ON);
00235 #endif /*RCC_PLLSAI2_SUPPORT*/
00236 
00237   /* Write new value in CR register */
00238   LL_RCC_WriteReg(CR, vl_mask);
00239 
00240 #if defined(RCC_PLLSAI2_SUPPORT)
00241   /* Wait for PLLRDY, PLLSAI1RDY and PLLSAI2RDY bits to be reset */
00242   while(READ_BIT(RCC->CR, RCC_CR_PLLRDY | RCC_CR_PLLSAI1RDY | RCC_CR_PLLSAI2RDY) != 0U)
00243   {
00244   }
00245 #elif defined(RCC_PLLSAI1_SUPPORT)
00246   /* Wait for PLLRDY and PLLSAI1RDY to be reset */
00247   while(READ_BIT(RCC->CR, RCC_CR_PLLRDY | RCC_CR_PLLSAI1RDY) != 0U)
00248   {
00249   }
00250 #else
00251   /* Wait for PLLRDY bit to be reset */
00252   while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) != 0U)
00253   {
00254   }
00255 #endif
00256 
00257   /* Reset PLLCFGR register */
00258   LL_RCC_WriteReg(PLLCFGR, 16U << RCC_PLLCFGR_PLLN_Pos);
00259 
00260 #if defined(RCC_PLLSAI1_SUPPORT)
00261   /* Reset PLLSAI1CFGR register */
00262   LL_RCC_WriteReg(PLLSAI1CFGR, 16U << RCC_PLLSAI1CFGR_PLLSAI1N_Pos);
00263 #endif /*RCC_PLLSAI1_SUPPORT*/
00264 
00265 #if defined(RCC_PLLSAI2_SUPPORT)
00266   /* Reset PLLSAI2CFGR register */
00267   LL_RCC_WriteReg(PLLSAI2CFGR, 16U << RCC_PLLSAI2CFGR_PLLSAI2N_Pos);
00268 #endif /*RCC_PLLSAI2_SUPPORT*/
00269 
00270   /* Reset HSEBYP bit */
00271   LL_RCC_HSE_DisableBypass();
00272 
00273   /* Disable all interrupts */
00274   LL_RCC_WriteReg(CIER, 0x00000000U);
00275 
00276   /* Clear all interrupt flags */
00277   vl_mask = RCC_CICR_LSIRDYC | RCC_CICR_LSERDYC | RCC_CICR_MSIRDYC | RCC_CICR_HSIRDYC | RCC_CICR_HSERDYC | RCC_CICR_PLLRDYC | \
00278             RCC_CICR_CSSC | RCC_CICR_LSECSSC;
00279 #if defined(RCC_HSI48_SUPPORT)
00280   vl_mask |= RCC_CICR_HSI48RDYC;
00281 #endif
00282 #if defined(RCC_PLLSAI1_SUPPORT)
00283   vl_mask |= RCC_CICR_PLLSAI1RDYC;
00284 #endif
00285 #if defined(RCC_PLLSAI2_SUPPORT)
00286   vl_mask |= RCC_CICR_PLLSAI2RDYC;
00287 #endif
00288   LL_RCC_WriteReg(CICR, vl_mask);
00289 
00290   /* Clear reset flags */
00291   LL_RCC_ClearResetFlags();
00292 
00293   return SUCCESS;
00294 }
00295 
00296 /**
00297   * @}
00298   */
00299 
00300 /** @addtogroup RCC_LL_EF_Get_Freq
00301   * @brief  Return the frequencies of different on chip clocks;  System, AHB, APB1 and APB2 buses clocks
00302   *         and different peripheral clocks available on the device.
00303   * @note   If SYSCLK source is MSI, function returns values based on MSI_VALUE(*)
00304   * @note   If SYSCLK source is HSI, function returns values based on HSI_VALUE(**)
00305   * @note   If SYSCLK source is HSE, function returns values based on HSE_VALUE(***)
00306   * @note   If SYSCLK source is PLL, function returns values based on HSE_VALUE(***)
00307   *         or HSI_VALUE(**) or MSI_VALUE(*) multiplied/divided by the PLL factors.
00308   * @note   (*) MSI_VALUE is a constant defined in this file (default value
00309   *             4 MHz) but the real value may vary depending on the variations
00310   *             in voltage and temperature.
00311   * @note   (**) HSI_VALUE is a constant defined in this file (default value
00312   *              16 MHz) but the real value may vary depending on the variations
00313   *              in voltage and temperature.
00314   * @note   (***) HSE_VALUE is a constant defined in this file (default value
00315   *               8 MHz), user has to ensure that HSE_VALUE is same as the real
00316   *               frequency of the crystal used. Otherwise, this function may
00317   *               have wrong result.
00318   * @note   The result of this function could be incorrect when using fractional
00319   *         value for HSE crystal.
00320   * @note   This function can be used by the user application to compute the
00321   *         baud-rate for the communication peripherals or configure other parameters.
00322   * @{
00323   */
00324 
00325 /**
00326   * @brief  Return the frequencies of different on chip clocks;  System, AHB, APB1 and APB2 buses clocks
00327   * @note   Each time SYSCLK, HCLK, PCLK1 and/or PCLK2 clock changes, this function
00328   *         must be called to update structure fields. Otherwise, any
00329   *         configuration based on this function will be incorrect.
00330   * @param  RCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies
00331   * @retval None
00332   */
00333 void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks)
00334 {
00335   /* Get SYSCLK frequency */
00336   RCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq();
00337 
00338   /* HCLK clock frequency */
00339   RCC_Clocks->HCLK_Frequency   = RCC_GetHCLKClockFreq(RCC_Clocks->SYSCLK_Frequency);
00340 
00341   /* PCLK1 clock frequency */
00342   RCC_Clocks->PCLK1_Frequency  = RCC_GetPCLK1ClockFreq(RCC_Clocks->HCLK_Frequency);
00343 
00344   /* PCLK2 clock frequency */
00345   RCC_Clocks->PCLK2_Frequency  = RCC_GetPCLK2ClockFreq(RCC_Clocks->HCLK_Frequency);
00346 }
00347 
00348 /**
00349   * @brief  Return USARTx clock frequency
00350   * @param  USARTxSource This parameter can be one of the following values:
00351   *         @arg @ref LL_RCC_USART1_CLKSOURCE
00352   *         @arg @ref LL_RCC_USART2_CLKSOURCE
00353   *         @arg @ref LL_RCC_USART3_CLKSOURCE (*)
00354   *
00355   *         (*) value not defined in all devices.
00356   * @retval USART clock frequency (in Hz)
00357   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
00358   */
00359 uint32_t LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource)
00360 {
00361   uint32_t usart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00362 
00363   /* Check parameter */
00364   assert_param(IS_LL_RCC_USART_CLKSOURCE(USARTxSource));
00365 
00366   if (USARTxSource == LL_RCC_USART1_CLKSOURCE)
00367   {
00368     /* USART1CLK clock frequency */
00369     switch (LL_RCC_GetUSARTClockSource(USARTxSource))
00370     {
00371       case LL_RCC_USART1_CLKSOURCE_SYSCLK: /* USART1 Clock is System Clock */
00372         usart_frequency = RCC_GetSystemClockFreq();
00373         break;
00374 
00375       case LL_RCC_USART1_CLKSOURCE_HSI:    /* USART1 Clock is HSI Osc. */
00376         if (LL_RCC_HSI_IsReady() != 0U)
00377         {
00378           usart_frequency = HSI_VALUE;
00379         }
00380         break;
00381 
00382       case LL_RCC_USART1_CLKSOURCE_LSE:    /* USART1 Clock is LSE Osc. */
00383         if (LL_RCC_LSE_IsReady() != 0U)
00384         {
00385           usart_frequency = LSE_VALUE;
00386         }
00387         break;
00388 
00389       case LL_RCC_USART1_CLKSOURCE_PCLK2:  /* USART1 Clock is PCLK2 */
00390         usart_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
00391         break;
00392 
00393       default:
00394         break;
00395     }
00396   }
00397   else if (USARTxSource == LL_RCC_USART2_CLKSOURCE)
00398   {
00399     /* USART2CLK clock frequency */
00400     switch (LL_RCC_GetUSARTClockSource(USARTxSource))
00401     {
00402       case LL_RCC_USART2_CLKSOURCE_SYSCLK: /* USART2 Clock is System Clock */
00403         usart_frequency = RCC_GetSystemClockFreq();
00404         break;
00405 
00406       case LL_RCC_USART2_CLKSOURCE_HSI:    /* USART2 Clock is HSI Osc. */
00407         if (LL_RCC_HSI_IsReady() != 0U)
00408         {
00409           usart_frequency = HSI_VALUE;
00410         }
00411         break;
00412 
00413       case LL_RCC_USART2_CLKSOURCE_LSE:    /* USART2 Clock is LSE Osc. */
00414         if (LL_RCC_LSE_IsReady() != 0U)
00415         {
00416           usart_frequency = LSE_VALUE;
00417         }
00418         break;
00419 
00420       case LL_RCC_USART2_CLKSOURCE_PCLK1:  /* USART2 Clock is PCLK1 */
00421         usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
00422         break;
00423 
00424       default:
00425         break;
00426     }
00427   }
00428   else
00429   {
00430 #if defined(RCC_CCIPR_USART3SEL)
00431     if (USARTxSource == LL_RCC_USART3_CLKSOURCE)
00432     {
00433       /* USART3CLK clock frequency */
00434       switch (LL_RCC_GetUSARTClockSource(USARTxSource))
00435       {
00436         case LL_RCC_USART3_CLKSOURCE_SYSCLK: /* USART3 Clock is System Clock */
00437           usart_frequency = RCC_GetSystemClockFreq();
00438           break;
00439 
00440         case LL_RCC_USART3_CLKSOURCE_HSI:    /* USART3 Clock is HSI Osc. */
00441           if (LL_RCC_HSI_IsReady() != 0U)
00442           {
00443             usart_frequency = HSI_VALUE;
00444           }
00445           break;
00446 
00447         case LL_RCC_USART3_CLKSOURCE_LSE:    /* USART3 Clock is LSE Osc. */
00448           if (LL_RCC_LSE_IsReady() != 0U)
00449           {
00450             usart_frequency = LSE_VALUE;
00451           }
00452           break;
00453 
00454         case LL_RCC_USART3_CLKSOURCE_PCLK1:  /* USART3 Clock is PCLK1 */
00455           usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
00456           break;
00457 
00458         default:
00459           break;
00460       }
00461     }
00462 #endif /* RCC_CCIPR_USART3SEL */
00463   }
00464   return usart_frequency;
00465 }
00466 
00467 #if defined(RCC_CCIPR_UART4SEL) || defined(RCC_CCIPR_UART5SEL)
00468 /**
00469   * @brief  Return UARTx clock frequency
00470   * @param  UARTxSource This parameter can be one of the following values:
00471   *         @arg @ref LL_RCC_UART4_CLKSOURCE
00472   *         @arg @ref LL_RCC_UART5_CLKSOURCE
00473   * @retval UART clock frequency (in Hz)
00474   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
00475   */
00476 uint32_t LL_RCC_GetUARTClockFreq(uint32_t UARTxSource)
00477 {
00478   uint32_t uart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00479 
00480   /* Check parameter */
00481   assert_param(IS_LL_RCC_UART_CLKSOURCE(UARTxSource));
00482 
00483 #if defined(RCC_CCIPR_UART4SEL)
00484   if (UARTxSource == LL_RCC_UART4_CLKSOURCE)
00485   {
00486     /* UART4CLK clock frequency */
00487     switch (LL_RCC_GetUARTClockSource(UARTxSource))
00488     {
00489       case LL_RCC_UART4_CLKSOURCE_SYSCLK: /* UART4 Clock is System Clock */
00490         uart_frequency = RCC_GetSystemClockFreq();
00491         break;
00492 
00493       case LL_RCC_UART4_CLKSOURCE_HSI:    /* UART4 Clock is HSI Osc. */
00494         if (LL_RCC_HSI_IsReady() != 0U)
00495         {
00496           uart_frequency = HSI_VALUE;
00497         }
00498         break;
00499 
00500       case LL_RCC_UART4_CLKSOURCE_LSE:    /* UART4 Clock is LSE Osc. */
00501         if (LL_RCC_LSE_IsReady() != 0U)
00502         {
00503           uart_frequency = LSE_VALUE;
00504         }
00505         break;
00506 
00507       case LL_RCC_UART4_CLKSOURCE_PCLK1:  /* UART4 Clock is PCLK1 */
00508         uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
00509         break;
00510 
00511       default:
00512         break;
00513     }
00514   }
00515 #endif /* RCC_CCIPR_UART4SEL */
00516 
00517 #if defined(RCC_CCIPR_UART5SEL)
00518   if (UARTxSource == LL_RCC_UART5_CLKSOURCE)
00519   {
00520     /* UART5CLK clock frequency */
00521     switch (LL_RCC_GetUARTClockSource(UARTxSource))
00522     {
00523       case LL_RCC_UART5_CLKSOURCE_SYSCLK: /* UART5 Clock is System Clock */
00524         uart_frequency = RCC_GetSystemClockFreq();
00525         break;
00526 
00527       case LL_RCC_UART5_CLKSOURCE_HSI:    /* UART5 Clock is HSI Osc. */
00528         if (LL_RCC_HSI_IsReady() != 0U)
00529         {
00530           uart_frequency = HSI_VALUE;
00531         }
00532         break;
00533 
00534       case LL_RCC_UART5_CLKSOURCE_LSE:    /* UART5 Clock is LSE Osc. */
00535         if (LL_RCC_LSE_IsReady() != 0U)
00536         {
00537           uart_frequency = LSE_VALUE;
00538         }
00539         break;
00540 
00541       case LL_RCC_UART5_CLKSOURCE_PCLK1:  /* UART5 Clock is PCLK1 */
00542         uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
00543         break;
00544 
00545       default:
00546         break;
00547     }
00548   }
00549 #endif /* RCC_CCIPR_UART5SEL */
00550 
00551   return uart_frequency;
00552 }
00553 #endif /* RCC_CCIPR_UART4SEL || RCC_CCIPR_UART5SEL */
00554 
00555 /**
00556   * @brief  Return I2Cx clock frequency
00557   * @param  I2CxSource This parameter can be one of the following values:
00558   *         @arg @ref LL_RCC_I2C1_CLKSOURCE
00559   *         @arg @ref LL_RCC_I2C2_CLKSOURCE (*)
00560   *         @arg @ref LL_RCC_I2C3_CLKSOURCE
00561   *         @arg @ref LL_RCC_I2C4_CLKSOURCE (*)
00562   *
00563   *         (*) value not defined in all devices.
00564   * @retval I2C clock frequency (in Hz)
00565   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that HSI oscillator is not ready
00566   */
00567 uint32_t LL_RCC_GetI2CClockFreq(uint32_t I2CxSource)
00568 {
00569   uint32_t i2c_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00570 
00571   /* Check parameter */
00572   assert_param(IS_LL_RCC_I2C_CLKSOURCE(I2CxSource));
00573 
00574   if (I2CxSource == LL_RCC_I2C1_CLKSOURCE)
00575   {
00576     /* I2C1 CLK clock frequency */
00577     switch (LL_RCC_GetI2CClockSource(I2CxSource))
00578     {
00579       case LL_RCC_I2C1_CLKSOURCE_SYSCLK: /* I2C1 Clock is System Clock */
00580         i2c_frequency = RCC_GetSystemClockFreq();
00581         break;
00582 
00583       case LL_RCC_I2C1_CLKSOURCE_HSI:    /* I2C1 Clock is HSI Osc. */
00584         if (LL_RCC_HSI_IsReady() != 0U)
00585         {
00586           i2c_frequency = HSI_VALUE;
00587         }
00588         break;
00589 
00590       case LL_RCC_I2C1_CLKSOURCE_PCLK1:  /* I2C1 Clock is PCLK1 */
00591         i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
00592         break;
00593 
00594       default:
00595         break;
00596     }
00597   }
00598 #if defined(RCC_CCIPR_I2C2SEL)
00599   else if (I2CxSource == LL_RCC_I2C2_CLKSOURCE)
00600   {
00601     /* I2C2 CLK clock frequency */
00602     switch (LL_RCC_GetI2CClockSource(I2CxSource))
00603     {
00604       case LL_RCC_I2C2_CLKSOURCE_SYSCLK: /* I2C2 Clock is System Clock */
00605         i2c_frequency = RCC_GetSystemClockFreq();
00606         break;
00607 
00608       case LL_RCC_I2C2_CLKSOURCE_HSI:    /* I2C2 Clock is HSI Osc. */
00609         if (LL_RCC_HSI_IsReady() != 0U)
00610         {
00611           i2c_frequency = HSI_VALUE;
00612         }
00613         break;
00614 
00615       case LL_RCC_I2C2_CLKSOURCE_PCLK1:  /* I2C2 Clock is PCLK1 */
00616         i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
00617         break;
00618 
00619       default:
00620         break;
00621     }
00622   }
00623 #endif /*RCC_CCIPR_I2C2SEL*/
00624   else
00625   {
00626     if (I2CxSource == LL_RCC_I2C3_CLKSOURCE)
00627     {
00628       /* I2C3 CLK clock frequency */
00629       switch (LL_RCC_GetI2CClockSource(I2CxSource))
00630       {
00631         case LL_RCC_I2C3_CLKSOURCE_SYSCLK: /* I2C3 Clock is System Clock */
00632           i2c_frequency = RCC_GetSystemClockFreq();
00633           break;
00634 
00635         case LL_RCC_I2C3_CLKSOURCE_HSI:    /* I2C3 Clock is HSI Osc. */
00636           if (LL_RCC_HSI_IsReady() != 0U)
00637           {
00638             i2c_frequency = HSI_VALUE;
00639           }
00640           break;
00641 
00642         case LL_RCC_I2C3_CLKSOURCE_PCLK1:  /* I2C3 Clock is PCLK1 */
00643           i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
00644           break;
00645 
00646         default:
00647           break;
00648       }
00649     }
00650 #if defined(RCC_CCIPR2_I2C4SEL)
00651     else
00652     {
00653       if (I2CxSource == LL_RCC_I2C4_CLKSOURCE)
00654       {
00655         /* I2C4 CLK clock frequency */
00656         switch (LL_RCC_GetI2CClockSource(I2CxSource))
00657         {
00658           case LL_RCC_I2C4_CLKSOURCE_SYSCLK: /* I2C4 Clock is System Clock */
00659             i2c_frequency = RCC_GetSystemClockFreq();
00660             break;
00661 
00662           case LL_RCC_I2C4_CLKSOURCE_HSI:    /* I2C4 Clock is HSI Osc. */
00663             if (LL_RCC_HSI_IsReady() != 0U)
00664             {
00665               i2c_frequency = HSI_VALUE;
00666             }
00667             break;
00668 
00669           case LL_RCC_I2C4_CLKSOURCE_PCLK1:  /* I2C4 Clock is PCLK1 */
00670             i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
00671             break;
00672 
00673           default:
00674             break;
00675         }
00676       }
00677     }
00678 #endif /*RCC_CCIPR2_I2C4SEL*/
00679   }
00680 
00681   return i2c_frequency;
00682 }
00683 
00684 
00685 /**
00686   * @brief  Return LPUARTx clock frequency
00687   * @param  LPUARTxSource This parameter can be one of the following values:
00688   *         @arg @ref LL_RCC_LPUART1_CLKSOURCE
00689   * @retval LPUART clock frequency (in Hz)
00690   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
00691   */
00692 uint32_t LL_RCC_GetLPUARTClockFreq(uint32_t LPUARTxSource)
00693 {
00694   uint32_t lpuart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00695 
00696   /* Check parameter */
00697   assert_param(IS_LL_RCC_LPUART_CLKSOURCE(LPUARTxSource));
00698 
00699   /* LPUART1CLK clock frequency */
00700   switch (LL_RCC_GetLPUARTClockSource(LPUARTxSource))
00701   {
00702     case LL_RCC_LPUART1_CLKSOURCE_SYSCLK: /* LPUART1 Clock is System Clock */
00703       lpuart_frequency = RCC_GetSystemClockFreq();
00704       break;
00705 
00706     case LL_RCC_LPUART1_CLKSOURCE_HSI:    /* LPUART1 Clock is HSI Osc. */
00707       if (LL_RCC_HSI_IsReady() != 0U)
00708       {
00709         lpuart_frequency = HSI_VALUE;
00710       }
00711       break;
00712 
00713     case LL_RCC_LPUART1_CLKSOURCE_LSE:    /* LPUART1 Clock is LSE Osc. */
00714       if (LL_RCC_LSE_IsReady() != 0U)
00715       {
00716         lpuart_frequency = LSE_VALUE;
00717       }
00718       break;
00719 
00720     case LL_RCC_LPUART1_CLKSOURCE_PCLK1:  /* LPUART1 Clock is PCLK1 */
00721       lpuart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
00722       break;
00723 
00724     default:
00725       break;
00726   }
00727 
00728   return lpuart_frequency;
00729 }
00730 
00731 /**
00732   * @brief  Return LPTIMx clock frequency
00733   * @param  LPTIMxSource This parameter can be one of the following values:
00734   *         @arg @ref LL_RCC_LPTIM1_CLKSOURCE
00735   *         @arg @ref LL_RCC_LPTIM2_CLKSOURCE
00736   * @retval LPTIM clock frequency (in Hz)
00737   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI, LSI or LSE) is not ready
00738   */
00739 uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)
00740 {
00741   uint32_t lptim_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00742 
00743   /* Check parameter */
00744   assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource));
00745 
00746   if (LPTIMxSource == LL_RCC_LPTIM1_CLKSOURCE)
00747   {
00748     /* LPTIM1CLK clock frequency */
00749     switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
00750     {
00751       case LL_RCC_LPTIM1_CLKSOURCE_LSI:    /* LPTIM1 Clock is LSI Osc. */
00752         if (LL_RCC_LSI_IsReady() != 0U)
00753         {
00754 #if defined(RCC_CSR_LSIPREDIV)
00755           if (LL_RCC_LSI_GetPrediv() == LL_RCC_LSI_PREDIV_128)
00756           {
00757             lptim_frequency = LSI_VALUE / 128U;
00758           }
00759           else
00760 #endif /* RCC_CSR_LSIPREDIV */
00761           {
00762             lptim_frequency = LSI_VALUE;
00763           }
00764         }
00765         break;
00766 
00767       case LL_RCC_LPTIM1_CLKSOURCE_HSI:    /* LPTIM1 Clock is HSI Osc. */
00768         if (LL_RCC_HSI_IsReady() != 0U)
00769         {
00770           lptim_frequency = HSI_VALUE;
00771         }
00772         break;
00773 
00774       case LL_RCC_LPTIM1_CLKSOURCE_LSE:    /* LPTIM1 Clock is LSE Osc. */
00775         if (LL_RCC_LSE_IsReady() != 0U)
00776         {
00777           lptim_frequency = LSE_VALUE;
00778         }
00779         break;
00780 
00781       case LL_RCC_LPTIM1_CLKSOURCE_PCLK1:  /* LPTIM1 Clock is PCLK1 */
00782         lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
00783         break;
00784 
00785       default:
00786         break;
00787     }
00788   }
00789   else
00790   {
00791     if (LPTIMxSource == LL_RCC_LPTIM2_CLKSOURCE)
00792     {
00793       /* LPTIM2CLK clock frequency */
00794       switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
00795       {
00796         case LL_RCC_LPTIM2_CLKSOURCE_LSI:    /* LPTIM2 Clock is LSI Osc. */
00797           if (LL_RCC_LSI_IsReady() != 0U)
00798           {
00799 #if defined(RCC_CSR_LSIPREDIV)
00800             if (LL_RCC_LSI_GetPrediv() == LL_RCC_LSI_PREDIV_128)
00801             {
00802               lptim_frequency = LSI_VALUE / 128U;
00803             }
00804             else
00805 #endif /* RCC_CSR_LSIPREDIV */
00806             {
00807               lptim_frequency = LSI_VALUE;
00808             }
00809           }
00810           break;
00811 
00812         case LL_RCC_LPTIM2_CLKSOURCE_HSI:    /* LPTIM2 Clock is HSI Osc. */
00813           if (LL_RCC_HSI_IsReady() != 0U)
00814           {
00815             lptim_frequency = HSI_VALUE;
00816           }
00817           break;
00818 
00819         case LL_RCC_LPTIM2_CLKSOURCE_LSE:    /* LPTIM2 Clock is LSE Osc. */
00820           if (LL_RCC_LSE_IsReady() != 0U)
00821           {
00822             lptim_frequency = LSE_VALUE;
00823           }
00824           break;
00825 
00826         case LL_RCC_LPTIM2_CLKSOURCE_PCLK1:  /* LPTIM2 Clock is PCLK1 */
00827           lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
00828           break;
00829 
00830         default:
00831           break;
00832       }
00833     }
00834   }
00835 
00836   return lptim_frequency;
00837 }
00838 
00839 #if defined(RCC_CCIPR_SAI1SEL) || defined(RCC_CCIPR_SAI2SEL) || defined(RCC_CCIPR2_SAI1SEL) || defined(RCC_CCIPR2_SAI2SEL)
00840 /**
00841   * @brief  Return SAIx clock frequency
00842   * @param  SAIxSource This parameter can be one of the following values:
00843   *         @arg @ref LL_RCC_SAI1_CLKSOURCE
00844   *         @arg @ref LL_RCC_SAI2_CLKSOURCE (*)
00845   *
00846   *         (*) value not defined in all devices.
00847   * @retval SAI clock frequency (in Hz)
00848   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that PLL is not ready
00849 
00850   */
00851 uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource)
00852 {
00853   uint32_t sai_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00854 
00855   /* Check parameter */
00856   assert_param(IS_LL_RCC_SAI_CLKSOURCE(SAIxSource));
00857 
00858   if (SAIxSource == LL_RCC_SAI1_CLKSOURCE)
00859   {
00860     /* SAI1CLK clock frequency */
00861     switch (LL_RCC_GetSAIClockSource(SAIxSource))
00862     {
00863       case LL_RCC_SAI1_CLKSOURCE_PLLSAI1:    /* PLLSAI1 clock used as SAI1 clock source */
00864         if (LL_RCC_PLLSAI1_IsReady() != 0U)
00865         {
00866           if (LL_RCC_PLLSAI1_IsEnabledDomain_SAI() != 0U)
00867           {
00868             sai_frequency = RCC_PLLSAI1_GetFreqDomain_SAI();
00869           }
00870         }
00871         break;
00872 
00873 #if defined(RCC_PLLSAI2_SUPPORT)
00874       case LL_RCC_SAI1_CLKSOURCE_PLLSAI2:    /* PLLSAI2 clock used as SAI1 clock source */
00875         if (LL_RCC_PLLSAI2_IsReady() != 0U)
00876         {
00877           if (LL_RCC_PLLSAI2_IsEnabledDomain_SAI() != 0U)
00878           {
00879             sai_frequency = RCC_PLLSAI2_GetFreqDomain_SAI();
00880           }
00881         }
00882         break;
00883 
00884 #endif /* RCC_PLLSAI2_SUPPORT */
00885       case LL_RCC_SAI1_CLKSOURCE_PLL:        /* PLL clock used as SAI1 clock source */
00886         if (LL_RCC_PLL_IsReady() != 0U)
00887         {
00888           if (LL_RCC_PLL_IsEnabledDomain_SAI() != 0U)
00889           {
00890             sai_frequency = RCC_PLL_GetFreqDomain_SAI();
00891           }
00892         }
00893         break;
00894 
00895       case LL_RCC_SAI1_CLKSOURCE_PIN:        /* External input clock used as SAI1 clock source */
00896         sai_frequency = EXTERNAL_SAI1_CLOCK_VALUE;
00897         break;
00898 
00899       default:
00900         break;
00901     }
00902   }
00903   else
00904   {
00905 #if defined(RCC_CCIPR_SAI2SEL) || defined(RCC_CCIPR2_SAI2SEL)
00906     if (SAIxSource == LL_RCC_SAI2_CLKSOURCE)
00907     {
00908       /* SAI2CLK clock frequency */
00909       switch (LL_RCC_GetSAIClockSource(SAIxSource))
00910       {
00911         case LL_RCC_SAI2_CLKSOURCE_PLLSAI1:  /* PLLSAI1 clock used as SAI2 clock source */
00912           if (LL_RCC_PLLSAI1_IsReady() != 0U)
00913           {
00914             if (LL_RCC_PLLSAI1_IsEnabledDomain_SAI() != 0U)
00915             {
00916               sai_frequency = RCC_PLLSAI1_GetFreqDomain_SAI();
00917             }
00918           }
00919           break;
00920 
00921 #if defined(RCC_PLLSAI2_SUPPORT)
00922         case LL_RCC_SAI2_CLKSOURCE_PLLSAI2:  /* PLLSAI2 clock used as SAI2 clock source */
00923           if (LL_RCC_PLLSAI2_IsReady() != 0U)
00924           {
00925             if (LL_RCC_PLLSAI2_IsEnabledDomain_SAI() != 0U)
00926             {
00927               sai_frequency = RCC_PLLSAI2_GetFreqDomain_SAI();
00928             }
00929           }
00930           break;
00931 
00932 #endif /* RCC_PLLSAI2_SUPPORT */
00933         case LL_RCC_SAI2_CLKSOURCE_PLL:      /* PLL clock used as SAI2 clock source */
00934           if (LL_RCC_PLL_IsReady() != 0U)
00935           {
00936             if (LL_RCC_PLL_IsEnabledDomain_SAI() != 0U)
00937             {
00938               sai_frequency = RCC_PLL_GetFreqDomain_SAI();
00939             }
00940           }
00941           break;
00942 
00943       case LL_RCC_SAI2_CLKSOURCE_PIN:        /* External input clock used as SAI2 clock source */
00944         sai_frequency = EXTERNAL_SAI2_CLOCK_VALUE;
00945         break;
00946 
00947       default:
00948         break;
00949       }
00950     }
00951 #endif /* RCC_CCIPR_SAI2SEL || RCC_CCIPR2_SAI2SEL */
00952   }
00953 
00954   return sai_frequency;
00955 }
00956 #endif /* RCC_CCIPR_SAI1SEL || RCC_CCIPR_SAI2SEL || RCC_CCIPR2_SAI1SEL || RCC_CCIPR2_SAI2SEL*/
00957 
00958 #if defined(SDMMC1)
00959 #if defined(RCC_CCIPR2_SDMMCSEL)
00960 /**
00961   * @brief  Return SDMMCx kernel clock frequency
00962   * @param  SDMMCxSource This parameter can be one of the following values:
00963   *         @arg @ref LL_RCC_SDMMC1_KERNELCLKSOURCE
00964   * @retval SDMMC clock frequency (in Hz)
00965   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (MSI) or PLL is not ready
00966   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected
00967   */
00968 uint32_t LL_RCC_GetSDMMCKernelClockFreq(uint32_t SDMMCxSource)
00969 {
00970   uint32_t sdmmc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
00971 
00972   /* Check parameter */
00973   assert_param(IS_LL_RCC_SDMMC_KERNELCLKSOURCE(SDMMCxSource));
00974 
00975   /* SDMMC1CLK kernel clock frequency */
00976   switch (LL_RCC_GetSDMMCKernelClockSource(SDMMCxSource))
00977   {
00978     case LL_RCC_SDMMC1_KERNELCLKSOURCE_48CLK:      /* 48MHz clock from internal multiplexor used as SDMMC1 clock source */
00979       sdmmc_frequency = LL_RCC_GetSDMMCClockFreq(LL_RCC_SDMMC1_CLKSOURCE);
00980       break;
00981 
00982     case LL_RCC_SDMMC1_KERNELCLKSOURCE_PLLP:        /* PLL "P" output (PLLSAI3CLK) clock used as SDMMC1 clock source */
00983       if (LL_RCC_PLL_IsReady() != 0U)
00984       {
00985         if (LL_RCC_PLL_IsEnabledDomain_SAI() != 0U)
00986         {
00987           sdmmc_frequency = RCC_PLL_GetFreqDomain_SAI();
00988         }
00989       }
00990       break;
00991 
00992     default:
00993       sdmmc_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
00994       break;
00995   }
00996 
00997   return sdmmc_frequency;
00998 }
00999 #endif
01000 
01001 /**
01002   * @brief  Return SDMMCx clock frequency
01003   * @param  SDMMCxSource This parameter can be one of the following values:
01004   *         @arg @ref LL_RCC_SDMMC1_CLKSOURCE
01005   * @retval SDMMC clock frequency (in Hz)
01006   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (MSI) or PLL is not ready
01007   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected
01008   */
01009 uint32_t LL_RCC_GetSDMMCClockFreq(uint32_t SDMMCxSource)
01010 {
01011   uint32_t sdmmc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01012 
01013   /* Check parameter */
01014   assert_param(IS_LL_RCC_SDMMC_CLKSOURCE(SDMMCxSource));
01015 
01016   /* SDMMC1CLK clock frequency */
01017   switch (LL_RCC_GetSDMMCClockSource(SDMMCxSource))
01018   {
01019 #if  defined(LL_RCC_SDMMC1_CLKSOURCE_PLLSAI1)
01020     case LL_RCC_SDMMC1_CLKSOURCE_PLLSAI1:    /* PLLSAI1 clock used as SDMMC1 clock source */
01021       if (LL_RCC_PLLSAI1_IsReady() != 0U)
01022       {
01023         if (LL_RCC_PLLSAI1_IsEnabledDomain_48M() != 0U)
01024         {
01025           sdmmc_frequency = RCC_PLLSAI1_GetFreqDomain_48M();
01026         }
01027       }
01028       break;
01029 #endif
01030 
01031     case LL_RCC_SDMMC1_CLKSOURCE_PLL:        /* PLL clock used as SDMMC1 clock source */
01032       if (LL_RCC_PLL_IsReady() != 0U)
01033       {
01034         if (LL_RCC_PLL_IsEnabledDomain_48M() != 0U)
01035         {
01036           sdmmc_frequency = RCC_PLL_GetFreqDomain_48M();
01037         }
01038       }
01039       break;
01040 
01041 #if  defined(LL_RCC_SDMMC1_CLKSOURCE_MSI)
01042     case LL_RCC_SDMMC1_CLKSOURCE_MSI:        /* MSI clock used as SDMMC1 clock source */
01043       if (LL_RCC_MSI_IsReady() != 0U)
01044       {
01045         sdmmc_frequency = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01046                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01047                                      LL_RCC_MSI_GetRange() :
01048                                      LL_RCC_MSI_GetRangeAfterStandby()));
01049       }
01050       break;
01051 #endif
01052 
01053 #if defined(RCC_HSI48_SUPPORT)
01054     case LL_RCC_SDMMC1_CLKSOURCE_HSI48:      /* HSI48 used as SDMMC1 clock source */
01055       if (LL_RCC_HSI48_IsReady() != 0U)
01056       {
01057         sdmmc_frequency = HSI48_VALUE;
01058       }
01059       break;
01060 #else
01061     case LL_RCC_SDMMC1_CLKSOURCE_NONE:       /* No clock used as SDMMC1 clock source */
01062 #endif
01063     default:
01064       sdmmc_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
01065       break;
01066   }
01067 
01068   return sdmmc_frequency;
01069 }
01070 #endif /* SDMMC1 */
01071 
01072 /**
01073   * @brief  Return RNGx clock frequency
01074   * @param  RNGxSource This parameter can be one of the following values:
01075   *         @arg @ref LL_RCC_RNG_CLKSOURCE
01076   * @retval RNG clock frequency (in Hz)
01077   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (MSI) or PLL is not ready
01078   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected
01079   */
01080 uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource)
01081 {
01082   uint32_t rng_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01083 
01084   /* Check parameter */
01085   assert_param(IS_LL_RCC_RNG_CLKSOURCE(RNGxSource));
01086 
01087   /* RNGCLK clock frequency */
01088   switch (LL_RCC_GetRNGClockSource(RNGxSource))
01089   {
01090 #if defined(RCC_PLLSAI1_SUPPORT)
01091     case LL_RCC_RNG_CLKSOURCE_PLLSAI1:       /* PLLSAI1 clock used as RNG clock source */
01092       if (LL_RCC_PLLSAI1_IsReady() != 0U)
01093       {
01094         if (LL_RCC_PLLSAI1_IsEnabledDomain_48M() !=0U)
01095         {
01096           rng_frequency = RCC_PLLSAI1_GetFreqDomain_48M();
01097         }
01098       }
01099       break;
01100 #endif /* RCC_PLLSAI1_SUPPORT */
01101 
01102     case LL_RCC_RNG_CLKSOURCE_PLL:           /* PLL clock used as RNG clock source */
01103       if (LL_RCC_PLL_IsReady() != 0U)
01104       {
01105         if (LL_RCC_PLL_IsEnabledDomain_48M() != 0U)
01106         {
01107           rng_frequency = RCC_PLL_GetFreqDomain_48M();
01108         }
01109       }
01110       break;
01111 
01112     case LL_RCC_RNG_CLKSOURCE_MSI:           /* MSI clock used as RNG clock source */
01113       if (LL_RCC_MSI_IsReady() != 0U)
01114       {
01115         rng_frequency = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01116                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01117                                      LL_RCC_MSI_GetRange() :
01118                                      LL_RCC_MSI_GetRangeAfterStandby()));
01119       }
01120       break;
01121 
01122 
01123 #if defined(RCC_HSI48_SUPPORT)
01124     case LL_RCC_RNG_CLKSOURCE_HSI48:      /* HSI48 used as RNG clock source */
01125       if (LL_RCC_HSI48_IsReady() != 0U)
01126       {
01127         rng_frequency = HSI48_VALUE;
01128       }
01129       break;
01130 #else
01131     case LL_RCC_RNG_CLKSOURCE_NONE:       /* No clock used as RNG clock source */
01132 #endif
01133     default:
01134       rng_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
01135       break;
01136 
01137   }
01138 
01139   return rng_frequency;
01140 }
01141 
01142 
01143 #if   defined(USB_OTG_FS)||defined(USB)
01144 /**
01145   * @brief  Return USBx clock frequency
01146   * @param  USBxSource This parameter can be one of the following values:
01147   *         @arg @ref LL_RCC_USB_CLKSOURCE
01148   * @retval USB clock frequency (in Hz)
01149   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (MSI) or PLL is not ready
01150   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected
01151   */
01152 uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource)
01153 {
01154   uint32_t usb_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01155 
01156   /* Check parameter */
01157   assert_param(IS_LL_RCC_USB_CLKSOURCE(USBxSource));
01158 
01159   /* USBCLK clock frequency */
01160   switch (LL_RCC_GetUSBClockSource(USBxSource))
01161   {
01162 #if defined(RCC_PLLSAI1_SUPPORT)
01163     case LL_RCC_USB_CLKSOURCE_PLLSAI1:       /* PLLSAI1 clock used as USB clock source */
01164       if (LL_RCC_PLLSAI1_IsReady() != 0U)
01165       {
01166         if (LL_RCC_PLLSAI1_IsEnabledDomain_48M() != 0U)
01167         {
01168           usb_frequency = RCC_PLLSAI1_GetFreqDomain_48M();
01169         }
01170       }
01171       break;
01172 #endif /* RCC_PLLSAI1_SUPPORT */
01173 
01174     case LL_RCC_USB_CLKSOURCE_PLL:           /* PLL clock used as USB clock source */
01175       if (LL_RCC_PLL_IsReady() != 0U)
01176       {
01177         if (LL_RCC_PLL_IsEnabledDomain_48M() != 0U)
01178         {
01179           usb_frequency = RCC_PLL_GetFreqDomain_48M();
01180         }
01181       }
01182       break;
01183 
01184     case LL_RCC_USB_CLKSOURCE_MSI:           /* MSI clock used as USB clock source */
01185       if (LL_RCC_MSI_IsReady() != 0U)
01186       {
01187         usb_frequency = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01188                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01189                                      LL_RCC_MSI_GetRange() :
01190                                      LL_RCC_MSI_GetRangeAfterStandby()));
01191       }
01192       break;
01193 
01194 #if defined(RCC_HSI48_SUPPORT)
01195     case LL_RCC_USB_CLKSOURCE_HSI48:      /* HSI48 used as USB clock source */
01196       if (LL_RCC_HSI48_IsReady() != 0U)
01197       {
01198         usb_frequency = HSI48_VALUE;
01199       }
01200       break;
01201 #else
01202     case LL_RCC_USB_CLKSOURCE_NONE:       /* No clock used as USB clock source */
01203 #endif
01204     default:
01205       usb_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
01206       break;
01207   }
01208 
01209   return usb_frequency;
01210 }
01211 #endif /* USB_OTG_FS || USB */
01212 
01213 /**
01214   * @brief  Return ADCx clock frequency
01215   * @param  ADCxSource This parameter can be one of the following values:
01216   *         @arg @ref LL_RCC_ADC_CLKSOURCE
01217   * @retval ADC clock frequency (in Hz)
01218   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (MSI) or PLL is not ready
01219   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected
01220   */
01221 uint32_t LL_RCC_GetADCClockFreq(uint32_t ADCxSource)
01222 {
01223   uint32_t adc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01224 
01225   /* Check parameter */
01226   assert_param(IS_LL_RCC_ADC_CLKSOURCE(ADCxSource));
01227 
01228   /* ADCCLK clock frequency */
01229   switch (LL_RCC_GetADCClockSource(ADCxSource))
01230   {
01231 #if defined(RCC_PLLSAI1_SUPPORT)
01232     case LL_RCC_ADC_CLKSOURCE_PLLSAI1:       /* PLLSAI1 clock used as ADC clock source */
01233       if (LL_RCC_PLLSAI1_IsReady() != 0U)
01234       {
01235         if (LL_RCC_PLLSAI1_IsEnabledDomain_ADC() != 0U)
01236         {
01237           adc_frequency = RCC_PLLSAI1_GetFreqDomain_ADC();
01238         }
01239       }
01240       break;
01241 #endif /* RCC_PLLSAI1_SUPPORT */
01242 
01243 #if defined(RCC_PLLSAI2_SUPPORT) && defined(LL_RCC_ADC_CLKSOURCE_PLLSAI2)
01244     case LL_RCC_ADC_CLKSOURCE_PLLSAI2:       /* PLLSAI2 clock used as ADC clock source */
01245       if (LL_RCC_PLLSAI2_IsReady() != 0U)
01246       {
01247         if (LL_RCC_PLLSAI2_IsEnabledDomain_ADC() != 0U)
01248         {
01249           adc_frequency = RCC_PLLSAI2_GetFreqDomain_ADC();
01250         }
01251       }
01252       break;
01253 #endif /* RCC_PLLSAI2_SUPPORT && LL_RCC_ADC_CLKSOURCE_PLLSAI2 */
01254 
01255     case LL_RCC_ADC_CLKSOURCE_SYSCLK:        /* SYSCLK clock used as ADC clock source */
01256       adc_frequency = RCC_GetSystemClockFreq();
01257       break;
01258 
01259     case LL_RCC_ADC_CLKSOURCE_NONE:          /* No clock used as ADC clock source */
01260     default:
01261       adc_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
01262       break;
01263   }
01264 
01265   return adc_frequency;
01266 }
01267 
01268 #if defined(SWPMI1)
01269 /**
01270   * @brief  Return SWPMIx clock frequency
01271   * @param  SWPMIxSource This parameter can be one of the following values:
01272   *         @arg @ref LL_RCC_SWPMI1_CLKSOURCE
01273   * @retval SWPMI clock frequency (in Hz)
01274   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI) is not ready
01275   */
01276 uint32_t LL_RCC_GetSWPMIClockFreq(uint32_t SWPMIxSource)
01277 {
01278   uint32_t swpmi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01279 
01280   /* Check parameter */
01281   assert_param(IS_LL_RCC_SWPMI_CLKSOURCE(SWPMIxSource));
01282 
01283   /* SWPMI1CLK clock frequency */
01284   switch (LL_RCC_GetSWPMIClockSource(SWPMIxSource))
01285   {
01286     case LL_RCC_SWPMI1_CLKSOURCE_HSI:        /* SWPMI1 Clock is HSI Osc. */
01287       if (LL_RCC_HSI_IsReady())
01288       {
01289         swpmi_frequency = HSI_VALUE;
01290       }
01291       break;
01292 
01293     case LL_RCC_SWPMI1_CLKSOURCE_PCLK1:      /* SWPMI1 Clock is PCLK1 */
01294       swpmi_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
01295       break;
01296 
01297     default:
01298       break;
01299   }
01300 
01301   return swpmi_frequency;
01302 }
01303 #endif /* SWPMI1 */
01304 
01305 #if defined(DFSDM1_Channel0)
01306 /**
01307   * @brief  Return DFSDMx clock frequency
01308   * @param  DFSDMxSource This parameter can be one of the following values:
01309   *         @arg @ref LL_RCC_DFSDM1_CLKSOURCE
01310   * @retval DFSDM clock frequency (in Hz)
01311   */
01312 uint32_t LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource)
01313 {
01314   uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01315 
01316   /* Check parameter */
01317   assert_param(IS_LL_RCC_DFSDM_CLKSOURCE(DFSDMxSource));
01318 
01319   /* DFSDM1CLK clock frequency */
01320   switch (LL_RCC_GetDFSDMClockSource(DFSDMxSource))
01321   {
01322     case LL_RCC_DFSDM1_CLKSOURCE_SYSCLK:     /* DFSDM1 Clock is SYSCLK */
01323       dfsdm_frequency = RCC_GetSystemClockFreq();
01324       break;
01325 
01326     case LL_RCC_DFSDM1_CLKSOURCE_PCLK2:      /* DFSDM1 Clock is PCLK2 */
01327       dfsdm_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
01328       break;
01329 
01330     default:
01331       break;
01332   }
01333 
01334   return dfsdm_frequency;
01335 }
01336 
01337 #if defined(RCC_CCIPR2_DFSDM1SEL)
01338 /**
01339   * @brief  Return DFSDMx Audio clock frequency
01340   * @param  DFSDMxSource This parameter can be one of the following values:
01341   *         @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE
01342   * @retval DFSDM clock frequency (in Hz)
01343   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
01344   */
01345 uint32_t LL_RCC_GetDFSDMAudioClockFreq(uint32_t DFSDMxSource)
01346 {
01347   uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01348 
01349   /* Check parameter */
01350   assert_param(IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(DFSDMxSource));
01351 
01352   /* DFSDM1CLK clock frequency */
01353   switch (LL_RCC_GetDFSDMAudioClockSource(DFSDMxSource))
01354   {
01355     case LL_RCC_DFSDM1_AUDIO_CLKSOURCE_SAI1:     /* SAI1 clock used as DFSDM1 audio clock */
01356       dfsdm_frequency = LL_RCC_GetSAIClockFreq(LL_RCC_SAI1_CLKSOURCE);
01357       break;
01358 
01359     case LL_RCC_DFSDM1_AUDIO_CLKSOURCE_MSI:      /* MSI clock used as DFSDM1 audio clock */
01360       if (LL_RCC_MSI_IsReady() != 0U)
01361       {
01362         dfsdm_frequency = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01363                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01364                                      LL_RCC_MSI_GetRange() :
01365                                      LL_RCC_MSI_GetRangeAfterStandby()));
01366       }
01367       break;
01368 
01369     case LL_RCC_DFSDM1_AUDIO_CLKSOURCE_HSI:      /* HSI clock used as DFSDM1 audio clock */
01370     default:
01371       if (LL_RCC_HSI_IsReady() != 0U)
01372       {
01373         dfsdm_frequency = HSI_VALUE;
01374       }
01375       break;
01376   }
01377 
01378   return dfsdm_frequency;
01379 }
01380 #endif /* RCC_CCIPR2_DFSDM1SEL */
01381 #endif /* DFSDM1_Channel0 */
01382 
01383 #if defined(DSI)
01384 /**
01385   * @brief  Return DSI clock frequency
01386   * @param  DSIxSource This parameter can be one of the following values:
01387   *         @arg @ref LL_RCC_DSI_CLKSOURCE
01388   * @retval DSI clock frequency (in Hz)
01389   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
01390   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NA indicates that external clock is used
01391   */
01392 uint32_t LL_RCC_GetDSIClockFreq(uint32_t DSIxSource)
01393 {
01394   uint32_t dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01395 
01396   /* Check parameter */
01397   assert_param(IS_LL_RCC_DSI_CLKSOURCE(DSIxSource));
01398 
01399   /* DSICLK clock frequency */
01400   switch (LL_RCC_GetDSIClockSource(DSIxSource))
01401   {
01402     case LL_RCC_DSI_CLKSOURCE_PLL:     /* DSI Clock is PLLSAI2 Osc. */
01403       if (LL_RCC_PLLSAI2_IsReady() != 0U)
01404       {
01405         if (LL_RCC_PLLSAI2_IsEnabledDomain_DSI() != 0U)
01406         {
01407           dsi_frequency = RCC_PLLSAI2_GetFreqDomain_DSI();
01408         }
01409       }
01410       break;
01411 
01412     case LL_RCC_DSI_CLKSOURCE_PHY:    /* DSI Clock is DSI physical clock. */
01413     default:
01414       dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
01415       break;
01416   }
01417 
01418   return dsi_frequency;
01419 }
01420 #endif /* DSI */
01421 
01422 #if defined(LTDC)
01423 /**
01424   * @brief  Return LTDC clock frequency
01425   * @param  LTDCxSource This parameter can be one of the following values:
01426   *         @arg @ref LL_RCC_LTDC_CLKSOURCE
01427   * @retval LTDC clock frequency (in Hz)
01428   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator PLLSAI is not ready
01429   */
01430 uint32_t LL_RCC_GetLTDCClockFreq(uint32_t LTDCxSource)
01431 {
01432   uint32_t ltdc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01433 
01434   /* Check parameter */
01435   assert_param(IS_LL_RCC_LTDC_CLKSOURCE(LTDCxSource));
01436 
01437   if (LL_RCC_PLLSAI2_IsReady() != 0U)
01438   {
01439     if (LL_RCC_PLLSAI2_IsEnabledDomain_LTDC() != 0U)
01440     {
01441       ltdc_frequency = RCC_PLLSAI2_GetFreqDomain_LTDC();
01442     }
01443   }
01444 
01445   return ltdc_frequency;
01446 }
01447 #endif /* LTDC */
01448 
01449 #if defined(OCTOSPI1)
01450 /**
01451   * @brief  Return OCTOSPI clock frequency
01452   * @param  OCTOSPIxSource This parameter can be one of the following values:
01453   *         @arg @ref LL_RCC_OCTOSPI_CLKSOURCE
01454   * @retval OCTOSPI clock frequency (in Hz)
01455   *         - @ref  LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator PLLSAI is not ready
01456   */
01457 uint32_t LL_RCC_GetOCTOSPIClockFreq(uint32_t OCTOSPIxSource)
01458 {
01459   uint32_t octospi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01460 
01461   /* Check parameter */
01462   assert_param(IS_LL_RCC_OCTOSPI_CLKSOURCE(OCTOSPIxSource));
01463 
01464   /* OCTOSPI clock frequency */
01465   switch (LL_RCC_GetOCTOSPIClockSource(OCTOSPIxSource))
01466   {
01467     case LL_RCC_OCTOSPI_CLKSOURCE_SYSCLK:   /* OCTOSPI clock is SYSCLK */
01468       octospi_frequency = RCC_GetSystemClockFreq();
01469       break;
01470 
01471     case LL_RCC_OCTOSPI_CLKSOURCE_MSI:      /* MSI clock used as OCTOSPI clock */
01472       if (LL_RCC_MSI_IsReady() != 0U)
01473       {
01474         octospi_frequency = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01475                                      ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01476                                       LL_RCC_MSI_GetRange() :
01477                                       LL_RCC_MSI_GetRangeAfterStandby()));
01478       }
01479       break;
01480 
01481     case LL_RCC_OCTOSPI_CLKSOURCE_PLL:      /* PLL clock used as OCTOSPI source */
01482       if (LL_RCC_PLL_IsReady() != 0U)
01483       {
01484         if (LL_RCC_PLL_IsEnabledDomain_48M() != 0U)
01485         {
01486           octospi_frequency = RCC_PLL_GetFreqDomain_48M();
01487         }
01488       }
01489       break;
01490 
01491     default:
01492       octospi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
01493       break;
01494   }
01495 
01496   return octospi_frequency;
01497 }
01498 #endif /* OCTOSPI1 */
01499 
01500 /**
01501   * @}
01502   */
01503 
01504 /**
01505   * @}
01506   */
01507 
01508 /** @addtogroup RCC_LL_Private_Functions
01509   * @{
01510   */
01511 
01512 /**
01513   * @brief  Return SYSTEM clock frequency
01514   * @retval SYSTEM clock frequency (in Hz)
01515   */
01516 static uint32_t RCC_GetSystemClockFreq(void)
01517 {
01518   uint32_t frequency;
01519 
01520   /* Get SYSCLK source -------------------------------------------------------*/
01521   switch (LL_RCC_GetSysClkSource())
01522   {
01523     case LL_RCC_SYS_CLKSOURCE_STATUS_MSI:  /* MSI used as system clock source */
01524       frequency = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01525                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01526                                      LL_RCC_MSI_GetRange() :
01527                                      LL_RCC_MSI_GetRangeAfterStandby()));
01528       break;
01529 
01530     case LL_RCC_SYS_CLKSOURCE_STATUS_HSI:  /* HSI used as system clock  source */
01531       frequency = HSI_VALUE;
01532       break;
01533 
01534     case LL_RCC_SYS_CLKSOURCE_STATUS_HSE:  /* HSE used as system clock  source */
01535       frequency = HSE_VALUE;
01536       break;
01537 
01538     case LL_RCC_SYS_CLKSOURCE_STATUS_PLL:  /* PLL used as system clock  source */
01539       frequency = RCC_PLL_GetFreqDomain_SYS();
01540       break;
01541 
01542     default:
01543       frequency = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01544                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01545                                      LL_RCC_MSI_GetRange() :
01546                                      LL_RCC_MSI_GetRangeAfterStandby()));
01547       break;
01548   }
01549 
01550   return frequency;
01551 }
01552 
01553 /**
01554   * @brief  Return HCLK clock frequency
01555   * @param  SYSCLK_Frequency SYSCLK clock frequency
01556   * @retval HCLK clock frequency (in Hz)
01557   */
01558 static uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)
01559 {
01560   /* HCLK clock frequency */
01561   return __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler());
01562 }
01563 
01564 /**
01565   * @brief  Return PCLK1 clock frequency
01566   * @param  HCLK_Frequency HCLK clock frequency
01567   * @retval PCLK1 clock frequency (in Hz)
01568   */
01569 static uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)
01570 {
01571   /* PCLK1 clock frequency */
01572   return __LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler());
01573 }
01574 
01575 /**
01576   * @brief  Return PCLK2 clock frequency
01577   * @param  HCLK_Frequency HCLK clock frequency
01578   * @retval PCLK2 clock frequency (in Hz)
01579   */
01580 static uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency)
01581 {
01582   /* PCLK2 clock frequency */
01583   return __LL_RCC_CALC_PCLK2_FREQ(HCLK_Frequency, LL_RCC_GetAPB2Prescaler());
01584 }
01585 
01586 /**
01587   * @brief  Return PLL clock frequency used for system domain
01588   * @retval PLL clock frequency (in Hz)
01589   */
01590 static uint32_t RCC_PLL_GetFreqDomain_SYS(void)
01591 {
01592   uint32_t pllinputfreq, pllsource;
01593 
01594   /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
01595      SYSCLK = PLL_VCO / PLLR
01596   */
01597   pllsource = LL_RCC_PLL_GetMainSource();
01598 
01599   switch (pllsource)
01600   {
01601     case LL_RCC_PLLSOURCE_MSI:  /* MSI used as PLL clock source */
01602       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01603                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01604                                      LL_RCC_MSI_GetRange() :
01605                                      LL_RCC_MSI_GetRangeAfterStandby()));
01606       break;
01607 
01608     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
01609       pllinputfreq = HSI_VALUE;
01610       break;
01611 
01612     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
01613       pllinputfreq = HSE_VALUE;
01614       break;
01615 
01616     default:
01617       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01618                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01619                                      LL_RCC_MSI_GetRange() :
01620                                      LL_RCC_MSI_GetRangeAfterStandby()));
01621       break;
01622   }
01623   return __LL_RCC_CALC_PLLCLK_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
01624                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
01625 }
01626 
01627 #if defined(SAI1)
01628 /**
01629   * @brief  Return PLL clock frequency used for SAI domain
01630   * @retval PLL clock frequency (in Hz)
01631   */
01632 static uint32_t RCC_PLL_GetFreqDomain_SAI(void)
01633 {
01634   uint32_t pllinputfreq, pllsource;
01635 
01636   /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE / PLLM) * PLLN
01637      SAI Domain clock = PLL_VCO / PLLP
01638   */
01639   pllsource = LL_RCC_PLL_GetMainSource();
01640 
01641   switch (pllsource)
01642   {
01643     case LL_RCC_PLLSOURCE_MSI:  /* MSI used as PLL clock source */
01644       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01645                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01646                                      LL_RCC_MSI_GetRange() :
01647                                      LL_RCC_MSI_GetRangeAfterStandby()));
01648       break;
01649 
01650     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
01651       pllinputfreq = HSI_VALUE;
01652       break;
01653 
01654     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
01655       pllinputfreq = HSE_VALUE;
01656       break;
01657 
01658     default:
01659       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01660                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01661                                      LL_RCC_MSI_GetRange() :
01662                                      LL_RCC_MSI_GetRangeAfterStandby()));
01663       break;
01664   }
01665   return __LL_RCC_CALC_PLLCLK_SAI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
01666                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetP());
01667 }
01668 #endif /* SAI1 */
01669 
01670 /**
01671   * @brief  Return PLL clock frequency used for 48 MHz domain
01672   * @retval PLL clock frequency (in Hz)
01673   */
01674 static uint32_t RCC_PLL_GetFreqDomain_48M(void)
01675 {
01676   uint32_t pllinputfreq, pllsource;
01677 
01678   /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
01679      48M Domain clock = PLL_VCO / PLLQ
01680   */
01681   pllsource = LL_RCC_PLL_GetMainSource();
01682 
01683   switch (pllsource)
01684   {
01685     case LL_RCC_PLLSOURCE_MSI:  /* MSI used as PLL clock source */
01686       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01687                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01688                                      LL_RCC_MSI_GetRange() :
01689                                      LL_RCC_MSI_GetRangeAfterStandby()));
01690       break;
01691 
01692     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */
01693       pllinputfreq = HSI_VALUE;
01694       break;
01695 
01696     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */
01697       pllinputfreq = HSE_VALUE;
01698       break;
01699 
01700     default:
01701       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01702                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01703                                      LL_RCC_MSI_GetRange() :
01704                                      LL_RCC_MSI_GetRangeAfterStandby()));
01705       break;
01706   }
01707   return __LL_RCC_CALC_PLLCLK_48M_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
01708                                         LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ());
01709 }
01710 #if defined(DSI)
01711 /**
01712   * @brief  Return PLL clock frequency used for DSI clock
01713   * @retval PLL clock frequency (in Hz)
01714   */
01715 static uint32_t RCC_PLLSAI2_GetFreqDomain_DSI(void)
01716 {
01717   uint32_t pllinputfreq, pllsource;
01718 
01719   /* PLLSAI2_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLSAI2M) * PLLSAI2N */
01720   /* DSICLK = PLLSAI2_VCO / PLLSAI2R */
01721   pllsource = LL_RCC_PLL_GetMainSource();
01722 
01723   switch (pllsource)
01724   {
01725     case LL_RCC_PLLSOURCE_MSI:  /* MSI used as PLLSAI2 clock source */
01726       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01727                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01728                                      LL_RCC_MSI_GetRange() :
01729                                      LL_RCC_MSI_GetRangeAfterStandby()));
01730       break;
01731 
01732     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLLSAI2 clock source */
01733       pllinputfreq = HSI_VALUE;
01734       break;
01735 
01736     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLLSAI2 clock source */
01737       pllinputfreq = HSE_VALUE;
01738       break;
01739 
01740     default:
01741       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01742                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01743                                      LL_RCC_MSI_GetRange() :
01744                                      LL_RCC_MSI_GetRangeAfterStandby()));
01745       break;
01746   }
01747 
01748   return __LL_RCC_CALC_PLLSAI2_DSI_FREQ(pllinputfreq, LL_RCC_PLLSAI2_GetDivider(),
01749                                         LL_RCC_PLLSAI2_GetN(), LL_RCC_PLLSAI2_GetR());
01750 }
01751 #endif /* DSI */
01752 
01753 #if defined(RCC_PLLSAI1_SUPPORT)
01754 /**
01755   * @brief  Return PLLSAI1 clock frequency used for SAI domain
01756   * @retval PLLSAI1 clock frequency (in Hz)
01757   */
01758 static uint32_t RCC_PLLSAI1_GetFreqDomain_SAI(void)
01759 {
01760   uint32_t pllinputfreq, pllsource;
01761 
01762 #if  defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)
01763   /* PLLSAI1_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLSAI1M) * PLLSAI1N */
01764 #else
01765   /* PLLSAI1_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLSAI1N */
01766 #endif
01767   /* SAI Domain clock  = PLLSAI1_VCO / PLLSAI1P */
01768   pllsource = LL_RCC_PLL_GetMainSource();
01769 
01770   switch (pllsource)
01771   {
01772     case LL_RCC_PLLSOURCE_MSI:  /* MSI used as PLLSAI1 clock source */
01773       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01774                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01775                                      LL_RCC_MSI_GetRange() :
01776                                      LL_RCC_MSI_GetRangeAfterStandby()));
01777       break;
01778 
01779     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLLSAI1 clock source */
01780       pllinputfreq = HSI_VALUE;
01781       break;
01782 
01783     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLLSAI1 clock source */
01784       pllinputfreq = HSE_VALUE;
01785       break;
01786 
01787     default:
01788       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01789                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01790                                      LL_RCC_MSI_GetRange() :
01791                                      LL_RCC_MSI_GetRangeAfterStandby()));
01792       break;
01793   }
01794   return __LL_RCC_CALC_PLLSAI1_SAI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
01795                                         LL_RCC_PLLSAI1_GetN(), LL_RCC_PLLSAI1_GetP());
01796 }
01797 
01798 /**
01799   * @brief  Return PLLSAI1 clock frequency used for 48Mhz domain
01800   * @retval PLLSAI1 clock frequency (in Hz)
01801   */
01802 static uint32_t RCC_PLLSAI1_GetFreqDomain_48M(void)
01803 {
01804   uint32_t pllinputfreq, pllsource;
01805 
01806 #if  defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)
01807   /* PLLSAI1_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLSAI1M) * PLLSAI1N */
01808 #else
01809   /* PLLSAI1_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLSAI1N */
01810 #endif
01811   /* 48M Domain clock  = PLLSAI1_VCO / PLLSAI1Q */
01812   pllsource = LL_RCC_PLL_GetMainSource();
01813 
01814   switch (pllsource)
01815   {
01816     case LL_RCC_PLLSOURCE_MSI:  /* MSI used as PLLSAI1 clock source */
01817       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01818                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01819                                      LL_RCC_MSI_GetRange() :
01820                                      LL_RCC_MSI_GetRangeAfterStandby()));
01821       break;
01822 
01823     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLLSAI1 clock source */
01824       pllinputfreq = HSI_VALUE;
01825       break;
01826 
01827     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLLSAI1 clock source */
01828       pllinputfreq = HSE_VALUE;
01829       break;
01830 
01831     default:
01832       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01833                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01834                                      LL_RCC_MSI_GetRange() :
01835                                      LL_RCC_MSI_GetRangeAfterStandby()));
01836       break;
01837   }
01838   return __LL_RCC_CALC_PLLSAI1_48M_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
01839                                         LL_RCC_PLLSAI1_GetN(), LL_RCC_PLLSAI1_GetQ());
01840 }
01841 
01842 /**
01843   * @brief  Return PLLSAI1 clock frequency used for ADC domain
01844   * @retval PLLSAI1 clock frequency (in Hz)
01845   */
01846 static uint32_t RCC_PLLSAI1_GetFreqDomain_ADC(void)
01847 {
01848   uint32_t pllinputfreq, pllsource;
01849 
01850 #if  defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)
01851   /* PLLSAI1_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLSAI1M) * PLLSAI1N */
01852 #else
01853   /* PLLSAI1_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLSAI1N */
01854 #endif
01855   /* 48M Domain clock  = PLLSAI1_VCO / PLLSAI1R */
01856   pllsource = LL_RCC_PLL_GetMainSource();
01857 
01858   switch (pllsource)
01859   {
01860     case LL_RCC_PLLSOURCE_MSI:  /* MSI used as PLLSAI1 clock source */
01861       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01862                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01863                                      LL_RCC_MSI_GetRange() :
01864                                      LL_RCC_MSI_GetRangeAfterStandby()));
01865       break;
01866 
01867     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLLSAI1 clock source */
01868       pllinputfreq = HSI_VALUE;
01869       break;
01870 
01871     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLLSAI1 clock source */
01872       pllinputfreq = HSE_VALUE;
01873       break;
01874 
01875     default:
01876       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01877                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01878                                      LL_RCC_MSI_GetRange() :
01879                                      LL_RCC_MSI_GetRangeAfterStandby()));
01880       break;
01881   }
01882   return __LL_RCC_CALC_PLLSAI1_ADC_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
01883                                         LL_RCC_PLLSAI1_GetN(), LL_RCC_PLLSAI1_GetR());
01884 }
01885 #endif /* RCC_PLLSAI1_SUPPORT */
01886 
01887 #if defined(RCC_PLLSAI2_SUPPORT)
01888 /**
01889   * @brief  Return PLLSAI2 clock frequency used for SAI domain
01890   * @retval PLLSAI2 clock frequency (in Hz)
01891   */
01892 static uint32_t RCC_PLLSAI2_GetFreqDomain_SAI(void)
01893 {
01894   uint32_t pllinputfreq, pllsource;
01895 
01896 #if  defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)
01897   /* PLLSAI2_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLSAI2M) * PLLSAI2N */
01898 #else
01899   /* PLLSAI2_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLSAI2N */
01900 #endif
01901   /* SAI Domain clock  = PLLSAI2_VCO / PLLSAI2P */
01902   pllsource = LL_RCC_PLL_GetMainSource();
01903 
01904   switch (pllsource)
01905   {
01906     case LL_RCC_PLLSOURCE_MSI:  /* MSI used as PLLSAI2 clock source */
01907       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01908                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01909                                      LL_RCC_MSI_GetRange() :
01910                                      LL_RCC_MSI_GetRangeAfterStandby()));
01911       break;
01912 
01913     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLLSAI2 clock source */
01914       pllinputfreq = HSI_VALUE;
01915       break;
01916 
01917     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLLSAI2 clock source */
01918       pllinputfreq = HSE_VALUE;
01919       break;
01920 
01921     default:
01922       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01923                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01924                                      LL_RCC_MSI_GetRange() :
01925                                      LL_RCC_MSI_GetRangeAfterStandby()));
01926       break;
01927   }
01928 #if defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)
01929   return __LL_RCC_CALC_PLLSAI2_SAI_FREQ(pllinputfreq, LL_RCC_PLLSAI2_GetDivider(),
01930                                         LL_RCC_PLLSAI2_GetN(), LL_RCC_PLLSAI2_GetP());
01931 #else
01932   return __LL_RCC_CALC_PLLSAI2_SAI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
01933                                         LL_RCC_PLLSAI2_GetN(), LL_RCC_PLLSAI2_GetP());
01934 #endif
01935 }
01936 
01937 #if  defined(LTDC)
01938 /**
01939   * @brief  Return PLLSAI2 clock frequency used for LTDC domain
01940   * @retval PLLSAI2 clock frequency (in Hz)
01941   */
01942 static uint32_t RCC_PLLSAI2_GetFreqDomain_LTDC(void)
01943 {
01944   uint32_t pllinputfreq, pllsource;
01945 
01946   /* PLLSAI2_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLSAI2M) * PLLSAI2N */
01947   /* LTDC Domain clock  = (PLLSAI2_VCO / PLLSAI2R) / PLLSAI2DIVR */
01948   pllsource = LL_RCC_PLL_GetMainSource();
01949 
01950   switch (pllsource)
01951   {
01952     case LL_RCC_PLLSOURCE_MSI:  /* MSI used as PLLSAI2 clock source */
01953       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01954                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01955                                      LL_RCC_MSI_GetRange() :
01956                                      LL_RCC_MSI_GetRangeAfterStandby()));
01957       break;
01958 
01959     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLLSAI2 clock source */
01960       pllinputfreq = HSI_VALUE;
01961       break;
01962 
01963     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLLSAI2 clock source */
01964       pllinputfreq = HSE_VALUE;
01965       break;
01966 
01967     default:
01968       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01969                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01970                                      LL_RCC_MSI_GetRange() :
01971                                      LL_RCC_MSI_GetRangeAfterStandby()));
01972       break;
01973   }
01974 
01975   return __LL_RCC_CALC_PLLSAI2_LTDC_FREQ(pllinputfreq, LL_RCC_PLLSAI2_GetDivider(),
01976                                          LL_RCC_PLLSAI2_GetN(), LL_RCC_PLLSAI2_GetR(), LL_RCC_PLLSAI2_GetDIVR());
01977 }
01978 
01979 #else
01980 
01981   /**
01982   * @brief  Return PLLSAI2 clock frequency used for ADC domain
01983   * @retval PLLSAI2 clock frequency (in Hz)
01984   */
01985 static uint32_t RCC_PLLSAI2_GetFreqDomain_ADC(void)
01986 {
01987   uint32_t pllinputfreq = 0U, pllsource = 0U;
01988 
01989   /* PLLSAI2_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLSAI2N */
01990   /* 48M Domain clock  = PLLSAI2_VCO / PLLSAI2R */
01991   pllsource = LL_RCC_PLL_GetMainSource();
01992 
01993   switch (pllsource)
01994   {
01995     case LL_RCC_PLLSOURCE_MSI:  /* MSI used as PLLSAI2 clock source */
01996       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
01997                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
01998                                      LL_RCC_MSI_GetRange() :
01999                                      LL_RCC_MSI_GetRangeAfterStandby()));
02000       break;
02001 
02002     case LL_RCC_PLLSOURCE_HSI:  /* HSI used as PLLSAI2 clock source */
02003       pllinputfreq = HSI_VALUE;
02004       break;
02005 
02006     case LL_RCC_PLLSOURCE_HSE:  /* HSE used as PLLSAI2 clock source */
02007       pllinputfreq = HSE_VALUE;
02008       break;
02009 
02010     default:
02011       pllinputfreq = __LL_RCC_CALC_MSI_FREQ(LL_RCC_MSI_IsEnabledRangeSelect(),
02012                                     ((LL_RCC_MSI_IsEnabledRangeSelect() != 0U) ?
02013                                      LL_RCC_MSI_GetRange() :
02014                                      LL_RCC_MSI_GetRangeAfterStandby()));
02015       break;
02016   }
02017   return __LL_RCC_CALC_PLLSAI2_ADC_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
02018                                         LL_RCC_PLLSAI2_GetN(), LL_RCC_PLLSAI2_GetR());
02019 }
02020 #endif /* LTDC */
02021 
02022 #endif /*RCC_PLLSAI2_SUPPORT*/
02023 
02024 /**
02025   * @}
02026   */
02027 
02028 /**
02029   * @}
02030   */
02031 
02032 #endif /* defined(RCC) */
02033 
02034 /**
02035   * @}
02036   */
02037 
02038 #endif /* USE_FULL_LL_DRIVER */
02039