STM32L443xx HAL User Manual
|
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