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