stm32f7xx_ll_rcc.c 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593
  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****/