stm32f7xx_ll_rcc.c 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594
  1. /**
  2. ******************************************************************************
  3. * @file stm32f7xx_ll_rcc.c
  4. * @author MCD Application Team
  5. * @brief RCC LL module driver.
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
  10. *
  11. * Redistribution and use in source and binary forms, with or without modification,
  12. * are permitted provided that the following conditions are met:
  13. * 1. Redistributions of source code must retain the above copyright notice,
  14. * this list of conditions and the following disclaimer.
  15. * 2. Redistributions in binary form must reproduce the above copyright notice,
  16. * this list of conditions and the following disclaimer in the documentation
  17. * and/or other materials provided with the distribution.
  18. * 3. Neither the name of STMicroelectronics nor the names of its contributors
  19. * may be used to endorse or promote products derived from this software
  20. * without specific prior written permission.
  21. *
  22. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  23. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  25. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  26. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  28. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  29. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  30. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  31. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  32. *
  33. ******************************************************************************
  34. */
  35. #if defined(USE_FULL_LL_DRIVER)
  36. /* Includes ------------------------------------------------------------------*/
  37. #include "stm32f7xx_ll_rcc.h"
  38. #ifdef USE_FULL_ASSERT
  39. #include "stm32_assert.h"
  40. #else
  41. #define assert_param(expr) ((void)0U)
  42. #endif
  43. /** @addtogroup STM32F7xx_LL_Driver
  44. * @{
  45. */
  46. #if defined(RCC)
  47. /** @addtogroup RCC_LL
  48. * @{
  49. */
  50. /* Private types -------------------------------------------------------------*/
  51. /* Private variables ---------------------------------------------------------*/
  52. /* Private constants ---------------------------------------------------------*/
  53. /* Private macros ------------------------------------------------------------*/
  54. /** @addtogroup RCC_LL_Private_Macros
  55. * @{
  56. */
  57. #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \
  58. || ((__VALUE__) == LL_RCC_USART2_CLKSOURCE) \
  59. || ((__VALUE__) == LL_RCC_USART3_CLKSOURCE) \
  60. || ((__VALUE__) == LL_RCC_USART6_CLKSOURCE))
  61. #define IS_LL_RCC_UART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_UART4_CLKSOURCE) \
  62. || ((__VALUE__) == LL_RCC_UART5_CLKSOURCE) \
  63. || ((__VALUE__) == LL_RCC_UART7_CLKSOURCE) \
  64. || ((__VALUE__) == LL_RCC_UART8_CLKSOURCE))
  65. #if defined(I2C4)
  66. #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
  67. || ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE) \
  68. || ((__VALUE__) == LL_RCC_I2C3_CLKSOURCE) \
  69. || ((__VALUE__) == LL_RCC_I2C4_CLKSOURCE))
  70. #else
  71. #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
  72. || ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE) \
  73. || ((__VALUE__) == LL_RCC_I2C3_CLKSOURCE))
  74. #endif /* I2C4 */
  75. #define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE))
  76. #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \
  77. || ((__VALUE__) == LL_RCC_SAI2_CLKSOURCE))
  78. #if defined(SDMMC2)
  79. #define IS_LL_RCC_SDMMC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SDMMC1_CLKSOURCE) \
  80. || ((__VALUE__) == LL_RCC_SDMMC2_CLKSOURCE))
  81. #else
  82. #define IS_LL_RCC_SDMMC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SDMMC1_CLKSOURCE))
  83. #endif /* SDMMC2 */
  84. #define IS_LL_RCC_RNG_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_RNG_CLKSOURCE))
  85. #define IS_LL_RCC_USB_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USB_CLKSOURCE))
  86. #if defined(DFSDM1_Channel0)
  87. #define IS_LL_RCC_DFSDM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DFSDM1_CLKSOURCE))
  88. #define IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DFSDM1_AUDIO_CLKSOURCE))
  89. #endif /* DFSDM1_Channel0 */
  90. #define IS_LL_RCC_I2S_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2S1_CLKSOURCE))
  91. #if defined(CEC)
  92. #define IS_LL_RCC_CEC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_CEC_CLKSOURCE))
  93. #endif /* CEC */
  94. #if defined(DSI)
  95. #define IS_LL_RCC_DSI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DSI_CLKSOURCE))
  96. #endif /* DSI */
  97. #if defined(LTDC)
  98. #define IS_LL_RCC_LTDC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LTDC_CLKSOURCE))
  99. #endif /* LTDC */
  100. #if defined(SPDIFRX)
  101. #define IS_LL_RCC_SPDIFRX_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SPDIFRX1_CLKSOURCE))
  102. #endif /* SPDIFRX */
  103. /**
  104. * @}
  105. */
  106. /* Private function prototypes -----------------------------------------------*/
  107. /** @defgroup RCC_LL_Private_Functions RCC Private functions
  108. * @{
  109. */
  110. uint32_t RCC_GetSystemClockFreq(void);
  111. uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency);
  112. uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency);
  113. uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency);
  114. uint32_t RCC_PLL_GetFreqDomain_SYS(void);
  115. uint32_t RCC_PLL_GetFreqDomain_SAI(void);
  116. uint32_t RCC_PLL_GetFreqDomain_48M(void);
  117. #if defined(DSI)
  118. uint32_t RCC_PLL_GetFreqDomain_DSI(void);
  119. #endif /* DSI */
  120. uint32_t RCC_PLLSAI_GetFreqDomain_SAI(void);
  121. uint32_t RCC_PLLSAI_GetFreqDomain_48M(void);
  122. #if defined(LTDC)
  123. uint32_t RCC_PLLSAI_GetFreqDomain_LTDC(void);
  124. #endif /* LTDC */
  125. uint32_t RCC_PLLI2S_GetFreqDomain_I2S(void);
  126. uint32_t RCC_PLLI2S_GetFreqDomain_SAI(void);
  127. #if defined(SPDIFRX)
  128. uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void);
  129. #endif /* SPDIFRX */
  130. /**
  131. * @}
  132. */
  133. /* Exported functions --------------------------------------------------------*/
  134. /** @addtogroup RCC_LL_Exported_Functions
  135. * @{
  136. */
  137. /** @addtogroup RCC_LL_EF_Init
  138. * @{
  139. */
  140. /**
  141. * @brief Reset the RCC clock configuration to the default reset state.
  142. * @note The default reset state of the clock configuration is given below:
  143. * - HSI ON and used as system clock source
  144. * - HSE, PLL, PLLI2S, PLLSAI OFF
  145. * - AHB, APB1 and APB2 prescaler set to 1.
  146. * - CSS, MCO OFF
  147. * - All interrupts disabled
  148. * @note This function doesn't modify the configuration of the
  149. * - Peripheral clocks
  150. * - LSI, LSE and RTC clocks
  151. * @retval An ErrorStatus enumeration value:
  152. * - SUCCESS: RCC registers are de-initialized
  153. * - ERROR: not applicable
  154. */
  155. ErrorStatus LL_RCC_DeInit(void)
  156. {
  157. uint32_t vl_mask = 0xFFFFFFFFU;
  158. /* Set HSION bit */
  159. LL_RCC_HSI_Enable();
  160. /* Wait for HSI READY bit */
  161. while(LL_RCC_HSI_IsReady() != 1U)
  162. {}
  163. /* Reset CFGR register */
  164. LL_RCC_WriteReg(CFGR, 0x00000000U);
  165. /* Reset HSEON, HSEBYP, PLLON, CSSON, PLLI2SON and PLLSAION bits */
  166. CLEAR_BIT(vl_mask, (RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_PLLON | RCC_CR_CSSON | RCC_CR_PLLSAION | RCC_CR_PLLI2SON));
  167. /* Write new mask in CR register */
  168. LL_RCC_WriteReg(CR, vl_mask);
  169. /* Set HSITRIM bits to the reset value*/
  170. LL_RCC_HSI_SetCalibTrimming(0x10U);
  171. /* Wait for PLL READY bit to be reset */
  172. while(LL_RCC_PLL_IsReady() != 0U)
  173. {}
  174. /* Wait for PLLI2S READY bit to be reset */
  175. while(LL_RCC_PLLI2S_IsReady() != 0U)
  176. {}
  177. /* Wait for PLLSAI READY bit to be reset */
  178. while(LL_RCC_PLLSAI_IsReady() != 0U)
  179. {}
  180. /* Reset PLLCFGR register */
  181. LL_RCC_WriteReg(PLLCFGR, 0x24003010U);
  182. /* Reset PLLI2SCFGR register */
  183. LL_RCC_WriteReg(PLLI2SCFGR, 0x24003000U);
  184. /* Reset PLLSAICFGR register */
  185. LL_RCC_WriteReg(PLLSAICFGR, 0x24003000U);
  186. /* Disable all interrupts */
  187. CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE | RCC_CIR_LSERDYIE | RCC_CIR_HSIRDYIE | RCC_CIR_HSERDYIE | RCC_CIR_PLLRDYIE | RCC_CIR_PLLI2SRDYIE | RCC_CIR_PLLSAIRDYIE);
  188. /* Clear all interrupt flags */
  189. SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC | RCC_CIR_LSERDYC | RCC_CIR_HSIRDYC | RCC_CIR_HSERDYC | RCC_CIR_PLLRDYC | RCC_CIR_PLLI2SRDYC | RCC_CIR_PLLSAIRDYC | RCC_CIR_CSSC);
  190. /* Clear LSION bit */
  191. CLEAR_BIT(RCC->CSR, RCC_CSR_LSION);
  192. /* Reset all CSR flags */
  193. SET_BIT(RCC->CSR, RCC_CSR_RMVF);
  194. return SUCCESS;
  195. }
  196. /**
  197. * @}
  198. */
  199. /** @addtogroup RCC_LL_EF_Get_Freq
  200. * @brief Return the frequencies of different on chip clocks; System, AHB, APB1 and APB2 buses clocks
  201. * and different peripheral clocks available on the device.
  202. * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(**)
  203. * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(***)
  204. * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(***)
  205. * or HSI_VALUE(**) multiplied/divided by the PLL factors.
  206. * @note (**) HSI_VALUE is a constant defined in this file (default value
  207. * 16 MHz) but the real value may vary depending on the variations
  208. * in voltage and temperature.
  209. * @note (***) HSE_VALUE is a constant defined in this file (default value
  210. * 25 MHz), user has to ensure that HSE_VALUE is same as the real
  211. * frequency of the crystal used. Otherwise, this function may
  212. * have wrong result.
  213. * @note The result of this function could be incorrect when using fractional
  214. * value for HSE crystal.
  215. * @note This function can be used by the user application to compute the
  216. * baud-rate for the communication peripherals or configure other parameters.
  217. * @{
  218. */
  219. /**
  220. * @brief Return the frequencies of different on chip clocks; System, AHB, APB1 and APB2 buses clocks
  221. * @note Each time SYSCLK, HCLK, PCLK1 and/or PCLK2 clock changes, this function
  222. * must be called to update structure fields. Otherwise, any
  223. * configuration based on this function will be incorrect.
  224. * @param RCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies
  225. * @retval None
  226. */
  227. void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks)
  228. {
  229. /* Get SYSCLK frequency */
  230. RCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq();
  231. /* HCLK clock frequency */
  232. RCC_Clocks->HCLK_Frequency = RCC_GetHCLKClockFreq(RCC_Clocks->SYSCLK_Frequency);
  233. /* PCLK1 clock frequency */
  234. RCC_Clocks->PCLK1_Frequency = RCC_GetPCLK1ClockFreq(RCC_Clocks->HCLK_Frequency);
  235. /* PCLK2 clock frequency */
  236. RCC_Clocks->PCLK2_Frequency = RCC_GetPCLK2ClockFreq(RCC_Clocks->HCLK_Frequency);
  237. }
  238. /**
  239. * @brief Return USARTx clock frequency
  240. * @param USARTxSource This parameter can be one of the following values:
  241. * @arg @ref LL_RCC_USART1_CLKSOURCE
  242. * @arg @ref LL_RCC_USART2_CLKSOURCE
  243. * @arg @ref LL_RCC_USART3_CLKSOURCE
  244. * @arg @ref LL_RCC_USART6_CLKSOURCE
  245. * @retval USART clock frequency (in Hz)
  246. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
  247. */
  248. uint32_t LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource)
  249. {
  250. uint32_t usart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  251. /* Check parameter */
  252. assert_param(IS_LL_RCC_USART_CLKSOURCE(USARTxSource));
  253. if (USARTxSource == LL_RCC_USART1_CLKSOURCE)
  254. {
  255. /* USART1CLK clock frequency */
  256. switch (LL_RCC_GetUSARTClockSource(USARTxSource))
  257. {
  258. case LL_RCC_USART1_CLKSOURCE_SYSCLK: /* USART1 Clock is System Clock */
  259. usart_frequency = RCC_GetSystemClockFreq();
  260. break;
  261. case LL_RCC_USART1_CLKSOURCE_HSI: /* USART1 Clock is HSI Osc. */
  262. if (LL_RCC_HSI_IsReady())
  263. {
  264. usart_frequency = HSI_VALUE;
  265. }
  266. break;
  267. case LL_RCC_USART1_CLKSOURCE_LSE: /* USART1 Clock is LSE Osc. */
  268. if (LL_RCC_LSE_IsReady())
  269. {
  270. usart_frequency = LSE_VALUE;
  271. }
  272. break;
  273. case LL_RCC_USART1_CLKSOURCE_PCLK2: /* USART1 Clock is PCLK2 */
  274. default:
  275. usart_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  276. break;
  277. }
  278. }
  279. else if (USARTxSource == LL_RCC_USART2_CLKSOURCE)
  280. {
  281. /* USART2CLK clock frequency */
  282. switch (LL_RCC_GetUSARTClockSource(USARTxSource))
  283. {
  284. case LL_RCC_USART2_CLKSOURCE_SYSCLK: /* USART2 Clock is System Clock */
  285. usart_frequency = RCC_GetSystemClockFreq();
  286. break;
  287. case LL_RCC_USART2_CLKSOURCE_HSI: /* USART2 Clock is HSI Osc. */
  288. if (LL_RCC_HSI_IsReady())
  289. {
  290. usart_frequency = HSI_VALUE;
  291. }
  292. break;
  293. case LL_RCC_USART2_CLKSOURCE_LSE: /* USART2 Clock is LSE Osc. */
  294. if (LL_RCC_LSE_IsReady())
  295. {
  296. usart_frequency = LSE_VALUE;
  297. }
  298. break;
  299. case LL_RCC_USART2_CLKSOURCE_PCLK1: /* USART2 Clock is PCLK1 */
  300. default:
  301. usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  302. break;
  303. }
  304. }
  305. else if (USARTxSource == LL_RCC_USART6_CLKSOURCE)
  306. {
  307. /* USART6CLK clock frequency */
  308. switch (LL_RCC_GetUSARTClockSource(USARTxSource))
  309. {
  310. case LL_RCC_USART6_CLKSOURCE_SYSCLK: /* USART6 Clock is System Clock */
  311. usart_frequency = RCC_GetSystemClockFreq();
  312. break;
  313. case LL_RCC_USART6_CLKSOURCE_HSI: /* USART6 Clock is HSI Osc. */
  314. if (LL_RCC_HSI_IsReady())
  315. {
  316. usart_frequency = HSI_VALUE;
  317. }
  318. break;
  319. case LL_RCC_USART6_CLKSOURCE_LSE: /* USART6 Clock is LSE Osc. */
  320. if (LL_RCC_LSE_IsReady())
  321. {
  322. usart_frequency = LSE_VALUE;
  323. }
  324. break;
  325. case LL_RCC_USART6_CLKSOURCE_PCLK2: /* USART6 Clock is PCLK2 */
  326. default:
  327. usart_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  328. break;
  329. }
  330. }
  331. else
  332. {
  333. if (USARTxSource == LL_RCC_USART3_CLKSOURCE)
  334. {
  335. /* USART3CLK clock frequency */
  336. switch (LL_RCC_GetUSARTClockSource(USARTxSource))
  337. {
  338. case LL_RCC_USART3_CLKSOURCE_SYSCLK: /* USART3 Clock is System Clock */
  339. usart_frequency = RCC_GetSystemClockFreq();
  340. break;
  341. case LL_RCC_USART3_CLKSOURCE_HSI: /* USART3 Clock is HSI Osc. */
  342. if (LL_RCC_HSI_IsReady())
  343. {
  344. usart_frequency = HSI_VALUE;
  345. }
  346. break;
  347. case LL_RCC_USART3_CLKSOURCE_LSE: /* USART3 Clock is LSE Osc. */
  348. if (LL_RCC_LSE_IsReady())
  349. {
  350. usart_frequency = LSE_VALUE;
  351. }
  352. break;
  353. case LL_RCC_USART3_CLKSOURCE_PCLK1: /* USART3 Clock is PCLK1 */
  354. default:
  355. usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  356. break;
  357. }
  358. }
  359. }
  360. return usart_frequency;
  361. }
  362. /**
  363. * @brief Return UARTx clock frequency
  364. * @param UARTxSource This parameter can be one of the following values:
  365. * @arg @ref LL_RCC_UART4_CLKSOURCE
  366. * @arg @ref LL_RCC_UART5_CLKSOURCE
  367. * @arg @ref LL_RCC_UART7_CLKSOURCE
  368. * @arg @ref LL_RCC_UART8_CLKSOURCE
  369. * @retval UART clock frequency (in Hz)
  370. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
  371. */
  372. uint32_t LL_RCC_GetUARTClockFreq(uint32_t UARTxSource)
  373. {
  374. uint32_t uart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  375. /* Check parameter */
  376. assert_param(IS_LL_RCC_UART_CLKSOURCE(UARTxSource));
  377. if (UARTxSource == LL_RCC_UART4_CLKSOURCE)
  378. {
  379. /* UART4CLK clock frequency */
  380. switch (LL_RCC_GetUARTClockSource(UARTxSource))
  381. {
  382. case LL_RCC_UART4_CLKSOURCE_SYSCLK: /* UART4 Clock is System Clock */
  383. uart_frequency = RCC_GetSystemClockFreq();
  384. break;
  385. case LL_RCC_UART4_CLKSOURCE_HSI: /* UART4 Clock is HSI Osc. */
  386. if (LL_RCC_HSI_IsReady())
  387. {
  388. uart_frequency = HSI_VALUE;
  389. }
  390. break;
  391. case LL_RCC_UART4_CLKSOURCE_LSE: /* UART4 Clock is LSE Osc. */
  392. if (LL_RCC_LSE_IsReady())
  393. {
  394. uart_frequency = LSE_VALUE;
  395. }
  396. break;
  397. case LL_RCC_UART4_CLKSOURCE_PCLK1: /* UART4 Clock is PCLK1 */
  398. default:
  399. uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  400. break;
  401. }
  402. }
  403. else if (UARTxSource == LL_RCC_UART5_CLKSOURCE)
  404. {
  405. /* UART5CLK clock frequency */
  406. switch (LL_RCC_GetUARTClockSource(UARTxSource))
  407. {
  408. case LL_RCC_UART5_CLKSOURCE_SYSCLK: /* UART5 Clock is System Clock */
  409. uart_frequency = RCC_GetSystemClockFreq();
  410. break;
  411. case LL_RCC_UART5_CLKSOURCE_HSI: /* UART5 Clock is HSI Osc. */
  412. if (LL_RCC_HSI_IsReady())
  413. {
  414. uart_frequency = HSI_VALUE;
  415. }
  416. break;
  417. case LL_RCC_UART5_CLKSOURCE_LSE: /* UART5 Clock is LSE Osc. */
  418. if (LL_RCC_LSE_IsReady())
  419. {
  420. uart_frequency = LSE_VALUE;
  421. }
  422. break;
  423. case LL_RCC_UART5_CLKSOURCE_PCLK1: /* UART5 Clock is PCLK1 */
  424. default:
  425. uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  426. break;
  427. }
  428. }
  429. else if (UARTxSource == LL_RCC_UART7_CLKSOURCE)
  430. {
  431. /* UART7CLK clock frequency */
  432. switch (LL_RCC_GetUARTClockSource(UARTxSource))
  433. {
  434. case LL_RCC_UART7_CLKSOURCE_SYSCLK: /* UART7 Clock is System Clock */
  435. uart_frequency = RCC_GetSystemClockFreq();
  436. break;
  437. case LL_RCC_UART7_CLKSOURCE_HSI: /* UART7 Clock is HSI Osc. */
  438. if (LL_RCC_HSI_IsReady())
  439. {
  440. uart_frequency = HSI_VALUE;
  441. }
  442. break;
  443. case LL_RCC_UART7_CLKSOURCE_LSE: /* UART7 Clock is LSE Osc. */
  444. if (LL_RCC_LSE_IsReady())
  445. {
  446. uart_frequency = LSE_VALUE;
  447. }
  448. break;
  449. case LL_RCC_UART7_CLKSOURCE_PCLK1: /* UART7 Clock is PCLK1 */
  450. default:
  451. uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  452. break;
  453. }
  454. }
  455. else
  456. {
  457. if (UARTxSource == LL_RCC_UART8_CLKSOURCE)
  458. {
  459. /* UART8CLK clock frequency */
  460. switch (LL_RCC_GetUARTClockSource(UARTxSource))
  461. {
  462. case LL_RCC_UART8_CLKSOURCE_SYSCLK: /* UART8 Clock is System Clock */
  463. uart_frequency = RCC_GetSystemClockFreq();
  464. break;
  465. case LL_RCC_UART8_CLKSOURCE_HSI: /* UART8 Clock is HSI Osc. */
  466. if (LL_RCC_HSI_IsReady())
  467. {
  468. uart_frequency = HSI_VALUE;
  469. }
  470. break;
  471. case LL_RCC_UART8_CLKSOURCE_LSE: /* UART8 Clock is LSE Osc. */
  472. if (LL_RCC_LSE_IsReady())
  473. {
  474. uart_frequency = LSE_VALUE;
  475. }
  476. break;
  477. case LL_RCC_UART8_CLKSOURCE_PCLK1: /* UART8 Clock is PCLK1 */
  478. default:
  479. uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  480. break;
  481. }
  482. }
  483. }
  484. return uart_frequency;
  485. }
  486. /**
  487. * @brief Return I2Cx clock frequency
  488. * @param I2CxSource This parameter can be one of the following values:
  489. * @arg @ref LL_RCC_I2C1_CLKSOURCE
  490. * @arg @ref LL_RCC_I2C2_CLKSOURCE
  491. * @arg @ref LL_RCC_I2C3_CLKSOURCE
  492. * @arg @ref LL_RCC_I2C4_CLKSOURCE (*)
  493. *
  494. * (*) value not defined in all devices.
  495. * @retval I2C clock frequency (in Hz)
  496. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that HSI oscillator is not ready
  497. */
  498. uint32_t LL_RCC_GetI2CClockFreq(uint32_t I2CxSource)
  499. {
  500. uint32_t i2c_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  501. /* Check parameter */
  502. assert_param(IS_LL_RCC_I2C_CLKSOURCE(I2CxSource));
  503. if (I2CxSource == LL_RCC_I2C1_CLKSOURCE)
  504. {
  505. /* I2C1 CLK clock frequency */
  506. switch (LL_RCC_GetI2CClockSource(I2CxSource))
  507. {
  508. case LL_RCC_I2C1_CLKSOURCE_SYSCLK: /* I2C1 Clock is System Clock */
  509. i2c_frequency = RCC_GetSystemClockFreq();
  510. break;
  511. case LL_RCC_I2C1_CLKSOURCE_HSI: /* I2C1 Clock is HSI Osc. */
  512. if (LL_RCC_HSI_IsReady())
  513. {
  514. i2c_frequency = HSI_VALUE;
  515. }
  516. break;
  517. case LL_RCC_I2C1_CLKSOURCE_PCLK1: /* I2C1 Clock is PCLK1 */
  518. default:
  519. i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  520. break;
  521. }
  522. }
  523. else if (I2CxSource == LL_RCC_I2C2_CLKSOURCE)
  524. {
  525. /* I2C2 CLK clock frequency */
  526. switch (LL_RCC_GetI2CClockSource(I2CxSource))
  527. {
  528. case LL_RCC_I2C2_CLKSOURCE_SYSCLK: /* I2C2 Clock is System Clock */
  529. i2c_frequency = RCC_GetSystemClockFreq();
  530. break;
  531. case LL_RCC_I2C2_CLKSOURCE_HSI: /* I2C2 Clock is HSI Osc. */
  532. if (LL_RCC_HSI_IsReady())
  533. {
  534. i2c_frequency = HSI_VALUE;
  535. }
  536. break;
  537. case LL_RCC_I2C2_CLKSOURCE_PCLK1: /* I2C2 Clock is PCLK1 */
  538. default:
  539. i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  540. break;
  541. }
  542. }
  543. else if (I2CxSource == LL_RCC_I2C3_CLKSOURCE)
  544. {
  545. /* I2C3 CLK clock frequency */
  546. switch (LL_RCC_GetI2CClockSource(I2CxSource))
  547. {
  548. case LL_RCC_I2C3_CLKSOURCE_SYSCLK: /* I2C3 Clock is System Clock */
  549. i2c_frequency = RCC_GetSystemClockFreq();
  550. break;
  551. case LL_RCC_I2C3_CLKSOURCE_HSI: /* I2C3 Clock is HSI Osc. */
  552. if (LL_RCC_HSI_IsReady())
  553. {
  554. i2c_frequency = HSI_VALUE;
  555. }
  556. break;
  557. case LL_RCC_I2C3_CLKSOURCE_PCLK1: /* I2C3 Clock is PCLK1 */
  558. default:
  559. i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  560. break;
  561. }
  562. }
  563. #if defined(I2C4)
  564. else
  565. {
  566. if (I2CxSource == LL_RCC_I2C4_CLKSOURCE)
  567. {
  568. /* I2C4 CLK clock frequency */
  569. switch (LL_RCC_GetI2CClockSource(I2CxSource))
  570. {
  571. case LL_RCC_I2C4_CLKSOURCE_SYSCLK: /* I2C4 Clock is System Clock */
  572. i2c_frequency = RCC_GetSystemClockFreq();
  573. break;
  574. case LL_RCC_I2C4_CLKSOURCE_HSI: /* I2C4 Clock is HSI Osc. */
  575. if (LL_RCC_HSI_IsReady())
  576. {
  577. i2c_frequency = HSI_VALUE;
  578. }
  579. break;
  580. case LL_RCC_I2C4_CLKSOURCE_PCLK1: /* I2C4 Clock is PCLK1 */
  581. default:
  582. i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  583. break;
  584. }
  585. }
  586. }
  587. #endif /* I2C4 */
  588. return i2c_frequency;
  589. }
  590. /**
  591. * @brief Return I2Sx clock frequency
  592. * @param I2SxSource This parameter can be one of the following values:
  593. * @arg @ref LL_RCC_I2S1_CLKSOURCE
  594. * @retval I2S clock frequency (in Hz)
  595. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that PLLI2S oscillator is not ready
  596. */
  597. uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource)
  598. {
  599. uint32_t i2s_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  600. /* Check parameter */
  601. assert_param(IS_LL_RCC_I2S_CLKSOURCE(I2SxSource));
  602. if (I2SxSource == LL_RCC_I2S1_CLKSOURCE)
  603. {
  604. /* I2S1 CLK clock frequency */
  605. switch (LL_RCC_GetI2SClockSource(I2SxSource))
  606. {
  607. case LL_RCC_I2S1_CLKSOURCE_PLLI2S: /* I2S1 Clock is PLLI2S */
  608. if (LL_RCC_PLLI2S_IsReady())
  609. {
  610. i2s_frequency = RCC_PLLI2S_GetFreqDomain_I2S();
  611. }
  612. break;
  613. case LL_RCC_I2S1_CLKSOURCE_PIN: /* I2S1 Clock is External clock */
  614. default:
  615. i2s_frequency = EXTERNAL_CLOCK_VALUE;
  616. break;
  617. }
  618. }
  619. return i2s_frequency;
  620. }
  621. /**
  622. * @brief Return LPTIMx clock frequency
  623. * @param LPTIMxSource This parameter can be one of the following values:
  624. * @arg @ref LL_RCC_LPTIM1_CLKSOURCE
  625. * @retval LPTIM clock frequency (in Hz)
  626. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI, LSI or LSE) is not ready
  627. */
  628. uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)
  629. {
  630. uint32_t lptim_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  631. /* Check parameter */
  632. assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource));
  633. if (LPTIMxSource == LL_RCC_LPTIM1_CLKSOURCE)
  634. {
  635. /* LPTIM1CLK clock frequency */
  636. switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
  637. {
  638. case LL_RCC_LPTIM1_CLKSOURCE_LSI: /* LPTIM1 Clock is LSI Osc. */
  639. if (LL_RCC_LSI_IsReady())
  640. {
  641. lptim_frequency = LSI_VALUE;
  642. }
  643. break;
  644. case LL_RCC_LPTIM1_CLKSOURCE_HSI: /* LPTIM1 Clock is HSI Osc. */
  645. if (LL_RCC_HSI_IsReady())
  646. {
  647. lptim_frequency = HSI_VALUE;
  648. }
  649. break;
  650. case LL_RCC_LPTIM1_CLKSOURCE_LSE: /* LPTIM1 Clock is LSE Osc. */
  651. if (LL_RCC_LSE_IsReady())
  652. {
  653. lptim_frequency = LSE_VALUE;
  654. }
  655. break;
  656. case LL_RCC_LPTIM1_CLKSOURCE_PCLK1: /* LPTIM1 Clock is PCLK1 */
  657. default:
  658. lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  659. break;
  660. }
  661. }
  662. return lptim_frequency;
  663. }
  664. /**
  665. * @brief Return SAIx clock frequency
  666. * @param SAIxSource This parameter can be one of the following values:
  667. * @arg @ref LL_RCC_SAI1_CLKSOURCE
  668. * @arg @ref LL_RCC_SAI2_CLKSOURCE
  669. * @retval SAI clock frequency (in Hz)
  670. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that PLL is not ready
  671. * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that external clock is used
  672. */
  673. uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource)
  674. {
  675. uint32_t sai_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  676. /* Check parameter */
  677. assert_param(IS_LL_RCC_SAI_CLKSOURCE(SAIxSource));
  678. if (SAIxSource == LL_RCC_SAI1_CLKSOURCE)
  679. {
  680. /* SAI1CLK clock frequency */
  681. switch (LL_RCC_GetSAIClockSource(SAIxSource))
  682. {
  683. case LL_RCC_SAI1_CLKSOURCE_PLLSAI: /* PLLSAI clock used as SAI1 clock source */
  684. if (LL_RCC_PLLSAI_IsReady())
  685. {
  686. sai_frequency = RCC_PLLSAI_GetFreqDomain_SAI();
  687. }
  688. break;
  689. case LL_RCC_SAI1_CLKSOURCE_PLLI2S: /* PLLI2S clock used as SAI1 clock source */
  690. if (LL_RCC_PLLI2S_IsReady())
  691. {
  692. sai_frequency = RCC_PLLI2S_GetFreqDomain_SAI();
  693. }
  694. break;
  695. #if defined(RCC_SAI1SEL_PLLSRC_SUPPORT)
  696. case LL_RCC_SAI1_CLKSOURCE_PLLSRC:
  697. switch (LL_RCC_PLL_GetMainSource())
  698. {
  699. case LL_RCC_PLLSOURCE_HSE: /* HSE clock used as SAI1 clock source */
  700. if (LL_RCC_HSE_IsReady())
  701. {
  702. sai_frequency = HSE_VALUE;
  703. }
  704. break;
  705. case LL_RCC_PLLSOURCE_HSI: /* HSI clock used as SAI1 clock source */
  706. default:
  707. if (LL_RCC_HSI_IsReady())
  708. {
  709. sai_frequency = HSI_VALUE;
  710. }
  711. break;
  712. }
  713. break;
  714. #endif /* RCC_SAI1SEL_PLLSRC_SUPPORT */
  715. case LL_RCC_SAI1_CLKSOURCE_PIN: /* External input clock used as SAI1 clock source */
  716. default:
  717. sai_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
  718. break;
  719. }
  720. }
  721. else
  722. {
  723. if (SAIxSource == LL_RCC_SAI2_CLKSOURCE)
  724. {
  725. /* SAI2CLK clock frequency */
  726. switch (LL_RCC_GetSAIClockSource(SAIxSource))
  727. {
  728. case LL_RCC_SAI2_CLKSOURCE_PLLSAI: /* PLLSAI clock used as SAI2 clock source */
  729. if (LL_RCC_PLLSAI_IsReady())
  730. {
  731. sai_frequency = RCC_PLLSAI_GetFreqDomain_SAI();
  732. }
  733. break;
  734. case LL_RCC_SAI2_CLKSOURCE_PLLI2S: /* PLLI2S clock used as SAI2 clock source */
  735. if (LL_RCC_PLLI2S_IsReady())
  736. {
  737. sai_frequency = RCC_PLLI2S_GetFreqDomain_SAI();
  738. }
  739. break;
  740. #if defined(RCC_SAI2SEL_PLLSRC_SUPPORT)
  741. case LL_RCC_SAI2_CLKSOURCE_PLLSRC:
  742. switch (LL_RCC_PLL_GetMainSource())
  743. {
  744. case LL_RCC_PLLSOURCE_HSE: /* HSE clock used as SAI2 clock source */
  745. if (LL_RCC_HSE_IsReady())
  746. {
  747. sai_frequency = HSE_VALUE;
  748. }
  749. break;
  750. case LL_RCC_PLLSOURCE_HSI: /* HSI clock used as SAI2 clock source */
  751. default:
  752. if (LL_RCC_HSI_IsReady())
  753. {
  754. sai_frequency = HSI_VALUE;
  755. }
  756. break;
  757. }
  758. break;
  759. #endif /* RCC_SAI2SEL_PLLSRC_SUPPORT */
  760. case LL_RCC_SAI2_CLKSOURCE_PIN: /* External input clock used as SAI2 clock source */
  761. default:
  762. sai_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
  763. break;
  764. }
  765. }
  766. }
  767. return sai_frequency;
  768. }
  769. /**
  770. * @brief Return SDMMCx clock frequency
  771. * @param SDMMCxSource This parameter can be one of the following values:
  772. * @arg @ref LL_RCC_SDMMC1_CLKSOURCE
  773. * @arg @ref LL_RCC_SDMMC2_CLKSOURCE (*)
  774. *
  775. * (*) value not defined in all devices.
  776. * @retval SDMMC clock frequency (in Hz)
  777. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator PLL is not ready
  778. */
  779. uint32_t LL_RCC_GetSDMMCClockFreq(uint32_t SDMMCxSource)
  780. {
  781. uint32_t sdmmc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  782. /* Check parameter */
  783. assert_param(IS_LL_RCC_SDMMC_CLKSOURCE(SDMMCxSource));
  784. if (SDMMCxSource == LL_RCC_SDMMC1_CLKSOURCE)
  785. {
  786. /* SDMMC1CLK clock frequency */
  787. switch (LL_RCC_GetSDMMCClockSource(SDMMCxSource))
  788. {
  789. case LL_RCC_SDMMC1_CLKSOURCE_PLL48CLK: /* PLL48 clock used as SDMMC1 clock source */
  790. switch (LL_RCC_GetCK48MClockSource(LL_RCC_CK48M_CLKSOURCE))
  791. {
  792. case LL_RCC_CK48M_CLKSOURCE_PLL: /* PLL clock used as 48Mhz domain clock */
  793. if (LL_RCC_PLL_IsReady())
  794. {
  795. sdmmc_frequency = RCC_PLL_GetFreqDomain_48M();
  796. }
  797. break;
  798. case LL_RCC_CK48M_CLKSOURCE_PLLSAI: /* PLLSAI clock used as 48Mhz domain clock */
  799. default:
  800. if (LL_RCC_PLLSAI_IsReady())
  801. {
  802. sdmmc_frequency = RCC_PLLSAI_GetFreqDomain_48M();
  803. }
  804. break;
  805. }
  806. break;
  807. case LL_RCC_SDMMC1_CLKSOURCE_SYSCLK: /* PLL clock used as SDMMC1 clock source */
  808. default:
  809. sdmmc_frequency = RCC_GetSystemClockFreq();
  810. break;
  811. }
  812. }
  813. #if defined(SDMMC2)
  814. else
  815. {
  816. /* SDMMC2CLK clock frequency */
  817. switch (LL_RCC_GetSDMMCClockSource(SDMMCxSource))
  818. {
  819. case LL_RCC_SDMMC2_CLKSOURCE_PLL48CLK: /* PLL48 clock used as SDMMC2 clock source */
  820. switch (LL_RCC_GetCK48MClockSource(LL_RCC_CK48M_CLKSOURCE))
  821. {
  822. case LL_RCC_CK48M_CLKSOURCE_PLL: /* PLL clock used as 48Mhz domain clock */
  823. if (LL_RCC_PLL_IsReady())
  824. {
  825. sdmmc_frequency = RCC_PLL_GetFreqDomain_48M();
  826. }
  827. break;
  828. case LL_RCC_CK48M_CLKSOURCE_PLLSAI: /* PLLSAI clock used as 48Mhz domain clock */
  829. default:
  830. if (LL_RCC_PLLSAI_IsReady())
  831. {
  832. sdmmc_frequency = RCC_PLLSAI_GetFreqDomain_48M();
  833. }
  834. break;
  835. }
  836. break;
  837. case LL_RCC_SDMMC2_CLKSOURCE_SYSCLK: /* PLL clock used as SDMMC2 clock source */
  838. default:
  839. sdmmc_frequency = RCC_GetSystemClockFreq();
  840. break;
  841. }
  842. }
  843. #endif /* SDMMC2 */
  844. return sdmmc_frequency;
  845. }
  846. /**
  847. * @brief Return RNGx clock frequency
  848. * @param RNGxSource This parameter can be one of the following values:
  849. * @arg @ref LL_RCC_RNG_CLKSOURCE
  850. * @retval RNG clock frequency (in Hz)
  851. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  852. */
  853. uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource)
  854. {
  855. uint32_t rng_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  856. /* Check parameter */
  857. assert_param(IS_LL_RCC_RNG_CLKSOURCE(RNGxSource));
  858. /* RNGCLK clock frequency */
  859. switch (LL_RCC_GetRNGClockSource(RNGxSource))
  860. {
  861. case LL_RCC_RNG_CLKSOURCE_PLL: /* PLL clock used as RNG clock source */
  862. if (LL_RCC_PLL_IsReady())
  863. {
  864. rng_frequency = RCC_PLL_GetFreqDomain_48M();
  865. }
  866. break;
  867. case LL_RCC_RNG_CLKSOURCE_PLLSAI: /* PLLSAI clock used as RNG clock source */
  868. default:
  869. if (LL_RCC_PLLSAI_IsReady())
  870. {
  871. rng_frequency = RCC_PLLSAI_GetFreqDomain_48M();
  872. }
  873. break;
  874. }
  875. return rng_frequency;
  876. }
  877. #if defined(CEC)
  878. /**
  879. * @brief Return CEC clock frequency
  880. * @param CECxSource This parameter can be one of the following values:
  881. * @arg @ref LL_RCC_CEC_CLKSOURCE
  882. * @retval CEC clock frequency (in Hz)
  883. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
  884. */
  885. uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource)
  886. {
  887. uint32_t cec_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  888. /* Check parameter */
  889. assert_param(IS_LL_RCC_CEC_CLKSOURCE(CECxSource));
  890. /* CECCLK clock frequency */
  891. switch (LL_RCC_GetCECClockSource(CECxSource))
  892. {
  893. case LL_RCC_CEC_CLKSOURCE_LSE: /* CEC Clock is LSE Osc. */
  894. if (LL_RCC_LSE_IsReady())
  895. {
  896. cec_frequency = LSE_VALUE;
  897. }
  898. break;
  899. case LL_RCC_CEC_CLKSOURCE_HSI_DIV488: /* CEC Clock is HSI Osc. */
  900. default:
  901. if (LL_RCC_HSI_IsReady())
  902. {
  903. cec_frequency = HSI_VALUE/488U;
  904. }
  905. break;
  906. }
  907. return cec_frequency;
  908. }
  909. #endif /* CEC */
  910. /**
  911. * @brief Return USBx clock frequency
  912. * @param USBxSource This parameter can be one of the following values:
  913. * @arg @ref LL_RCC_USB_CLKSOURCE
  914. * @retval USB clock frequency (in Hz)
  915. */
  916. uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource)
  917. {
  918. uint32_t usb_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  919. /* Check parameter */
  920. assert_param(IS_LL_RCC_USB_CLKSOURCE(USBxSource));
  921. /* USBCLK clock frequency */
  922. switch (LL_RCC_GetUSBClockSource(USBxSource))
  923. {
  924. case LL_RCC_USB_CLKSOURCE_PLL: /* PLL clock used as USB clock source */
  925. if (LL_RCC_PLL_IsReady())
  926. {
  927. usb_frequency = RCC_PLL_GetFreqDomain_48M();
  928. }
  929. break;
  930. case LL_RCC_USB_CLKSOURCE_PLLSAI: /* PLLSAI clock used as USB clock source */
  931. default:
  932. if (LL_RCC_PLLSAI_IsReady())
  933. {
  934. usb_frequency = RCC_PLLSAI_GetFreqDomain_48M();
  935. }
  936. break;
  937. }
  938. return usb_frequency;
  939. }
  940. #if defined(DFSDM1_Channel0)
  941. /**
  942. * @brief Return DFSDMx clock frequency
  943. * @param DFSDMxSource This parameter can be one of the following values:
  944. * @arg @ref LL_RCC_DFSDM1_CLKSOURCE
  945. * @retval DFSDM clock frequency (in Hz)
  946. */
  947. uint32_t LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource)
  948. {
  949. uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  950. /* Check parameter */
  951. assert_param(IS_LL_RCC_DFSDM_CLKSOURCE(DFSDMxSource));
  952. /* DFSDM1CLK clock frequency */
  953. switch (LL_RCC_GetDFSDMClockSource(DFSDMxSource))
  954. {
  955. case LL_RCC_DFSDM1_CLKSOURCE_SYSCLK: /* DFSDM1 Clock is SYSCLK */
  956. dfsdm_frequency = RCC_GetSystemClockFreq();
  957. break;
  958. case LL_RCC_DFSDM1_CLKSOURCE_PCLK2: /* DFSDM1 Clock is PCLK2 */
  959. default:
  960. dfsdm_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  961. break;
  962. }
  963. return dfsdm_frequency;
  964. }
  965. /**
  966. * @brief Return DFSDMx Audio clock frequency
  967. * @param DFSDMxSource This parameter can be one of the following values:
  968. * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE
  969. * @retval DFSDM clock frequency (in Hz)
  970. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  971. */
  972. uint32_t LL_RCC_GetDFSDMAudioClockFreq(uint32_t DFSDMxSource)
  973. {
  974. uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  975. /* Check parameter */
  976. assert_param(IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(DFSDMxSource));
  977. /* DFSDM1CLK clock frequency */
  978. switch (LL_RCC_GetDFSDMAudioClockSource(DFSDMxSource))
  979. {
  980. case LL_RCC_DFSDM1_AUDIO_CLKSOURCE_SAI1: /* SAI1 clock used as DFSDM1 audio clock */
  981. dfsdm_frequency = LL_RCC_GetSAIClockFreq(LL_RCC_SAI1_CLKSOURCE);
  982. break;
  983. case LL_RCC_DFSDM1_AUDIO_CLKSOURCE_SAI2: /* SAI2 clock used as DFSDM1 audio clock */
  984. default:
  985. dfsdm_frequency = LL_RCC_GetSAIClockFreq(LL_RCC_SAI2_CLKSOURCE);
  986. break;
  987. }
  988. return dfsdm_frequency;
  989. }
  990. #endif /* DFSDM1_Channel0 */
  991. #if defined(DSI)
  992. /**
  993. * @brief Return DSI clock frequency
  994. * @param DSIxSource This parameter can be one of the following values:
  995. * @arg @ref LL_RCC_DSI_CLKSOURCE
  996. * @retval DSI clock frequency (in Hz)
  997. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  998. * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that external clock is used
  999. */
  1000. uint32_t LL_RCC_GetDSIClockFreq(uint32_t DSIxSource)
  1001. {
  1002. uint32_t dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  1003. /* Check parameter */
  1004. assert_param(IS_LL_RCC_DSI_CLKSOURCE(DSIxSource));
  1005. /* DSICLK clock frequency */
  1006. switch (LL_RCC_GetDSIClockSource(DSIxSource))
  1007. {
  1008. case LL_RCC_DSI_CLKSOURCE_PLL: /* DSI Clock is PLL Osc. */
  1009. if (LL_RCC_PLL_IsReady())
  1010. {
  1011. dsi_frequency = RCC_PLL_GetFreqDomain_DSI();
  1012. }
  1013. break;
  1014. case LL_RCC_DSI_CLKSOURCE_PHY: /* DSI Clock is DSI physical clock. */
  1015. default:
  1016. dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
  1017. break;
  1018. }
  1019. return dsi_frequency;
  1020. }
  1021. #endif /* DSI */
  1022. #if defined(LTDC)
  1023. /**
  1024. * @brief Return LTDC clock frequency
  1025. * @param LTDCxSource This parameter can be one of the following values:
  1026. * @arg @ref LL_RCC_LTDC_CLKSOURCE
  1027. * @retval LTDC clock frequency (in Hz)
  1028. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator PLLSAI is not ready
  1029. */
  1030. uint32_t LL_RCC_GetLTDCClockFreq(uint32_t LTDCxSource)
  1031. {
  1032. uint32_t ltdc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  1033. /* Check parameter */
  1034. assert_param(IS_LL_RCC_LTDC_CLKSOURCE(LTDCxSource));
  1035. if (LL_RCC_PLLSAI_IsReady())
  1036. {
  1037. ltdc_frequency = RCC_PLLSAI_GetFreqDomain_LTDC();
  1038. }
  1039. return ltdc_frequency;
  1040. }
  1041. #endif /* LTDC */
  1042. #if defined(SPDIFRX)
  1043. /**
  1044. * @brief Return SPDIFRX clock frequency
  1045. * @param SPDIFRXxSource This parameter can be one of the following values:
  1046. * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE
  1047. * @retval SPDIFRX clock frequency (in Hz)
  1048. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  1049. */
  1050. uint32_t LL_RCC_GetSPDIFRXClockFreq(uint32_t SPDIFRXxSource)
  1051. {
  1052. uint32_t spdifrx_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  1053. /* Check parameter */
  1054. assert_param(IS_LL_RCC_SPDIFRX_CLKSOURCE(SPDIFRXxSource));
  1055. if (LL_RCC_PLLI2S_IsReady())
  1056. {
  1057. spdifrx_frequency = RCC_PLLI2S_GetFreqDomain_SPDIFRX();
  1058. }
  1059. return spdifrx_frequency;
  1060. }
  1061. #endif /* SPDIFRX */
  1062. /**
  1063. * @}
  1064. */
  1065. /**
  1066. * @}
  1067. */
  1068. /** @addtogroup RCC_LL_Private_Functions
  1069. * @{
  1070. */
  1071. /**
  1072. * @brief Return SYSTEM clock frequency
  1073. * @retval SYSTEM clock frequency (in Hz)
  1074. */
  1075. uint32_t RCC_GetSystemClockFreq(void)
  1076. {
  1077. uint32_t frequency = 0U;
  1078. /* Get SYSCLK source -------------------------------------------------------*/
  1079. switch (LL_RCC_GetSysClkSource())
  1080. {
  1081. case LL_RCC_SYS_CLKSOURCE_STATUS_HSI: /* HSI used as system clock source */
  1082. frequency = HSI_VALUE;
  1083. break;
  1084. case LL_RCC_SYS_CLKSOURCE_STATUS_HSE: /* HSE used as system clock source */
  1085. frequency = HSE_VALUE;
  1086. break;
  1087. case LL_RCC_SYS_CLKSOURCE_STATUS_PLL: /* PLL used as system clock source */
  1088. frequency = RCC_PLL_GetFreqDomain_SYS();
  1089. break;
  1090. default:
  1091. frequency = HSI_VALUE;
  1092. break;
  1093. }
  1094. return frequency;
  1095. }
  1096. /**
  1097. * @brief Return HCLK clock frequency
  1098. * @param SYSCLK_Frequency SYSCLK clock frequency
  1099. * @retval HCLK clock frequency (in Hz)
  1100. */
  1101. uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)
  1102. {
  1103. /* HCLK clock frequency */
  1104. return __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler());
  1105. }
  1106. /**
  1107. * @brief Return PCLK1 clock frequency
  1108. * @param HCLK_Frequency HCLK clock frequency
  1109. * @retval PCLK1 clock frequency (in Hz)
  1110. */
  1111. uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)
  1112. {
  1113. /* PCLK1 clock frequency */
  1114. return __LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler());
  1115. }
  1116. /**
  1117. * @brief Return PCLK2 clock frequency
  1118. * @param HCLK_Frequency HCLK clock frequency
  1119. * @retval PCLK2 clock frequency (in Hz)
  1120. */
  1121. uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency)
  1122. {
  1123. /* PCLK2 clock frequency */
  1124. return __LL_RCC_CALC_PCLK2_FREQ(HCLK_Frequency, LL_RCC_GetAPB2Prescaler());
  1125. }
  1126. /**
  1127. * @brief Return PLL clock frequency used for system domain
  1128. * @retval PLL clock frequency (in Hz)
  1129. */
  1130. uint32_t RCC_PLL_GetFreqDomain_SYS(void)
  1131. {
  1132. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1133. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  1134. SYSCLK = PLL_VCO / PLLP
  1135. */
  1136. pllsource = LL_RCC_PLL_GetMainSource();
  1137. switch (pllsource)
  1138. {
  1139. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1140. pllinputfreq = HSI_VALUE;
  1141. break;
  1142. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1143. pllinputfreq = HSE_VALUE;
  1144. break;
  1145. default:
  1146. pllinputfreq = HSI_VALUE;
  1147. break;
  1148. }
  1149. return __LL_RCC_CALC_PLLCLK_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1150. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetP());
  1151. }
  1152. /**
  1153. * @brief Return PLL clock frequency used for 48 MHz domain
  1154. * @retval PLL clock frequency (in Hz)
  1155. */
  1156. uint32_t RCC_PLL_GetFreqDomain_48M(void)
  1157. {
  1158. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1159. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM ) * PLLN
  1160. 48M Domain clock = PLL_VCO / PLLQ
  1161. */
  1162. pllsource = LL_RCC_PLL_GetMainSource();
  1163. switch (pllsource)
  1164. {
  1165. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1166. pllinputfreq = HSI_VALUE;
  1167. break;
  1168. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1169. pllinputfreq = HSE_VALUE;
  1170. break;
  1171. default:
  1172. pllinputfreq = HSI_VALUE;
  1173. break;
  1174. }
  1175. return __LL_RCC_CALC_PLLCLK_48M_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1176. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ());
  1177. }
  1178. #if defined(DSI)
  1179. /**
  1180. * @brief Return PLL clock frequency used for DSI clock
  1181. * @retval PLL clock frequency (in Hz)
  1182. */
  1183. uint32_t RCC_PLL_GetFreqDomain_DSI(void)
  1184. {
  1185. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1186. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  1187. DSICLK = PLL_VCO / PLLR
  1188. */
  1189. pllsource = LL_RCC_PLL_GetMainSource();
  1190. switch (pllsource)
  1191. {
  1192. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1193. pllinputfreq = HSE_VALUE;
  1194. break;
  1195. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1196. default:
  1197. pllinputfreq = HSI_VALUE;
  1198. break;
  1199. }
  1200. return __LL_RCC_CALC_PLLCLK_DSI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1201. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
  1202. }
  1203. #endif /* DSI */
  1204. /**
  1205. * @brief Return PLLSAI clock frequency used for SAI1 and SAI2 domains
  1206. * @retval PLLSAI clock frequency (in Hz)
  1207. */
  1208. uint32_t RCC_PLLSAI_GetFreqDomain_SAI(void)
  1209. {
  1210. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1211. /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLSAIN
  1212. SAI1 and SAI2 domains clock = (PLLSAI_VCO / PLLSAIQ) / PLLSAIDIVQ
  1213. */
  1214. pllsource = LL_RCC_PLL_GetMainSource();
  1215. switch (pllsource)
  1216. {
  1217. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLSAI clock source */
  1218. pllinputfreq = HSI_VALUE;
  1219. break;
  1220. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLSAI clock source */
  1221. pllinputfreq = HSE_VALUE;
  1222. break;
  1223. default:
  1224. pllinputfreq = HSI_VALUE;
  1225. break;
  1226. }
  1227. return __LL_RCC_CALC_PLLSAI_SAI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1228. LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetQ(), LL_RCC_PLLSAI_GetDIVQ());
  1229. }
  1230. /**
  1231. * @brief Return PLLSAI clock frequency used for 48Mhz domain
  1232. * @retval PLLSAI clock frequency (in Hz)
  1233. */
  1234. uint32_t RCC_PLLSAI_GetFreqDomain_48M(void)
  1235. {
  1236. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1237. /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLSAIN
  1238. 48M Domain clock = PLLSAI_VCO / PLLSAIP
  1239. */
  1240. pllsource = LL_RCC_PLL_GetMainSource();
  1241. switch (pllsource)
  1242. {
  1243. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLSAI clock source */
  1244. pllinputfreq = HSI_VALUE;
  1245. break;
  1246. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLSAI clock source */
  1247. pllinputfreq = HSE_VALUE;
  1248. break;
  1249. default:
  1250. pllinputfreq = HSI_VALUE;
  1251. break;
  1252. }
  1253. return __LL_RCC_CALC_PLLSAI_48M_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1254. LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetP());
  1255. }
  1256. #if defined(LTDC)
  1257. /**
  1258. * @brief Return PLLSAI clock frequency used for LTDC domain
  1259. * @retval PLLSAI clock frequency (in Hz)
  1260. */
  1261. uint32_t RCC_PLLSAI_GetFreqDomain_LTDC(void)
  1262. {
  1263. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1264. /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLSAIN
  1265. LTDC Domain clock = (PLLSAI_VCO / PLLSAIR) / PLLSAIDIVR
  1266. */
  1267. pllsource = LL_RCC_PLL_GetMainSource();
  1268. switch (pllsource)
  1269. {
  1270. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLSAI clock source */
  1271. pllinputfreq = HSI_VALUE;
  1272. break;
  1273. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLSAI clock source */
  1274. pllinputfreq = HSE_VALUE;
  1275. break;
  1276. default:
  1277. pllinputfreq = HSI_VALUE;
  1278. break;
  1279. }
  1280. return __LL_RCC_CALC_PLLSAI_LTDC_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1281. LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetR(), LL_RCC_PLLSAI_GetDIVR());
  1282. }
  1283. #endif /* LTDC */
  1284. /**
  1285. * @brief Return PLLI2S clock frequency used for SAI1 and SAI2 domains
  1286. * @retval PLLI2S clock frequency (in Hz)
  1287. */
  1288. uint32_t RCC_PLLI2S_GetFreqDomain_SAI(void)
  1289. {
  1290. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1291. /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLI2SN
  1292. SAI1 and SAI2 domains clock = (PLLI2S_VCO / PLLI2SQ) / PLLI2SDIVQ
  1293. */
  1294. pllsource = LL_RCC_PLL_GetMainSource();
  1295. switch (pllsource)
  1296. {
  1297. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLI2S clock source */
  1298. pllinputfreq = HSI_VALUE;
  1299. break;
  1300. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLI2S clock source */
  1301. pllinputfreq = HSE_VALUE;
  1302. break;
  1303. default:
  1304. pllinputfreq = HSI_VALUE;
  1305. break;
  1306. }
  1307. return __LL_RCC_CALC_PLLI2S_SAI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1308. LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetQ(), LL_RCC_PLLI2S_GetDIVQ());
  1309. }
  1310. #if defined(SPDIFRX)
  1311. /**
  1312. * @brief Return PLLI2S clock frequency used for SPDIFRX domain
  1313. * @retval PLLI2S clock frequency (in Hz)
  1314. */
  1315. uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void)
  1316. {
  1317. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1318. /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLI2SN
  1319. SPDIFRX Domain clock = PLLI2S_VCO / PLLI2SP
  1320. */
  1321. pllsource = LL_RCC_PLL_GetMainSource();
  1322. switch (pllsource)
  1323. {
  1324. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLI2S clock source */
  1325. pllinputfreq = HSI_VALUE;
  1326. break;
  1327. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLI2S clock source */
  1328. pllinputfreq = HSE_VALUE;
  1329. break;
  1330. default:
  1331. pllinputfreq = HSI_VALUE;
  1332. break;
  1333. }
  1334. return __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1335. LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetP());
  1336. }
  1337. #endif /* SPDIFRX */
  1338. /**
  1339. * @brief Return PLLI2S clock frequency used for I2S domain
  1340. * @retval PLLI2S clock frequency (in Hz)
  1341. */
  1342. uint32_t RCC_PLLI2S_GetFreqDomain_I2S(void)
  1343. {
  1344. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1345. /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLI2SN
  1346. I2S Domain clock = PLLI2S_VCO / PLLI2SR
  1347. */
  1348. pllsource = LL_RCC_PLL_GetMainSource();
  1349. switch (pllsource)
  1350. {
  1351. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLI2S clock source */
  1352. pllinputfreq = HSE_VALUE;
  1353. break;
  1354. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLI2S clock source */
  1355. default:
  1356. pllinputfreq = HSI_VALUE;
  1357. break;
  1358. }
  1359. return __LL_RCC_CALC_PLLI2S_I2S_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1360. LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetR());
  1361. }
  1362. /**
  1363. * @}
  1364. */
  1365. /**
  1366. * @}
  1367. */
  1368. #endif /* defined(RCC) */
  1369. /**
  1370. * @}
  1371. */
  1372. #endif /* USE_FULL_LL_DRIVER */
  1373. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/