stm32g4xx_ll_rcc.c 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192
  1. /**
  2. ******************************************************************************
  3. * @file stm32g4xx_ll_rcc.c
  4. * @author MCD Application Team
  5. * @brief RCC LL module driver.
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) 2019 STMicroelectronics.
  10. * All rights reserved.
  11. *
  12. * This software is licensed under terms that can be found in the LICENSE file in
  13. * the root directory of this software component.
  14. * If no LICENSE file comes with this software, it is provided AS-IS.
  15. ******************************************************************************
  16. */
  17. #if defined(USE_FULL_LL_DRIVER)
  18. /* Includes ------------------------------------------------------------------*/
  19. #include "stm32g4xx_ll_rcc.h"
  20. #ifdef USE_FULL_ASSERT
  21. #include "stm32_assert.h"
  22. #else
  23. #define assert_param(expr) ((void)0U)
  24. #endif
  25. /** @addtogroup STM32G4xx_LL_Driver
  26. * @{
  27. */
  28. /** @addtogroup RCC_LL
  29. * @{
  30. */
  31. /* Private types -------------------------------------------------------------*/
  32. /* Private variables ---------------------------------------------------------*/
  33. /* Private constants ---------------------------------------------------------*/
  34. /* Private macros ------------------------------------------------------------*/
  35. /** @addtogroup RCC_LL_Private_Macros
  36. * @{
  37. */
  38. #if defined(RCC_CCIPR_USART3SEL)
  39. #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \
  40. || ((__VALUE__) == LL_RCC_USART2_CLKSOURCE) \
  41. || ((__VALUE__) == LL_RCC_USART3_CLKSOURCE))
  42. #else
  43. #define IS_LL_RCC_USART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USART1_CLKSOURCE) \
  44. || ((__VALUE__) == LL_RCC_USART2_CLKSOURCE))
  45. #endif /* RCC_CCIPR_USART3SEL*/
  46. #if defined(RCC_CCIPR_UART5SEL)
  47. #define IS_LL_RCC_UART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_UART4_CLKSOURCE) \
  48. || ((__VALUE__) == LL_RCC_UART5_CLKSOURCE))
  49. #elif defined(RCC_CCIPR_UART4SEL)
  50. #define IS_LL_RCC_UART_CLKSOURCE(__VALUE__) ((__VALUE__) == LL_RCC_UART4_CLKSOURCE)
  51. #endif /* RCC_CCIPR_UART5SEL*/
  52. #define IS_LL_RCC_LPUART_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPUART1_CLKSOURCE))
  53. #if defined(RCC_CCIPR2_I2C4SEL)
  54. #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
  55. || ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE) \
  56. || ((__VALUE__) == LL_RCC_I2C3_CLKSOURCE) \
  57. || ((__VALUE__) == LL_RCC_I2C4_CLKSOURCE))
  58. #elif defined(RCC_CCIPR_I2C3SEL)
  59. #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
  60. || ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE) \
  61. || ((__VALUE__) == LL_RCC_I2C3_CLKSOURCE))
  62. #else
  63. #define IS_LL_RCC_I2C_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2C1_CLKSOURCE) \
  64. || ((__VALUE__) == LL_RCC_I2C2_CLKSOURCE))
  65. #endif /* RCC_CCIPR2_I2C4SEL */
  66. #define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE))
  67. #if defined(SAI1)
  68. #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__) ((__VALUE__) == LL_RCC_SAI1_CLKSOURCE)
  69. #endif /* SAI1 */
  70. #define IS_LL_RCC_I2S_CLKSOURCE(__VALUE__) ((__VALUE__) == LL_RCC_I2S_CLKSOURCE)
  71. #define IS_LL_RCC_RNG_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_RNG_CLKSOURCE))
  72. #define IS_LL_RCC_USB_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USB_CLKSOURCE))
  73. #if defined(ADC345_COMMON)
  74. #define IS_LL_RCC_ADC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_ADC12_CLKSOURCE) \
  75. || ((__VALUE__) == LL_RCC_ADC345_CLKSOURCE))
  76. #else
  77. #define IS_LL_RCC_ADC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_ADC12_CLKSOURCE))
  78. #endif /* ADC345_COMMON */
  79. #if defined(QUADSPI)
  80. #define IS_LL_RCC_QUADSPI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_QUADSPI_CLKSOURCE))
  81. #endif /* QUADSPI */
  82. #if defined(FDCAN1)
  83. #define IS_LL_RCC_FDCAN_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_FDCAN_CLKSOURCE))
  84. #endif /* FDCAN1 */
  85. /**
  86. * @}
  87. */
  88. /* Private function prototypes -----------------------------------------------*/
  89. /** @defgroup RCC_LL_Private_Functions RCC Private functions
  90. * @{
  91. */
  92. static uint32_t RCC_GetSystemClockFreq(void);
  93. static uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency);
  94. static uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency);
  95. static uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency);
  96. static uint32_t RCC_PLL_GetFreqDomain_SYS(void);
  97. static uint32_t RCC_PLL_GetFreqDomain_ADC(void);
  98. static uint32_t RCC_PLL_GetFreqDomain_48M(void);
  99. /**
  100. * @}
  101. */
  102. /* Exported functions --------------------------------------------------------*/
  103. /** @addtogroup RCC_LL_Exported_Functions
  104. * @{
  105. */
  106. /** @addtogroup RCC_LL_EF_Init
  107. * @{
  108. */
  109. /**
  110. * @brief Reset the RCC clock configuration to the default reset state.
  111. * @note The default reset state of the clock configuration is given below:
  112. * - HSI ON and used as system clock source
  113. * - HSE and PLL OFF
  114. * - AHB, APB1 and APB2 prescaler set to 1.
  115. * - CSS, MCO OFF
  116. * - All interrupts disabled
  117. * @note This function doesn't modify the configuration of the
  118. * - Peripheral clocks
  119. * - LSI, LSE and RTC clocks
  120. * @retval An ErrorStatus enumeration value:
  121. * - SUCCESS: RCC registers are de-initialized
  122. * - ERROR: not applicable
  123. */
  124. ErrorStatus LL_RCC_DeInit(void)
  125. {
  126. uint32_t vl_mask;
  127. /* Set HSION bit and wait for HSI READY bit */
  128. LL_RCC_HSI_Enable();
  129. while (LL_RCC_HSI_IsReady() == 0U)
  130. {}
  131. /* Set HSITRIM bits to reset value*/
  132. LL_RCC_HSI_SetCalibTrimming(0x40U);
  133. /* Reset whole CFGR register but keep HSI as system clock source */
  134. LL_RCC_WriteReg(CFGR, LL_RCC_SYS_CLKSOURCE_HSI);
  135. while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSI) {};
  136. /* Reset whole CR register but HSI in 2 steps in case HSEBYP is set */
  137. LL_RCC_WriteReg(CR, RCC_CR_HSION);
  138. LL_RCC_WriteReg(CR, RCC_CR_HSION);
  139. /* Wait for PLL READY bit to be reset */
  140. while (LL_RCC_PLL_IsReady() != 0U)
  141. {}
  142. /* Reset PLLCFGR register */
  143. LL_RCC_WriteReg(PLLCFGR, 16U << RCC_PLLCFGR_PLLN_Pos);
  144. /* Disable all interrupts */
  145. LL_RCC_WriteReg(CIER, 0x00000000U);
  146. /* Clear all interrupt flags */
  147. vl_mask = RCC_CICR_LSIRDYC | RCC_CICR_LSERDYC | RCC_CICR_HSIRDYC | RCC_CICR_HSERDYC | RCC_CICR_PLLRDYC | \
  148. RCC_CICR_HSI48RDYC | RCC_CICR_CSSC | RCC_CICR_LSECSSC;
  149. LL_RCC_WriteReg(CICR, vl_mask);
  150. /* Clear reset flags */
  151. LL_RCC_ClearResetFlags();
  152. return SUCCESS;
  153. }
  154. /**
  155. * @}
  156. */
  157. /** @addtogroup RCC_LL_EF_Get_Freq
  158. * @brief Return the frequencies of different on chip clocks; System, AHB, APB1 and APB2 buses clocks
  159. * and different peripheral clocks available on the device.
  160. * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(**)
  161. * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(***)
  162. * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(***)
  163. * or HSI_VALUE(**) multiplied/divided by the PLL factors.
  164. * @note (**) HSI_VALUE is a constant defined in this file (default value
  165. * 16 MHz) but the real value may vary depending on the variations
  166. * in voltage and temperature.
  167. * @note (***) HSE_VALUE is a constant defined in this file (default value
  168. * 8 MHz), user has to ensure that HSE_VALUE is same as the real
  169. * frequency of the crystal used. Otherwise, this function may
  170. * have wrong result.
  171. * @note The result of this function could be incorrect when using fractional
  172. * value for HSE crystal.
  173. * @note This function can be used by the user application to compute the
  174. * baud-rate for the communication peripherals or configure other parameters.
  175. * @{
  176. */
  177. /**
  178. * @brief Return the frequencies of different on chip clocks; System, AHB, APB1 and APB2 buses clocks
  179. * @note Each time SYSCLK, HCLK, PCLK1 and/or PCLK2 clock changes, this function
  180. * must be called to update structure fields. Otherwise, any
  181. * configuration based on this function will be incorrect.
  182. * @param RCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies
  183. * @retval None
  184. */
  185. void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks)
  186. {
  187. /* Get SYSCLK frequency */
  188. RCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq();
  189. /* HCLK clock frequency */
  190. RCC_Clocks->HCLK_Frequency = RCC_GetHCLKClockFreq(RCC_Clocks->SYSCLK_Frequency);
  191. /* PCLK1 clock frequency */
  192. RCC_Clocks->PCLK1_Frequency = RCC_GetPCLK1ClockFreq(RCC_Clocks->HCLK_Frequency);
  193. /* PCLK2 clock frequency */
  194. RCC_Clocks->PCLK2_Frequency = RCC_GetPCLK2ClockFreq(RCC_Clocks->HCLK_Frequency);
  195. }
  196. /**
  197. * @brief Return USARTx clock frequency
  198. * @param USARTxSource This parameter can be one of the following values:
  199. * @arg @ref LL_RCC_USART1_CLKSOURCE
  200. * @arg @ref LL_RCC_USART2_CLKSOURCE
  201. * @arg @ref LL_RCC_USART3_CLKSOURCE
  202. *
  203. * @retval USART clock frequency (in Hz)
  204. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
  205. */
  206. uint32_t LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource)
  207. {
  208. uint32_t usart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  209. /* Check parameter */
  210. assert_param(IS_LL_RCC_USART_CLKSOURCE(USARTxSource));
  211. if (USARTxSource == LL_RCC_USART1_CLKSOURCE)
  212. {
  213. /* USART1CLK clock frequency */
  214. switch (LL_RCC_GetUSARTClockSource(USARTxSource))
  215. {
  216. case LL_RCC_USART1_CLKSOURCE_SYSCLK: /* USART1 Clock is System Clock */
  217. usart_frequency = RCC_GetSystemClockFreq();
  218. break;
  219. case LL_RCC_USART1_CLKSOURCE_HSI: /* USART1 Clock is HSI Osc. */
  220. if (LL_RCC_HSI_IsReady() != 0U)
  221. {
  222. usart_frequency = HSI_VALUE;
  223. }
  224. break;
  225. case LL_RCC_USART1_CLKSOURCE_LSE: /* USART1 Clock is LSE Osc. */
  226. if (LL_RCC_LSE_IsReady() != 0U)
  227. {
  228. usart_frequency = LSE_VALUE;
  229. }
  230. break;
  231. case LL_RCC_USART1_CLKSOURCE_PCLK2: /* USART1 Clock is PCLK2 */
  232. default:
  233. usart_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  234. break;
  235. }
  236. }
  237. else if (USARTxSource == LL_RCC_USART2_CLKSOURCE)
  238. {
  239. /* USART2CLK clock frequency */
  240. switch (LL_RCC_GetUSARTClockSource(USARTxSource))
  241. {
  242. case LL_RCC_USART2_CLKSOURCE_SYSCLK: /* USART2 Clock is System Clock */
  243. usart_frequency = RCC_GetSystemClockFreq();
  244. break;
  245. case LL_RCC_USART2_CLKSOURCE_HSI: /* USART2 Clock is HSI Osc. */
  246. if (LL_RCC_HSI_IsReady() != 0U)
  247. {
  248. usart_frequency = HSI_VALUE;
  249. }
  250. break;
  251. case LL_RCC_USART2_CLKSOURCE_LSE: /* USART2 Clock is LSE Osc. */
  252. if (LL_RCC_LSE_IsReady() != 0U)
  253. {
  254. usart_frequency = LSE_VALUE;
  255. }
  256. break;
  257. case LL_RCC_USART2_CLKSOURCE_PCLK1: /* USART2 Clock is PCLK1 */
  258. default:
  259. usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  260. break;
  261. }
  262. }
  263. else
  264. {
  265. #if defined(RCC_CCIPR_USART3SEL)
  266. if (USARTxSource == LL_RCC_USART3_CLKSOURCE)
  267. {
  268. /* USART3CLK clock frequency */
  269. switch (LL_RCC_GetUSARTClockSource(USARTxSource))
  270. {
  271. case LL_RCC_USART3_CLKSOURCE_SYSCLK: /* USART3 Clock is System Clock */
  272. usart_frequency = RCC_GetSystemClockFreq();
  273. break;
  274. case LL_RCC_USART3_CLKSOURCE_HSI: /* USART3 Clock is HSI Osc. */
  275. if (LL_RCC_HSI_IsReady() != 0U)
  276. {
  277. usart_frequency = HSI_VALUE;
  278. }
  279. break;
  280. case LL_RCC_USART3_CLKSOURCE_LSE: /* USART3 Clock is LSE Osc. */
  281. if (LL_RCC_LSE_IsReady() != 0U)
  282. {
  283. usart_frequency = LSE_VALUE;
  284. }
  285. break;
  286. case LL_RCC_USART3_CLKSOURCE_PCLK1: /* USART3 Clock is PCLK1 */
  287. default:
  288. usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  289. break;
  290. }
  291. }
  292. #endif /* RCC_CCIPR_USART3SEL */
  293. }
  294. return usart_frequency;
  295. }
  296. #if defined(RCC_CCIPR_UART4SEL)
  297. /**
  298. * @brief Return UARTx clock frequency
  299. * @param UARTxSource This parameter can be one of the following values:
  300. * @arg @ref LL_RCC_UART4_CLKSOURCE (*)
  301. * @arg @ref LL_RCC_UART5_CLKSOURCE (*)
  302. *
  303. * (*) value not defined in all devices.
  304. * @retval UART clock frequency (in Hz)
  305. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
  306. */
  307. uint32_t LL_RCC_GetUARTClockFreq(uint32_t UARTxSource)
  308. {
  309. uint32_t uart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  310. /* Check parameter */
  311. assert_param(IS_LL_RCC_UART_CLKSOURCE(UARTxSource));
  312. if (UARTxSource == LL_RCC_UART4_CLKSOURCE)
  313. {
  314. /* UART4CLK clock frequency */
  315. switch (LL_RCC_GetUARTClockSource(UARTxSource))
  316. {
  317. case LL_RCC_UART4_CLKSOURCE_SYSCLK: /* UART4 Clock is System Clock */
  318. uart_frequency = RCC_GetSystemClockFreq();
  319. break;
  320. case LL_RCC_UART4_CLKSOURCE_HSI: /* UART4 Clock is HSI Osc. */
  321. if (LL_RCC_HSI_IsReady() != 0U)
  322. {
  323. uart_frequency = HSI_VALUE;
  324. }
  325. break;
  326. case LL_RCC_UART4_CLKSOURCE_LSE: /* UART4 Clock is LSE Osc. */
  327. if (LL_RCC_LSE_IsReady() != 0U)
  328. {
  329. uart_frequency = LSE_VALUE;
  330. }
  331. break;
  332. case LL_RCC_UART4_CLKSOURCE_PCLK1: /* UART4 Clock is PCLK1 */
  333. default:
  334. uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  335. break;
  336. }
  337. }
  338. #if defined(RCC_CCIPR_UART5SEL)
  339. if (UARTxSource == LL_RCC_UART5_CLKSOURCE)
  340. {
  341. /* UART5CLK clock frequency */
  342. switch (LL_RCC_GetUARTClockSource(UARTxSource))
  343. {
  344. case LL_RCC_UART5_CLKSOURCE_SYSCLK: /* UART5 Clock is System Clock */
  345. uart_frequency = RCC_GetSystemClockFreq();
  346. break;
  347. case LL_RCC_UART5_CLKSOURCE_HSI: /* UART5 Clock is HSI Osc. */
  348. if (LL_RCC_HSI_IsReady() != 0U)
  349. {
  350. uart_frequency = HSI_VALUE;
  351. }
  352. break;
  353. case LL_RCC_UART5_CLKSOURCE_LSE: /* UART5 Clock is LSE Osc. */
  354. if (LL_RCC_LSE_IsReady() != 0U)
  355. {
  356. uart_frequency = LSE_VALUE;
  357. }
  358. break;
  359. case LL_RCC_UART5_CLKSOURCE_PCLK1: /* UART5 Clock is PCLK1 */
  360. default:
  361. uart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  362. break;
  363. }
  364. }
  365. #endif /* RCC_CCIPR_UART5SEL */
  366. return uart_frequency;
  367. }
  368. #endif /* RCC_CCIPR_UART4SEL */
  369. /**
  370. * @brief Return I2Cx clock frequency
  371. * @param I2CxSource This parameter can be one of the following values:
  372. * @arg @ref LL_RCC_I2C1_CLKSOURCE
  373. * @arg @ref LL_RCC_I2C2_CLKSOURCE
  374. * @arg @ref LL_RCC_I2C3_CLKSOURCE
  375. * @arg @ref LL_RCC_I2C4_CLKSOURCE (*)
  376. *
  377. * (*) value not defined in all devices.
  378. * @retval I2C clock frequency (in Hz)
  379. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that HSI oscillator is not ready
  380. */
  381. uint32_t LL_RCC_GetI2CClockFreq(uint32_t I2CxSource)
  382. {
  383. uint32_t i2c_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  384. /* Check parameter */
  385. assert_param(IS_LL_RCC_I2C_CLKSOURCE(I2CxSource));
  386. if (I2CxSource == LL_RCC_I2C1_CLKSOURCE)
  387. {
  388. /* I2C1 CLK clock frequency */
  389. switch (LL_RCC_GetI2CClockSource(I2CxSource))
  390. {
  391. case LL_RCC_I2C1_CLKSOURCE_SYSCLK: /* I2C1 Clock is System Clock */
  392. i2c_frequency = RCC_GetSystemClockFreq();
  393. break;
  394. case LL_RCC_I2C1_CLKSOURCE_HSI: /* I2C1 Clock is HSI Osc. */
  395. if (LL_RCC_HSI_IsReady() != 0U)
  396. {
  397. i2c_frequency = HSI_VALUE;
  398. }
  399. break;
  400. case LL_RCC_I2C1_CLKSOURCE_PCLK1: /* I2C1 Clock is PCLK1 */
  401. default:
  402. i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  403. break;
  404. }
  405. }
  406. else if (I2CxSource == LL_RCC_I2C2_CLKSOURCE)
  407. {
  408. /* I2C2 CLK clock frequency */
  409. switch (LL_RCC_GetI2CClockSource(I2CxSource))
  410. {
  411. case LL_RCC_I2C2_CLKSOURCE_SYSCLK: /* I2C2 Clock is System Clock */
  412. i2c_frequency = RCC_GetSystemClockFreq();
  413. break;
  414. case LL_RCC_I2C2_CLKSOURCE_HSI: /* I2C2 Clock is HSI Osc. */
  415. if (LL_RCC_HSI_IsReady() != 0U)
  416. {
  417. i2c_frequency = HSI_VALUE;
  418. }
  419. break;
  420. case LL_RCC_I2C2_CLKSOURCE_PCLK1: /* I2C2 Clock is PCLK1 */
  421. default:
  422. i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  423. break;
  424. }
  425. }
  426. else
  427. {
  428. #if defined(RCC_CCIPR_I2C3SEL)
  429. if (I2CxSource == LL_RCC_I2C3_CLKSOURCE)
  430. {
  431. /* I2C3 CLK clock frequency */
  432. switch (LL_RCC_GetI2CClockSource(I2CxSource))
  433. {
  434. case LL_RCC_I2C3_CLKSOURCE_SYSCLK: /* I2C3 Clock is System Clock */
  435. i2c_frequency = RCC_GetSystemClockFreq();
  436. break;
  437. case LL_RCC_I2C3_CLKSOURCE_HSI: /* I2C3 Clock is HSI Osc. */
  438. if (LL_RCC_HSI_IsReady() != 0U)
  439. {
  440. i2c_frequency = HSI_VALUE;
  441. }
  442. break;
  443. case LL_RCC_I2C3_CLKSOURCE_PCLK1: /* I2C3 Clock is PCLK1 */
  444. default:
  445. i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  446. break;
  447. }
  448. }
  449. #endif /* RCC_CCIPR_I2C3SEL */
  450. #if defined(RCC_CCIPR2_I2C4SEL)
  451. else
  452. {
  453. if (I2CxSource == LL_RCC_I2C4_CLKSOURCE)
  454. {
  455. /* I2C4 CLK clock frequency */
  456. switch (LL_RCC_GetI2CClockSource(I2CxSource))
  457. {
  458. case LL_RCC_I2C4_CLKSOURCE_SYSCLK: /* I2C4 Clock is System Clock */
  459. i2c_frequency = RCC_GetSystemClockFreq();
  460. break;
  461. case LL_RCC_I2C4_CLKSOURCE_HSI: /* I2C4 Clock is HSI Osc. */
  462. if (LL_RCC_HSI_IsReady() != 0U)
  463. {
  464. i2c_frequency = HSI_VALUE;
  465. }
  466. break;
  467. case LL_RCC_I2C4_CLKSOURCE_PCLK1: /* I2C4 Clock is PCLK1 */
  468. default:
  469. i2c_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  470. break;
  471. }
  472. }
  473. }
  474. #endif /*RCC_CCIPR2_I2C4SEL*/
  475. }
  476. return i2c_frequency;
  477. }
  478. /**
  479. * @brief Return LPUARTx clock frequency
  480. * @param LPUARTxSource This parameter can be one of the following values:
  481. * @arg @ref LL_RCC_LPUART1_CLKSOURCE
  482. * @retval LPUART clock frequency (in Hz)
  483. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
  484. */
  485. uint32_t LL_RCC_GetLPUARTClockFreq(uint32_t LPUARTxSource)
  486. {
  487. uint32_t lpuart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  488. /* Check parameter */
  489. assert_param(IS_LL_RCC_LPUART_CLKSOURCE(LPUARTxSource));
  490. /* LPUART1CLK clock frequency */
  491. switch (LL_RCC_GetLPUARTClockSource(LPUARTxSource))
  492. {
  493. case LL_RCC_LPUART1_CLKSOURCE_SYSCLK: /* LPUART1 Clock is System Clock */
  494. lpuart_frequency = RCC_GetSystemClockFreq();
  495. break;
  496. case LL_RCC_LPUART1_CLKSOURCE_HSI: /* LPUART1 Clock is HSI Osc. */
  497. if (LL_RCC_HSI_IsReady() != 0U)
  498. {
  499. lpuart_frequency = HSI_VALUE;
  500. }
  501. break;
  502. case LL_RCC_LPUART1_CLKSOURCE_LSE: /* LPUART1 Clock is LSE Osc. */
  503. if (LL_RCC_LSE_IsReady() != 0U)
  504. {
  505. lpuart_frequency = LSE_VALUE;
  506. }
  507. break;
  508. case LL_RCC_LPUART1_CLKSOURCE_PCLK1: /* LPUART1 Clock is PCLK1 */
  509. default:
  510. lpuart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  511. break;
  512. }
  513. return lpuart_frequency;
  514. }
  515. /**
  516. * @brief Return LPTIMx clock frequency
  517. * @param LPTIMxSource This parameter can be one of the following values:
  518. * @arg @ref LL_RCC_LPTIM1_CLKSOURCE
  519. * @retval LPTIM clock frequency (in Hz)
  520. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI, LSI or LSE) is not ready
  521. */
  522. uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)
  523. {
  524. uint32_t lptim_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  525. /* Check parameter */
  526. assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource));
  527. if (LPTIMxSource == LL_RCC_LPTIM1_CLKSOURCE)
  528. {
  529. /* LPTIM1CLK clock frequency */
  530. switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
  531. {
  532. case LL_RCC_LPTIM1_CLKSOURCE_LSI: /* LPTIM1 Clock is LSI Osc. */
  533. if (LL_RCC_LSI_IsReady() != 0U)
  534. {
  535. lptim_frequency = LSI_VALUE;
  536. }
  537. break;
  538. case LL_RCC_LPTIM1_CLKSOURCE_HSI: /* LPTIM1 Clock is HSI Osc. */
  539. if (LL_RCC_HSI_IsReady() != 0U)
  540. {
  541. lptim_frequency = HSI_VALUE;
  542. }
  543. break;
  544. case LL_RCC_LPTIM1_CLKSOURCE_LSE: /* LPTIM1 Clock is LSE Osc. */
  545. if (LL_RCC_LSE_IsReady() != 0U)
  546. {
  547. lptim_frequency = LSE_VALUE;
  548. }
  549. break;
  550. case LL_RCC_LPTIM1_CLKSOURCE_PCLK1: /* LPTIM1 Clock is PCLK1 */
  551. default:
  552. lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  553. break;
  554. }
  555. }
  556. return lptim_frequency;
  557. }
  558. #if defined(SAI1)
  559. /**
  560. * @brief Return SAIx clock frequency
  561. * @param SAIxSource This parameter can be one of the following values:
  562. * @arg @ref LL_RCC_SAI1_CLKSOURCE
  563. *
  564. * @retval SAI clock frequency (in Hz)
  565. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that PLL is not ready
  566. */
  567. uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource)
  568. {
  569. uint32_t sai_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  570. /* Check parameter */
  571. assert_param(IS_LL_RCC_SAI_CLKSOURCE(SAIxSource));
  572. if (SAIxSource == LL_RCC_SAI1_CLKSOURCE)
  573. {
  574. /* SAI1CLK clock frequency */
  575. switch (LL_RCC_GetSAIClockSource(SAIxSource))
  576. {
  577. case LL_RCC_SAI1_CLKSOURCE_SYSCLK: /* System clock used as SAI1 clock source */
  578. sai_frequency = RCC_GetSystemClockFreq();
  579. break;
  580. case LL_RCC_SAI1_CLKSOURCE_PLL: /* PLL clock used as SAI1 clock source */
  581. if (LL_RCC_PLL_IsReady() != 0U)
  582. {
  583. if (LL_RCC_PLL_IsEnabledDomain_48M() != 0U)
  584. {
  585. sai_frequency = RCC_PLL_GetFreqDomain_48M();
  586. }
  587. }
  588. break;
  589. case LL_RCC_SAI1_CLKSOURCE_PIN: /* SAI1 Clock is External clock */
  590. sai_frequency = EXTERNAL_CLOCK_VALUE;
  591. break;
  592. case LL_RCC_SAI1_CLKSOURCE_HSI: /* HSI clock used as SAI1 clock source */
  593. default:
  594. if (LL_RCC_HSI_IsReady() != 0U)
  595. {
  596. sai_frequency = HSI_VALUE;
  597. }
  598. break;
  599. }
  600. }
  601. return sai_frequency;
  602. }
  603. #endif /* SAI1 */
  604. #if defined(SPI_I2S_SUPPORT)
  605. /**
  606. * @brief Return I2Sx clock frequency
  607. * @param I2SxSource This parameter can be one of the following values:
  608. * @arg @ref LL_RCC_I2S_CLKSOURCE
  609. * @retval I2S clock frequency (in Hz)
  610. * @arg @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  611. */
  612. uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource)
  613. {
  614. uint32_t i2s_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  615. /* Check parameter */
  616. assert_param(IS_LL_RCC_I2S_CLKSOURCE(I2SxSource));
  617. if (I2SxSource == LL_RCC_I2S_CLKSOURCE)
  618. {
  619. /* I2S CLK clock frequency */
  620. switch (LL_RCC_GetI2SClockSource(I2SxSource))
  621. {
  622. case LL_RCC_I2S_CLKSOURCE_SYSCLK: /* I2S Clock is System Clock */
  623. i2s_frequency = RCC_GetSystemClockFreq();
  624. break;
  625. case LL_RCC_I2S_CLKSOURCE_PLL: /* I2S Clock is PLL"Q" */
  626. if (LL_RCC_PLL_IsReady() != 0U)
  627. {
  628. if (LL_RCC_PLL_IsEnabledDomain_48M() != 0U)
  629. {
  630. i2s_frequency = RCC_PLL_GetFreqDomain_48M();
  631. }
  632. }
  633. break;
  634. case LL_RCC_I2S_CLKSOURCE_PIN: /* I2S Clock is External clock */
  635. i2s_frequency = EXTERNAL_CLOCK_VALUE;
  636. break;
  637. case LL_RCC_I2S_CLKSOURCE_HSI: /* I2S Clock is HSI */
  638. default:
  639. if (LL_RCC_HSI_IsReady() != 0U)
  640. {
  641. i2s_frequency = HSI_VALUE;
  642. }
  643. break;
  644. }
  645. }
  646. return i2s_frequency;
  647. }
  648. #endif /* SPI_I2S_SUPPORT */
  649. #if defined(FDCAN1)
  650. /**
  651. * @brief Return FDCAN kernel clock frequency
  652. * @param FDCANxSource This parameter can be one of the following values:
  653. * @arg @ref LL_RCC_FDCAN_CLKSOURCE
  654. * @retval FDCAN kernel clock frequency (in Hz)
  655. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  656. * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected
  657. */
  658. uint32_t LL_RCC_GetFDCANClockFreq(uint32_t FDCANxSource)
  659. {
  660. uint32_t fdcan_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  661. /* Check parameter */
  662. assert_param(IS_LL_RCC_FDCAN_CLKSOURCE(FDCANxSource));
  663. /* FDCAN kernel clock frequency */
  664. switch (LL_RCC_GetFDCANClockSource(FDCANxSource))
  665. {
  666. case LL_RCC_FDCAN_CLKSOURCE_HSE: /* HSE clock used as FDCAN kernel clock */
  667. if (LL_RCC_HSE_IsReady() != 0U)
  668. {
  669. fdcan_frequency = HSE_VALUE;
  670. }
  671. break;
  672. case LL_RCC_FDCAN_CLKSOURCE_PLL: /* PLL clock used as FDCAN kernel clock */
  673. if (LL_RCC_PLL_IsReady() != 0U)
  674. {
  675. if (LL_RCC_PLL_IsEnabledDomain_48M() != 0U)
  676. {
  677. fdcan_frequency = RCC_PLL_GetFreqDomain_48M();
  678. }
  679. }
  680. break;
  681. case LL_RCC_FDCAN_CLKSOURCE_PCLK1: /* PCLK1 clock used as FDCAN kernel clock */
  682. fdcan_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  683. break;
  684. default:
  685. fdcan_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
  686. break;
  687. }
  688. return fdcan_frequency;
  689. }
  690. #endif /* FDCAN1 */
  691. /**
  692. * @brief Return RNGx clock frequency
  693. * @param RNGxSource This parameter can be one of the following values:
  694. * @arg @ref LL_RCC_RNG_CLKSOURCE
  695. * @retval RNG clock frequency (in Hz)
  696. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI48) or PLL is not ready
  697. * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected
  698. */
  699. uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource)
  700. {
  701. uint32_t rng_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  702. /* Check parameter */
  703. assert_param(IS_LL_RCC_RNG_CLKSOURCE(RNGxSource));
  704. /* RNGCLK clock frequency */
  705. switch (LL_RCC_GetRNGClockSource(RNGxSource))
  706. {
  707. case LL_RCC_RNG_CLKSOURCE_PLL: /* PLL clock used as RNG clock source */
  708. if (LL_RCC_PLL_IsReady() != 0U)
  709. {
  710. if (LL_RCC_PLL_IsEnabledDomain_48M() != 0U)
  711. {
  712. rng_frequency = RCC_PLL_GetFreqDomain_48M();
  713. }
  714. }
  715. break;
  716. case LL_RCC_RNG_CLKSOURCE_HSI48: /* HSI48 used as RNG clock source */
  717. if (LL_RCC_HSI48_IsReady() != 0U)
  718. {
  719. rng_frequency = HSI48_VALUE;
  720. }
  721. break;
  722. default:
  723. rng_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
  724. break;
  725. }
  726. return rng_frequency;
  727. }
  728. /**
  729. * @brief Return USBx clock frequency
  730. * @param USBxSource This parameter can be one of the following values:
  731. * @arg @ref LL_RCC_USB_CLKSOURCE
  732. * @retval USB clock frequency (in Hz)
  733. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI48) or PLL is not ready
  734. * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected
  735. */
  736. uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource)
  737. {
  738. uint32_t usb_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  739. /* Check parameter */
  740. assert_param(IS_LL_RCC_USB_CLKSOURCE(USBxSource));
  741. /* USBCLK clock frequency */
  742. switch (LL_RCC_GetUSBClockSource(USBxSource))
  743. {
  744. case LL_RCC_USB_CLKSOURCE_PLL: /* PLL clock used as USB clock source */
  745. if (LL_RCC_PLL_IsReady() != 0U)
  746. {
  747. if (LL_RCC_PLL_IsEnabledDomain_48M() != 0U)
  748. {
  749. usb_frequency = RCC_PLL_GetFreqDomain_48M();
  750. }
  751. }
  752. break;
  753. case LL_RCC_USB_CLKSOURCE_HSI48: /* HSI48 used as USB clock source */
  754. if (LL_RCC_HSI48_IsReady() != 0U)
  755. {
  756. usb_frequency = HSI48_VALUE;
  757. }
  758. break;
  759. default:
  760. usb_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
  761. break;
  762. }
  763. return usb_frequency;
  764. }
  765. /**
  766. * @brief Return ADCx clock frequency
  767. * @param ADCxSource This parameter can be one of the following values:
  768. * @arg @ref LL_RCC_ADC12_CLKSOURCE
  769. * @arg @ref LL_RCC_ADC345_CLKSOURCE (*)
  770. *
  771. * (*) value not defined in all devices.
  772. * @retval ADC clock frequency (in Hz)
  773. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that PLL is not ready
  774. * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that no clock source selected
  775. */
  776. uint32_t LL_RCC_GetADCClockFreq(uint32_t ADCxSource)
  777. {
  778. uint32_t adc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  779. /* Check parameter */
  780. assert_param(IS_LL_RCC_ADC_CLKSOURCE(ADCxSource));
  781. if (ADCxSource == LL_RCC_ADC12_CLKSOURCE)
  782. {
  783. /* ADC12CLK clock frequency */
  784. switch (LL_RCC_GetADCClockSource(ADCxSource))
  785. {
  786. case LL_RCC_ADC12_CLKSOURCE_PLL: /* PLL clock used as ADC12 clock source */
  787. if (LL_RCC_PLL_IsReady() != 0U)
  788. {
  789. if (LL_RCC_PLL_IsEnabledDomain_ADC() != 0U)
  790. {
  791. adc_frequency = RCC_PLL_GetFreqDomain_ADC();
  792. }
  793. }
  794. break;
  795. case LL_RCC_ADC12_CLKSOURCE_SYSCLK: /* System clock used as ADC12 clock source */
  796. adc_frequency = RCC_GetSystemClockFreq();
  797. break;
  798. case LL_RCC_ADC12_CLKSOURCE_NONE: /* No clock used as ADC12 clock source */
  799. default:
  800. adc_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
  801. break;
  802. }
  803. }
  804. #if defined(ADC345_COMMON)
  805. else
  806. {
  807. /* ADC345CLK clock frequency */
  808. switch (LL_RCC_GetADCClockSource(ADCxSource))
  809. {
  810. case LL_RCC_ADC345_CLKSOURCE_PLL: /* PLL clock used as ADC345 clock source */
  811. if (LL_RCC_PLL_IsReady() != 0U)
  812. {
  813. if (LL_RCC_PLL_IsEnabledDomain_ADC() != 0U)
  814. {
  815. adc_frequency = RCC_PLL_GetFreqDomain_ADC();
  816. }
  817. }
  818. break;
  819. case LL_RCC_ADC345_CLKSOURCE_SYSCLK: /* System clock used as ADC345 clock source */
  820. adc_frequency = RCC_GetSystemClockFreq();
  821. break;
  822. case LL_RCC_ADC345_CLKSOURCE_NONE: /* No clock used as ADC345 clock source */
  823. default:
  824. adc_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
  825. break;
  826. }
  827. }
  828. #endif /* ADC345_COMMON */
  829. return adc_frequency;
  830. }
  831. #if defined(QUADSPI)
  832. /**
  833. * @brief Return QUADSPI clock frequency
  834. * @param QUADSPIxSource This parameter can be one of the following values:
  835. * @arg @ref LL_RCC_QUADSPI_CLKSOURCE
  836. * @retval QUADSPI clock frequency (in Hz)
  837. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that no clock is configured
  838. */
  839. uint32_t LL_RCC_GetQUADSPIClockFreq(uint32_t QUADSPIxSource)
  840. {
  841. uint32_t quadspi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  842. /* Check parameter */
  843. assert_param(IS_LL_RCC_QUADSPI_CLKSOURCE(QUADSPIxSource));
  844. /* QUADSPI clock frequency */
  845. switch (LL_RCC_GetQUADSPIClockSource(QUADSPIxSource))
  846. {
  847. case LL_RCC_QUADSPI_CLKSOURCE_SYSCLK: /* SYSCLK used as QUADSPI source */
  848. quadspi_frequency = RCC_GetSystemClockFreq();
  849. break;
  850. case LL_RCC_QUADSPI_CLKSOURCE_HSI: /* HSI clock used as QUADSPI source */
  851. if (LL_RCC_HSI_IsReady() != 0U)
  852. {
  853. quadspi_frequency = HSI_VALUE;
  854. }
  855. break;
  856. case LL_RCC_QUADSPI_CLKSOURCE_PLL: /* PLL clock used as QUADSPI source */
  857. if (LL_RCC_PLL_IsReady() != 0U)
  858. {
  859. if (LL_RCC_PLL_IsEnabledDomain_48M() != 0U)
  860. {
  861. quadspi_frequency = RCC_PLL_GetFreqDomain_48M();
  862. }
  863. }
  864. break;
  865. default:
  866. /* Nothing to do: quadspi frequency already initilalized to LL_RCC_PERIPH_FREQUENCY_NO */
  867. break;
  868. }
  869. return quadspi_frequency;
  870. }
  871. #endif /* QUADSPI */
  872. /**
  873. * @}
  874. */
  875. /**
  876. * @}
  877. */
  878. /** @addtogroup RCC_LL_Private_Functions
  879. * @{
  880. */
  881. /**
  882. * @brief Return SYSTEM clock frequency
  883. * @retval SYSTEM clock frequency (in Hz)
  884. */
  885. static uint32_t RCC_GetSystemClockFreq(void)
  886. {
  887. uint32_t frequency;
  888. /* Get SYSCLK source -------------------------------------------------------*/
  889. switch (LL_RCC_GetSysClkSource())
  890. {
  891. case LL_RCC_SYS_CLKSOURCE_STATUS_HSI: /* HSI used as system clock source */
  892. frequency = HSI_VALUE;
  893. break;
  894. case LL_RCC_SYS_CLKSOURCE_STATUS_HSE: /* HSE used as system clock source */
  895. frequency = HSE_VALUE;
  896. break;
  897. case LL_RCC_SYS_CLKSOURCE_STATUS_PLL: /* PLL used as system clock source */
  898. frequency = RCC_PLL_GetFreqDomain_SYS();
  899. break;
  900. default:
  901. frequency = HSI_VALUE;
  902. break;
  903. }
  904. return frequency;
  905. }
  906. /**
  907. * @brief Return HCLK clock frequency
  908. * @param SYSCLK_Frequency SYSCLK clock frequency
  909. * @retval HCLK clock frequency (in Hz)
  910. */
  911. static uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)
  912. {
  913. /* HCLK clock frequency */
  914. return __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler());
  915. }
  916. /**
  917. * @brief Return PCLK1 clock frequency
  918. * @param HCLK_Frequency HCLK clock frequency
  919. * @retval PCLK1 clock frequency (in Hz)
  920. */
  921. static uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)
  922. {
  923. /* PCLK1 clock frequency */
  924. return __LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler());
  925. }
  926. /**
  927. * @brief Return PCLK2 clock frequency
  928. * @param HCLK_Frequency HCLK clock frequency
  929. * @retval PCLK2 clock frequency (in Hz)
  930. */
  931. static uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency)
  932. {
  933. /* PCLK2 clock frequency */
  934. return __LL_RCC_CALC_PCLK2_FREQ(HCLK_Frequency, LL_RCC_GetAPB2Prescaler());
  935. }
  936. /**
  937. * @brief Return PLL clock frequency used for system domain
  938. * @retval PLL clock frequency (in Hz)
  939. */
  940. static uint32_t RCC_PLL_GetFreqDomain_SYS(void)
  941. {
  942. uint32_t pllinputfreq, pllsource;
  943. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  944. SYSCLK = PLL_VCO / PLLR
  945. */
  946. pllsource = LL_RCC_PLL_GetMainSource();
  947. switch (pllsource)
  948. {
  949. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  950. pllinputfreq = HSI_VALUE;
  951. break;
  952. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  953. pllinputfreq = HSE_VALUE;
  954. break;
  955. default:
  956. pllinputfreq = HSI_VALUE;
  957. break;
  958. }
  959. return __LL_RCC_CALC_PLLCLK_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  960. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
  961. }
  962. /**
  963. * @brief Return PLL clock frequency used for ADC domain
  964. * @retval PLL clock frequency (in Hz)
  965. */
  966. static uint32_t RCC_PLL_GetFreqDomain_ADC(void)
  967. {
  968. uint32_t pllinputfreq, pllsource;
  969. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  970. ADC Domain clock = PLL_VCO / PLLP
  971. */
  972. pllsource = LL_RCC_PLL_GetMainSource();
  973. switch (pllsource)
  974. {
  975. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  976. pllinputfreq = HSI_VALUE;
  977. break;
  978. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  979. pllinputfreq = HSE_VALUE;
  980. break;
  981. default:
  982. pllinputfreq = HSI_VALUE;
  983. break;
  984. }
  985. return __LL_RCC_CALC_PLLCLK_ADC_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  986. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetP());
  987. }
  988. /**
  989. * @brief Return PLL clock frequency used for 48 MHz domain
  990. * @retval PLL clock frequency (in Hz)
  991. */
  992. static uint32_t RCC_PLL_GetFreqDomain_48M(void)
  993. {
  994. uint32_t pllinputfreq, pllsource;
  995. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  996. 48M Domain clock = PLL_VCO / PLLQ
  997. */
  998. pllsource = LL_RCC_PLL_GetMainSource();
  999. switch (pllsource)
  1000. {
  1001. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1002. pllinputfreq = HSI_VALUE;
  1003. break;
  1004. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1005. pllinputfreq = HSE_VALUE;
  1006. break;
  1007. default:
  1008. pllinputfreq = HSI_VALUE;
  1009. break;
  1010. }
  1011. return __LL_RCC_CALC_PLLCLK_48M_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1012. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ());
  1013. }
  1014. /**
  1015. * @}
  1016. */
  1017. /**
  1018. * @}
  1019. */
  1020. /**
  1021. * @}
  1022. */
  1023. #endif /* USE_FULL_LL_DRIVER */