stm32f4xx_ll_rcc.c 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655
  1. /**
  2. ******************************************************************************
  3. * @file stm32f4xx_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 "stm32f4xx_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 STM32F4xx_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. #if defined(FMPI2C1)
  58. #define IS_LL_RCC_FMPI2C_CLKSOURCE(__VALUE__) ((__VALUE__) == LL_RCC_FMPI2C1_CLKSOURCE)
  59. #endif /* FMPI2C1 */
  60. #if defined(LPTIM1)
  61. #define IS_LL_RCC_LPTIM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LPTIM1_CLKSOURCE))
  62. #endif /* LPTIM1 */
  63. #if defined(SAI1)
  64. #if defined(RCC_DCKCFGR_SAI1SRC)
  65. #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SAI1_CLKSOURCE) \
  66. || ((__VALUE__) == LL_RCC_SAI2_CLKSOURCE))
  67. #elif defined(RCC_DCKCFGR_SAI1ASRC)
  68. #define IS_LL_RCC_SAI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SAI1_A_CLKSOURCE) \
  69. || ((__VALUE__) == LL_RCC_SAI1_B_CLKSOURCE))
  70. #endif /* RCC_DCKCFGR_SAI1SRC */
  71. #endif /* SAI1 */
  72. #if defined(SDIO)
  73. #define IS_LL_RCC_SDIO_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SDIO_CLKSOURCE))
  74. #endif /* SDIO */
  75. #if defined(RNG)
  76. #define IS_LL_RCC_RNG_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_RNG_CLKSOURCE))
  77. #endif /* RNG */
  78. #if defined(USB_OTG_FS) || defined(USB_OTG_HS)
  79. #define IS_LL_RCC_USB_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_USB_CLKSOURCE))
  80. #endif /* USB_OTG_FS || USB_OTG_HS */
  81. #if defined(DFSDM2_Channel0)
  82. #define IS_LL_RCC_DFSDM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DFSDM1_CLKSOURCE))
  83. #define IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DFSDM1_AUDIO_CLKSOURCE) \
  84. || ((__VALUE__) == LL_RCC_DFSDM2_AUDIO_CLKSOURCE))
  85. #elif defined(DFSDM1_Channel0)
  86. #define IS_LL_RCC_DFSDM_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DFSDM1_CLKSOURCE))
  87. #define IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DFSDM1_AUDIO_CLKSOURCE))
  88. #endif /* DFSDM2_Channel0 */
  89. #if defined(RCC_DCKCFGR_I2S2SRC)
  90. #define IS_LL_RCC_I2S_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2S1_CLKSOURCE) \
  91. || ((__VALUE__) == LL_RCC_I2S2_CLKSOURCE))
  92. #else
  93. #define IS_LL_RCC_I2S_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_I2S1_CLKSOURCE))
  94. #endif /* RCC_DCKCFGR_I2S2SRC */
  95. #if defined(CEC)
  96. #define IS_LL_RCC_CEC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_CEC_CLKSOURCE))
  97. #endif /* CEC */
  98. #if defined(DSI)
  99. #define IS_LL_RCC_DSI_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_DSI_CLKSOURCE))
  100. #endif /* DSI */
  101. #if defined(LTDC)
  102. #define IS_LL_RCC_LTDC_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_LTDC_CLKSOURCE))
  103. #endif /* LTDC */
  104. #if defined(SPDIFRX)
  105. #define IS_LL_RCC_SPDIFRX_CLKSOURCE(__VALUE__) (((__VALUE__) == LL_RCC_SPDIFRX1_CLKSOURCE))
  106. #endif /* SPDIFRX */
  107. /**
  108. * @}
  109. */
  110. /* Private function prototypes -----------------------------------------------*/
  111. /** @defgroup RCC_LL_Private_Functions RCC Private functions
  112. * @{
  113. */
  114. uint32_t RCC_GetSystemClockFreq(void);
  115. uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency);
  116. uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency);
  117. uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency);
  118. uint32_t RCC_PLL_GetFreqDomain_SYS(uint32_t SYSCLK_Source);
  119. uint32_t RCC_PLL_GetFreqDomain_48M(void);
  120. #if defined(RCC_DCKCFGR_I2SSRC) || defined(RCC_DCKCFGR_I2S1SRC)
  121. uint32_t RCC_PLL_GetFreqDomain_I2S(void);
  122. #endif /* RCC_DCKCFGR_I2SSRC || RCC_DCKCFGR_I2S1SRC */
  123. #if defined(SPDIFRX)
  124. uint32_t RCC_PLL_GetFreqDomain_SPDIFRX(void);
  125. #endif /* SPDIFRX */
  126. #if defined(RCC_PLLCFGR_PLLR)
  127. #if defined(SAI1)
  128. uint32_t RCC_PLL_GetFreqDomain_SAI(void);
  129. #endif /* SAI1 */
  130. #endif /* RCC_PLLCFGR_PLLR */
  131. #if defined(DSI)
  132. uint32_t RCC_PLL_GetFreqDomain_DSI(void);
  133. #endif /* DSI */
  134. #if defined(RCC_PLLSAI_SUPPORT)
  135. uint32_t RCC_PLLSAI_GetFreqDomain_SAI(void);
  136. #if defined(RCC_PLLSAICFGR_PLLSAIP)
  137. uint32_t RCC_PLLSAI_GetFreqDomain_48M(void);
  138. #endif /* RCC_PLLSAICFGR_PLLSAIP */
  139. #if defined(LTDC)
  140. uint32_t RCC_PLLSAI_GetFreqDomain_LTDC(void);
  141. #endif /* LTDC */
  142. #endif /* RCC_PLLSAI_SUPPORT */
  143. #if defined(RCC_PLLI2S_SUPPORT)
  144. uint32_t RCC_PLLI2S_GetFreqDomain_I2S(void);
  145. #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
  146. uint32_t RCC_PLLI2S_GetFreqDomain_48M(void);
  147. #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
  148. #if defined(SAI1)
  149. uint32_t RCC_PLLI2S_GetFreqDomain_SAI(void);
  150. #endif /* SAI1 */
  151. #if defined(SPDIFRX)
  152. uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void);
  153. #endif /* SPDIFRX */
  154. #endif /* RCC_PLLI2S_SUPPORT */
  155. /**
  156. * @}
  157. */
  158. /* Exported functions --------------------------------------------------------*/
  159. /** @addtogroup RCC_LL_Exported_Functions
  160. * @{
  161. */
  162. /** @addtogroup RCC_LL_EF_Init
  163. * @{
  164. */
  165. /**
  166. * @brief Reset the RCC clock configuration to the default reset state.
  167. * @note The default reset state of the clock configuration is given below:
  168. * - HSI ON and used as system clock source
  169. * - HSE and PLL OFF
  170. * - AHB, APB1 and APB2 prescaler set to 1.
  171. * - CSS, MCO OFF
  172. * - All interrupts disabled
  173. * @note This function doesn't modify the configuration of the
  174. * - Peripheral clocks
  175. * - LSI, LSE and RTC clocks
  176. * @retval An ErrorStatus enumeration value:
  177. * - SUCCESS: RCC registers are de-initialized
  178. * - ERROR: not applicable
  179. */
  180. ErrorStatus LL_RCC_DeInit(void)
  181. {
  182. uint32_t vl_mask = 0U;
  183. /* Set HSION bit */
  184. LL_RCC_HSI_Enable();
  185. /* Wait for HSI READY bit */
  186. while(LL_RCC_HSI_IsReady() != 1U)
  187. {}
  188. /* Reset CFGR register */
  189. LL_RCC_WriteReg(CFGR, 0x00000000U);
  190. vl_mask = 0xFFFFFFFFU;
  191. /* Reset HSEON, PLLSYSON bits */
  192. CLEAR_BIT(vl_mask, (RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_PLLON | RCC_CR_CSSON));
  193. #if defined(RCC_PLLSAI_SUPPORT)
  194. /* Reset PLLSAION bit */
  195. CLEAR_BIT(vl_mask, RCC_CR_PLLSAION);
  196. #endif /* RCC_PLLSAI_SUPPORT */
  197. #if defined(RCC_PLLI2S_SUPPORT)
  198. /* Reset PLLI2SON bit */
  199. CLEAR_BIT(vl_mask, RCC_CR_PLLI2SON);
  200. #endif /* RCC_PLLI2S_SUPPORT */
  201. /* Write new mask in CR register */
  202. LL_RCC_WriteReg(CR, vl_mask);
  203. /* Set HSITRIM bits to the reset value*/
  204. LL_RCC_HSI_SetCalibTrimming(0x10U);
  205. /* Wait for PLL READY bit to be reset */
  206. while(LL_RCC_PLL_IsReady() != 0U)
  207. {}
  208. /* Reset PLLCFGR register */
  209. LL_RCC_WriteReg(PLLCFGR, RCC_PLLCFGR_RST_VALUE);
  210. #if defined(RCC_PLLI2S_SUPPORT)
  211. /* Reset PLLI2SCFGR register */
  212. LL_RCC_WriteReg(PLLI2SCFGR, RCC_PLLI2SCFGR_RST_VALUE);
  213. #endif /* RCC_PLLI2S_SUPPORT */
  214. #if defined(RCC_PLLSAI_SUPPORT)
  215. /* Reset PLLSAICFGR register */
  216. LL_RCC_WriteReg(PLLSAICFGR, RCC_PLLSAICFGR_RST_VALUE);
  217. #endif /* RCC_PLLSAI_SUPPORT */
  218. /* Disable all interrupts */
  219. LL_RCC_WriteReg(CIR, 0x00000000U);
  220. /* Clear all interrupts flags */
  221. LL_RCC_WriteReg(CSR, 0x00000000U);
  222. return SUCCESS;
  223. }
  224. /**
  225. * @}
  226. */
  227. /** @addtogroup RCC_LL_EF_Get_Freq
  228. * @brief Return the frequencies of different on chip clocks; System, AHB, APB1 and APB2 buses clocks
  229. * and different peripheral clocks available on the device.
  230. * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(**)
  231. * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(***)
  232. * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(***)
  233. * or HSI_VALUE(**) multiplied/divided by the PLL factors.
  234. * @note (**) HSI_VALUE is a constant defined in this file (default value
  235. * 16 MHz) but the real value may vary depending on the variations
  236. * in voltage and temperature.
  237. * @note (***) HSE_VALUE is a constant defined in this file (default value
  238. * 25 MHz), user has to ensure that HSE_VALUE is same as the real
  239. * frequency of the crystal used. Otherwise, this function may
  240. * have wrong result.
  241. * @note The result of this function could be incorrect when using fractional
  242. * value for HSE crystal.
  243. * @note This function can be used by the user application to compute the
  244. * baud-rate for the communication peripherals or configure other parameters.
  245. * @{
  246. */
  247. /**
  248. * @brief Return the frequencies of different on chip clocks; System, AHB, APB1 and APB2 buses clocks
  249. * @note Each time SYSCLK, HCLK, PCLK1 and/or PCLK2 clock changes, this function
  250. * must be called to update structure fields. Otherwise, any
  251. * configuration based on this function will be incorrect.
  252. * @param RCC_Clocks pointer to a @ref LL_RCC_ClocksTypeDef structure which will hold the clocks frequencies
  253. * @retval None
  254. */
  255. void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks)
  256. {
  257. /* Get SYSCLK frequency */
  258. RCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq();
  259. /* HCLK clock frequency */
  260. RCC_Clocks->HCLK_Frequency = RCC_GetHCLKClockFreq(RCC_Clocks->SYSCLK_Frequency);
  261. /* PCLK1 clock frequency */
  262. RCC_Clocks->PCLK1_Frequency = RCC_GetPCLK1ClockFreq(RCC_Clocks->HCLK_Frequency);
  263. /* PCLK2 clock frequency */
  264. RCC_Clocks->PCLK2_Frequency = RCC_GetPCLK2ClockFreq(RCC_Clocks->HCLK_Frequency);
  265. }
  266. #if defined(FMPI2C1)
  267. /**
  268. * @brief Return FMPI2Cx clock frequency
  269. * @param FMPI2CxSource This parameter can be one of the following values:
  270. * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE
  271. * @retval FMPI2C clock frequency (in Hz)
  272. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that HSI oscillator is not ready
  273. */
  274. uint32_t LL_RCC_GetFMPI2CClockFreq(uint32_t FMPI2CxSource)
  275. {
  276. uint32_t FMPI2C_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  277. /* Check parameter */
  278. assert_param(IS_LL_RCC_FMPI2C_CLKSOURCE(FMPI2CxSource));
  279. if (FMPI2CxSource == LL_RCC_FMPI2C1_CLKSOURCE)
  280. {
  281. /* FMPI2C1 CLK clock frequency */
  282. switch (LL_RCC_GetFMPI2CClockSource(FMPI2CxSource))
  283. {
  284. case LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK: /* FMPI2C1 Clock is System Clock */
  285. FMPI2C_frequency = RCC_GetSystemClockFreq();
  286. break;
  287. case LL_RCC_FMPI2C1_CLKSOURCE_HSI: /* FMPI2C1 Clock is HSI Osc. */
  288. if (LL_RCC_HSI_IsReady())
  289. {
  290. FMPI2C_frequency = HSI_VALUE;
  291. }
  292. break;
  293. case LL_RCC_FMPI2C1_CLKSOURCE_PCLK1: /* FMPI2C1 Clock is PCLK1 */
  294. default:
  295. FMPI2C_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  296. break;
  297. }
  298. }
  299. return FMPI2C_frequency;
  300. }
  301. #endif /* FMPI2C1 */
  302. /**
  303. * @brief Return I2Sx clock frequency
  304. * @param I2SxSource This parameter can be one of the following values:
  305. * @arg @ref LL_RCC_I2S1_CLKSOURCE
  306. * @arg @ref LL_RCC_I2S2_CLKSOURCE (*)
  307. *
  308. * (*) value not defined in all devices.
  309. * @retval I2S clock frequency (in Hz)
  310. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  311. */
  312. uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource)
  313. {
  314. uint32_t i2s_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  315. /* Check parameter */
  316. assert_param(IS_LL_RCC_I2S_CLKSOURCE(I2SxSource));
  317. if (I2SxSource == LL_RCC_I2S1_CLKSOURCE)
  318. {
  319. /* I2S1 CLK clock frequency */
  320. switch (LL_RCC_GetI2SClockSource(I2SxSource))
  321. {
  322. #if defined(RCC_PLLI2S_SUPPORT)
  323. case LL_RCC_I2S1_CLKSOURCE_PLLI2S: /* I2S1 Clock is PLLI2S */
  324. if (LL_RCC_PLLI2S_IsReady())
  325. {
  326. i2s_frequency = RCC_PLLI2S_GetFreqDomain_I2S();
  327. }
  328. break;
  329. #endif /* RCC_PLLI2S_SUPPORT */
  330. #if defined(RCC_DCKCFGR_I2SSRC) || defined(RCC_DCKCFGR_I2S1SRC)
  331. case LL_RCC_I2S1_CLKSOURCE_PLL: /* I2S1 Clock is PLL */
  332. if (LL_RCC_PLL_IsReady())
  333. {
  334. i2s_frequency = RCC_PLL_GetFreqDomain_I2S();
  335. }
  336. break;
  337. case LL_RCC_I2S1_CLKSOURCE_PLLSRC: /* I2S1 Clock is PLL Main source */
  338. switch (LL_RCC_PLL_GetMainSource())
  339. {
  340. case LL_RCC_PLLSOURCE_HSE: /* I2S1 Clock is HSE Osc. */
  341. if (LL_RCC_HSE_IsReady())
  342. {
  343. i2s_frequency = HSE_VALUE;
  344. }
  345. break;
  346. case LL_RCC_PLLSOURCE_HSI: /* I2S1 Clock is HSI Osc. */
  347. default:
  348. if (LL_RCC_HSI_IsReady())
  349. {
  350. i2s_frequency = HSI_VALUE;
  351. }
  352. break;
  353. }
  354. break;
  355. #endif /* RCC_DCKCFGR_I2SSRC || RCC_DCKCFGR_I2S1SRC */
  356. case LL_RCC_I2S1_CLKSOURCE_PIN: /* I2S1 Clock is External clock */
  357. default:
  358. i2s_frequency = EXTERNAL_CLOCK_VALUE;
  359. break;
  360. }
  361. }
  362. #if defined(RCC_DCKCFGR_I2S2SRC)
  363. else
  364. {
  365. /* I2S2 CLK clock frequency */
  366. switch (LL_RCC_GetI2SClockSource(I2SxSource))
  367. {
  368. case LL_RCC_I2S2_CLKSOURCE_PLLI2S: /* I2S2 Clock is PLLI2S */
  369. if (LL_RCC_PLLI2S_IsReady())
  370. {
  371. i2s_frequency = RCC_PLLI2S_GetFreqDomain_I2S();
  372. }
  373. break;
  374. case LL_RCC_I2S2_CLKSOURCE_PLL: /* I2S2 Clock is PLL */
  375. if (LL_RCC_PLL_IsReady())
  376. {
  377. i2s_frequency = RCC_PLL_GetFreqDomain_I2S();
  378. }
  379. break;
  380. case LL_RCC_I2S2_CLKSOURCE_PLLSRC: /* I2S2 Clock is PLL Main source */
  381. switch (LL_RCC_PLL_GetMainSource())
  382. {
  383. case LL_RCC_PLLSOURCE_HSE: /* I2S2 Clock is HSE Osc. */
  384. if (LL_RCC_HSE_IsReady())
  385. {
  386. i2s_frequency = HSE_VALUE;
  387. }
  388. break;
  389. case LL_RCC_PLLSOURCE_HSI: /* I2S2 Clock is HSI Osc. */
  390. default:
  391. if (LL_RCC_HSI_IsReady())
  392. {
  393. i2s_frequency = HSI_VALUE;
  394. }
  395. break;
  396. }
  397. break;
  398. case LL_RCC_I2S2_CLKSOURCE_PIN: /* I2S2 Clock is External clock */
  399. default:
  400. i2s_frequency = EXTERNAL_CLOCK_VALUE;
  401. break;
  402. }
  403. }
  404. #endif /* RCC_DCKCFGR_I2S2SRC */
  405. return i2s_frequency;
  406. }
  407. #if defined(LPTIM1)
  408. /**
  409. * @brief Return LPTIMx clock frequency
  410. * @param LPTIMxSource This parameter can be one of the following values:
  411. * @arg @ref LL_RCC_LPTIM1_CLKSOURCE
  412. * @retval LPTIM clock frequency (in Hz)
  413. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI, LSI or LSE) is not ready
  414. */
  415. uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource)
  416. {
  417. uint32_t lptim_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  418. /* Check parameter */
  419. assert_param(IS_LL_RCC_LPTIM_CLKSOURCE(LPTIMxSource));
  420. if (LPTIMxSource == LL_RCC_LPTIM1_CLKSOURCE)
  421. {
  422. /* LPTIM1CLK clock frequency */
  423. switch (LL_RCC_GetLPTIMClockSource(LPTIMxSource))
  424. {
  425. case LL_RCC_LPTIM1_CLKSOURCE_LSI: /* LPTIM1 Clock is LSI Osc. */
  426. if (LL_RCC_LSI_IsReady())
  427. {
  428. lptim_frequency = LSI_VALUE;
  429. }
  430. break;
  431. case LL_RCC_LPTIM1_CLKSOURCE_HSI: /* LPTIM1 Clock is HSI Osc. */
  432. if (LL_RCC_HSI_IsReady())
  433. {
  434. lptim_frequency = HSI_VALUE;
  435. }
  436. break;
  437. case LL_RCC_LPTIM1_CLKSOURCE_LSE: /* LPTIM1 Clock is LSE Osc. */
  438. if (LL_RCC_LSE_IsReady())
  439. {
  440. lptim_frequency = LSE_VALUE;
  441. }
  442. break;
  443. case LL_RCC_LPTIM1_CLKSOURCE_PCLK1: /* LPTIM1 Clock is PCLK1 */
  444. default:
  445. lptim_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  446. break;
  447. }
  448. }
  449. return lptim_frequency;
  450. }
  451. #endif /* LPTIM1 */
  452. #if defined(SAI1)
  453. /**
  454. * @brief Return SAIx clock frequency
  455. * @param SAIxSource This parameter can be one of the following values:
  456. * @arg @ref LL_RCC_SAI1_CLKSOURCE (*)
  457. * @arg @ref LL_RCC_SAI2_CLKSOURCE (*)
  458. * @arg @ref LL_RCC_SAI1_A_CLKSOURCE (*)
  459. * @arg @ref LL_RCC_SAI1_B_CLKSOURCE (*)
  460. *
  461. * (*) value not defined in all devices.
  462. * @retval SAI clock frequency (in Hz)
  463. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  464. */
  465. uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource)
  466. {
  467. uint32_t sai_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  468. /* Check parameter */
  469. assert_param(IS_LL_RCC_SAI_CLKSOURCE(SAIxSource));
  470. #if defined(RCC_DCKCFGR_SAI1SRC)
  471. if ((SAIxSource == LL_RCC_SAI1_CLKSOURCE) || (SAIxSource == LL_RCC_SAI2_CLKSOURCE))
  472. {
  473. /* SAI1CLK clock frequency */
  474. switch (LL_RCC_GetSAIClockSource(SAIxSource))
  475. {
  476. case LL_RCC_SAI1_CLKSOURCE_PLLSAI: /* PLLSAI clock used as SAI1 clock source */
  477. case LL_RCC_SAI2_CLKSOURCE_PLLSAI: /* PLLSAI clock used as SAI2 clock source */
  478. if (LL_RCC_PLLSAI_IsReady())
  479. {
  480. sai_frequency = RCC_PLLSAI_GetFreqDomain_SAI();
  481. }
  482. break;
  483. case LL_RCC_SAI1_CLKSOURCE_PLLI2S: /* PLLI2S clock used as SAI1 clock source */
  484. case LL_RCC_SAI2_CLKSOURCE_PLLI2S: /* PLLI2S clock used as SAI2 clock source */
  485. if (LL_RCC_PLLI2S_IsReady())
  486. {
  487. sai_frequency = RCC_PLLI2S_GetFreqDomain_SAI();
  488. }
  489. break;
  490. case LL_RCC_SAI1_CLKSOURCE_PLL: /* PLL clock used as SAI1 clock source */
  491. case LL_RCC_SAI2_CLKSOURCE_PLL: /* PLL clock used as SAI2 clock source */
  492. if (LL_RCC_PLL_IsReady())
  493. {
  494. sai_frequency = RCC_PLL_GetFreqDomain_SAI();
  495. }
  496. break;
  497. case LL_RCC_SAI2_CLKSOURCE_PLLSRC:
  498. switch (LL_RCC_PLL_GetMainSource())
  499. {
  500. case LL_RCC_PLLSOURCE_HSE: /* HSE clock used as SAI2 clock source */
  501. if (LL_RCC_HSE_IsReady())
  502. {
  503. sai_frequency = HSE_VALUE;
  504. }
  505. break;
  506. case LL_RCC_PLLSOURCE_HSI: /* HSI clock used as SAI2 clock source */
  507. default:
  508. if (LL_RCC_HSI_IsReady())
  509. {
  510. sai_frequency = HSI_VALUE;
  511. }
  512. break;
  513. }
  514. break;
  515. case LL_RCC_SAI1_CLKSOURCE_PIN: /* External input clock used as SAI1 clock source */
  516. default:
  517. sai_frequency = EXTERNAL_CLOCK_VALUE;
  518. break;
  519. }
  520. }
  521. #endif /* RCC_DCKCFGR_SAI1SRC */
  522. #if defined(RCC_DCKCFGR_SAI1ASRC)
  523. if ((SAIxSource == LL_RCC_SAI1_A_CLKSOURCE) || (SAIxSource == LL_RCC_SAI1_B_CLKSOURCE))
  524. {
  525. /* SAI1CLK clock frequency */
  526. switch (LL_RCC_GetSAIClockSource(SAIxSource))
  527. {
  528. #if defined(RCC_PLLSAI_SUPPORT)
  529. case LL_RCC_SAI1_A_CLKSOURCE_PLLSAI: /* PLLSAI clock used as SAI1 Block A clock source */
  530. case LL_RCC_SAI1_B_CLKSOURCE_PLLSAI: /* PLLSAI clock used as SAI1 Block B clock source */
  531. if (LL_RCC_PLLSAI_IsReady())
  532. {
  533. sai_frequency = RCC_PLLSAI_GetFreqDomain_SAI();
  534. }
  535. break;
  536. #endif /* RCC_PLLSAI_SUPPORT */
  537. case LL_RCC_SAI1_A_CLKSOURCE_PLLI2S: /* PLLI2S clock used as SAI1 Block A clock source */
  538. case LL_RCC_SAI1_B_CLKSOURCE_PLLI2S: /* PLLI2S clock used as SAI1 Block B clock source */
  539. if (LL_RCC_PLLI2S_IsReady())
  540. {
  541. sai_frequency = RCC_PLLI2S_GetFreqDomain_SAI();
  542. }
  543. break;
  544. #if defined(RCC_SAI1A_PLLSOURCE_SUPPORT)
  545. case LL_RCC_SAI1_A_CLKSOURCE_PLL: /* PLL clock used as SAI1 Block A clock source */
  546. case LL_RCC_SAI1_B_CLKSOURCE_PLL: /* PLL clock used as SAI1 Block B clock source */
  547. if (LL_RCC_PLL_IsReady())
  548. {
  549. sai_frequency = RCC_PLL_GetFreqDomain_SAI();
  550. }
  551. break;
  552. case LL_RCC_SAI1_A_CLKSOURCE_PLLSRC:
  553. case LL_RCC_SAI1_B_CLKSOURCE_PLLSRC:
  554. switch (LL_RCC_PLL_GetMainSource())
  555. {
  556. case LL_RCC_PLLSOURCE_HSE: /* HSE clock used as SAI1 Block A or B clock source */
  557. if (LL_RCC_HSE_IsReady())
  558. {
  559. sai_frequency = HSE_VALUE;
  560. }
  561. break;
  562. case LL_RCC_PLLSOURCE_HSI: /* HSI clock used as SAI1 Block A or B clock source */
  563. default:
  564. if (LL_RCC_HSI_IsReady())
  565. {
  566. sai_frequency = HSI_VALUE;
  567. }
  568. break;
  569. }
  570. break;
  571. #endif /* RCC_SAI1A_PLLSOURCE_SUPPORT */
  572. case LL_RCC_SAI1_A_CLKSOURCE_PIN: /* External input clock used as SAI1 Block A clock source */
  573. case LL_RCC_SAI1_B_CLKSOURCE_PIN: /* External input clock used as SAI1 Block B clock source */
  574. default:
  575. sai_frequency = EXTERNAL_CLOCK_VALUE;
  576. break;
  577. }
  578. }
  579. #endif /* RCC_DCKCFGR_SAI1ASRC */
  580. return sai_frequency;
  581. }
  582. #endif /* SAI1 */
  583. #if defined(SDIO)
  584. /**
  585. * @brief Return SDIOx clock frequency
  586. * @param SDIOxSource This parameter can be one of the following values:
  587. * @arg @ref LL_RCC_SDIO_CLKSOURCE
  588. * @retval SDIO clock frequency (in Hz)
  589. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  590. */
  591. uint32_t LL_RCC_GetSDIOClockFreq(uint32_t SDIOxSource)
  592. {
  593. uint32_t SDIO_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  594. /* Check parameter */
  595. assert_param(IS_LL_RCC_SDIO_CLKSOURCE(SDIOxSource));
  596. if (SDIOxSource == LL_RCC_SDIO_CLKSOURCE)
  597. {
  598. #if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL)
  599. /* SDIOCLK clock frequency */
  600. switch (LL_RCC_GetSDIOClockSource(SDIOxSource))
  601. {
  602. case LL_RCC_SDIO_CLKSOURCE_PLL48CLK: /* PLL48M clock used as SDIO clock source */
  603. switch (LL_RCC_GetCK48MClockSource(LL_RCC_CK48M_CLKSOURCE))
  604. {
  605. case LL_RCC_CK48M_CLKSOURCE_PLL: /* PLL clock used as 48Mhz domain clock */
  606. if (LL_RCC_PLL_IsReady())
  607. {
  608. SDIO_frequency = RCC_PLL_GetFreqDomain_48M();
  609. }
  610. break;
  611. #if defined(RCC_PLLSAI_SUPPORT)
  612. case LL_RCC_CK48M_CLKSOURCE_PLLSAI: /* PLLSAI clock used as 48Mhz domain clock */
  613. default:
  614. if (LL_RCC_PLLSAI_IsReady())
  615. {
  616. SDIO_frequency = RCC_PLLSAI_GetFreqDomain_48M();
  617. }
  618. break;
  619. #endif /* RCC_PLLSAI_SUPPORT */
  620. #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
  621. case LL_RCC_CK48M_CLKSOURCE_PLLI2S: /* PLLI2S clock used as 48Mhz domain clock */
  622. default:
  623. if (LL_RCC_PLLI2S_IsReady())
  624. {
  625. SDIO_frequency = RCC_PLLI2S_GetFreqDomain_48M();
  626. }
  627. break;
  628. #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
  629. }
  630. break;
  631. case LL_RCC_SDIO_CLKSOURCE_SYSCLK: /* PLL clock used as SDIO clock source */
  632. default:
  633. SDIO_frequency = RCC_GetSystemClockFreq();
  634. break;
  635. }
  636. #else
  637. /* PLL clock used as 48Mhz domain clock */
  638. if (LL_RCC_PLL_IsReady())
  639. {
  640. SDIO_frequency = RCC_PLL_GetFreqDomain_48M();
  641. }
  642. #endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */
  643. }
  644. return SDIO_frequency;
  645. }
  646. #endif /* SDIO */
  647. #if defined(RNG)
  648. /**
  649. * @brief Return RNGx clock frequency
  650. * @param RNGxSource This parameter can be one of the following values:
  651. * @arg @ref LL_RCC_RNG_CLKSOURCE
  652. * @retval RNG clock frequency (in Hz)
  653. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  654. */
  655. uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource)
  656. {
  657. uint32_t rng_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  658. /* Check parameter */
  659. assert_param(IS_LL_RCC_RNG_CLKSOURCE(RNGxSource));
  660. #if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL)
  661. /* RNGCLK clock frequency */
  662. switch (LL_RCC_GetRNGClockSource(RNGxSource))
  663. {
  664. #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
  665. case LL_RCC_RNG_CLKSOURCE_PLLI2S: /* PLLI2S clock used as RNG clock source */
  666. if (LL_RCC_PLLI2S_IsReady())
  667. {
  668. rng_frequency = RCC_PLLI2S_GetFreqDomain_48M();
  669. }
  670. break;
  671. #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
  672. #if defined(RCC_PLLSAI_SUPPORT)
  673. case LL_RCC_RNG_CLKSOURCE_PLLSAI: /* PLLSAI clock used as RNG clock source */
  674. if (LL_RCC_PLLSAI_IsReady())
  675. {
  676. rng_frequency = RCC_PLLSAI_GetFreqDomain_48M();
  677. }
  678. break;
  679. #endif /* RCC_PLLSAI_SUPPORT */
  680. case LL_RCC_RNG_CLKSOURCE_PLL: /* PLL clock used as RNG clock source */
  681. default:
  682. if (LL_RCC_PLL_IsReady())
  683. {
  684. rng_frequency = RCC_PLL_GetFreqDomain_48M();
  685. }
  686. break;
  687. }
  688. #else
  689. /* PLL clock used as RNG clock source */
  690. if (LL_RCC_PLL_IsReady())
  691. {
  692. rng_frequency = RCC_PLL_GetFreqDomain_48M();
  693. }
  694. #endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */
  695. return rng_frequency;
  696. }
  697. #endif /* RNG */
  698. #if defined(CEC)
  699. /**
  700. * @brief Return CEC clock frequency
  701. * @param CECxSource This parameter can be one of the following values:
  702. * @arg @ref LL_RCC_CEC_CLKSOURCE
  703. * @retval CEC clock frequency (in Hz)
  704. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator (HSI or LSE) is not ready
  705. */
  706. uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource)
  707. {
  708. uint32_t cec_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  709. /* Check parameter */
  710. assert_param(IS_LL_RCC_CEC_CLKSOURCE(CECxSource));
  711. /* CECCLK clock frequency */
  712. switch (LL_RCC_GetCECClockSource(CECxSource))
  713. {
  714. case LL_RCC_CEC_CLKSOURCE_LSE: /* CEC Clock is LSE Osc. */
  715. if (LL_RCC_LSE_IsReady())
  716. {
  717. cec_frequency = LSE_VALUE;
  718. }
  719. break;
  720. case LL_RCC_CEC_CLKSOURCE_HSI_DIV488: /* CEC Clock is HSI Osc. */
  721. default:
  722. if (LL_RCC_HSI_IsReady())
  723. {
  724. cec_frequency = HSI_VALUE/488U;
  725. }
  726. break;
  727. }
  728. return cec_frequency;
  729. }
  730. #endif /* CEC */
  731. #if defined(USB_OTG_FS) || defined(USB_OTG_HS)
  732. /**
  733. * @brief Return USBx clock frequency
  734. * @param USBxSource This parameter can be one of the following values:
  735. * @arg @ref LL_RCC_USB_CLKSOURCE
  736. * @retval USB clock frequency (in Hz)
  737. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  738. */
  739. uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource)
  740. {
  741. uint32_t usb_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  742. /* Check parameter */
  743. assert_param(IS_LL_RCC_USB_CLKSOURCE(USBxSource));
  744. #if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL)
  745. /* USBCLK clock frequency */
  746. switch (LL_RCC_GetUSBClockSource(USBxSource))
  747. {
  748. #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
  749. case LL_RCC_USB_CLKSOURCE_PLLI2S: /* PLLI2S clock used as USB clock source */
  750. if (LL_RCC_PLLI2S_IsReady())
  751. {
  752. usb_frequency = RCC_PLLI2S_GetFreqDomain_48M();
  753. }
  754. break;
  755. #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
  756. #if defined(RCC_PLLSAI_SUPPORT)
  757. case LL_RCC_USB_CLKSOURCE_PLLSAI: /* PLLSAI clock used as USB clock source */
  758. if (LL_RCC_PLLSAI_IsReady())
  759. {
  760. usb_frequency = RCC_PLLSAI_GetFreqDomain_48M();
  761. }
  762. break;
  763. #endif /* RCC_PLLSAI_SUPPORT */
  764. case LL_RCC_USB_CLKSOURCE_PLL: /* PLL clock used as USB clock source */
  765. default:
  766. if (LL_RCC_PLL_IsReady())
  767. {
  768. usb_frequency = RCC_PLL_GetFreqDomain_48M();
  769. }
  770. break;
  771. }
  772. #else
  773. /* PLL clock used as USB clock source */
  774. if (LL_RCC_PLL_IsReady())
  775. {
  776. usb_frequency = RCC_PLL_GetFreqDomain_48M();
  777. }
  778. #endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */
  779. return usb_frequency;
  780. }
  781. #endif /* USB_OTG_FS || USB_OTG_HS */
  782. #if defined(DFSDM1_Channel0)
  783. /**
  784. * @brief Return DFSDMx clock frequency
  785. * @param DFSDMxSource This parameter can be one of the following values:
  786. * @arg @ref LL_RCC_DFSDM1_CLKSOURCE
  787. * @arg @ref LL_RCC_DFSDM2_CLKSOURCE (*)
  788. *
  789. * (*) value not defined in all devices.
  790. * @retval DFSDM clock frequency (in Hz)
  791. */
  792. uint32_t LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource)
  793. {
  794. uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  795. /* Check parameter */
  796. assert_param(IS_LL_RCC_DFSDM_CLKSOURCE(DFSDMxSource));
  797. if (DFSDMxSource == LL_RCC_DFSDM1_CLKSOURCE)
  798. {
  799. /* DFSDM1CLK clock frequency */
  800. switch (LL_RCC_GetDFSDMClockSource(DFSDMxSource))
  801. {
  802. case LL_RCC_DFSDM1_CLKSOURCE_SYSCLK: /* DFSDM1 Clock is SYSCLK */
  803. dfsdm_frequency = RCC_GetSystemClockFreq();
  804. break;
  805. case LL_RCC_DFSDM1_CLKSOURCE_PCLK2: /* DFSDM1 Clock is PCLK2 */
  806. default:
  807. dfsdm_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  808. break;
  809. }
  810. }
  811. #if defined(DFSDM2_Channel0)
  812. else
  813. {
  814. /* DFSDM2CLK clock frequency */
  815. switch (LL_RCC_GetDFSDMClockSource(DFSDMxSource))
  816. {
  817. case LL_RCC_DFSDM2_CLKSOURCE_SYSCLK: /* DFSDM2 Clock is SYSCLK */
  818. dfsdm_frequency = RCC_GetSystemClockFreq();
  819. break;
  820. case LL_RCC_DFSDM2_CLKSOURCE_PCLK2: /* DFSDM2 Clock is PCLK2 */
  821. default:
  822. dfsdm_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
  823. break;
  824. }
  825. }
  826. #endif /* DFSDM2_Channel0 */
  827. return dfsdm_frequency;
  828. }
  829. /**
  830. * @brief Return DFSDMx Audio clock frequency
  831. * @param DFSDMxSource This parameter can be one of the following values:
  832. * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE
  833. * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE (*)
  834. *
  835. * (*) value not defined in all devices.
  836. * @retval DFSDM clock frequency (in Hz)
  837. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  838. */
  839. uint32_t LL_RCC_GetDFSDMAudioClockFreq(uint32_t DFSDMxSource)
  840. {
  841. uint32_t dfsdm_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  842. /* Check parameter */
  843. assert_param(IS_LL_RCC_DFSDM_AUDIO_CLKSOURCE(DFSDMxSource));
  844. if (DFSDMxSource == LL_RCC_DFSDM1_AUDIO_CLKSOURCE)
  845. {
  846. /* DFSDM1CLK clock frequency */
  847. switch (LL_RCC_GetDFSDMAudioClockSource(DFSDMxSource))
  848. {
  849. case LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1: /* I2S1 clock used as DFSDM1 clock */
  850. dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S1_CLKSOURCE);
  851. break;
  852. case LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2: /* I2S2 clock used as DFSDM1 clock */
  853. default:
  854. dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S2_CLKSOURCE);
  855. break;
  856. }
  857. }
  858. #if defined(DFSDM2_Channel0)
  859. else
  860. {
  861. /* DFSDM2CLK clock frequency */
  862. switch (LL_RCC_GetDFSDMAudioClockSource(DFSDMxSource))
  863. {
  864. case LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1: /* I2S1 clock used as DFSDM2 clock */
  865. dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S1_CLKSOURCE);
  866. break;
  867. case LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2: /* I2S2 clock used as DFSDM2 clock */
  868. default:
  869. dfsdm_frequency = LL_RCC_GetI2SClockFreq(LL_RCC_I2S2_CLKSOURCE);
  870. break;
  871. }
  872. }
  873. #endif /* DFSDM2_Channel0 */
  874. return dfsdm_frequency;
  875. }
  876. #endif /* DFSDM1_Channel0 */
  877. #if defined(DSI)
  878. /**
  879. * @brief Return DSI clock frequency
  880. * @param DSIxSource This parameter can be one of the following values:
  881. * @arg @ref LL_RCC_DSI_CLKSOURCE
  882. * @retval DSI clock frequency (in Hz)
  883. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  884. * - @ref LL_RCC_PERIPH_FREQUENCY_NA indicates that external clock is used
  885. */
  886. uint32_t LL_RCC_GetDSIClockFreq(uint32_t DSIxSource)
  887. {
  888. uint32_t dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  889. /* Check parameter */
  890. assert_param(IS_LL_RCC_DSI_CLKSOURCE(DSIxSource));
  891. /* DSICLK clock frequency */
  892. switch (LL_RCC_GetDSIClockSource(DSIxSource))
  893. {
  894. case LL_RCC_DSI_CLKSOURCE_PLL: /* DSI Clock is PLL Osc. */
  895. if (LL_RCC_PLL_IsReady())
  896. {
  897. dsi_frequency = RCC_PLL_GetFreqDomain_DSI();
  898. }
  899. break;
  900. case LL_RCC_DSI_CLKSOURCE_PHY: /* DSI Clock is DSI physical clock. */
  901. default:
  902. dsi_frequency = LL_RCC_PERIPH_FREQUENCY_NA;
  903. break;
  904. }
  905. return dsi_frequency;
  906. }
  907. #endif /* DSI */
  908. #if defined(LTDC)
  909. /**
  910. * @brief Return LTDC clock frequency
  911. * @param LTDCxSource This parameter can be one of the following values:
  912. * @arg @ref LL_RCC_LTDC_CLKSOURCE
  913. * @retval LTDC clock frequency (in Hz)
  914. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator PLLSAI is not ready
  915. */
  916. uint32_t LL_RCC_GetLTDCClockFreq(uint32_t LTDCxSource)
  917. {
  918. uint32_t ltdc_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  919. /* Check parameter */
  920. assert_param(IS_LL_RCC_LTDC_CLKSOURCE(LTDCxSource));
  921. if (LL_RCC_PLLSAI_IsReady())
  922. {
  923. ltdc_frequency = RCC_PLLSAI_GetFreqDomain_LTDC();
  924. }
  925. return ltdc_frequency;
  926. }
  927. #endif /* LTDC */
  928. #if defined(SPDIFRX)
  929. /**
  930. * @brief Return SPDIFRX clock frequency
  931. * @param SPDIFRXxSource This parameter can be one of the following values:
  932. * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE
  933. * @retval SPDIFRX clock frequency (in Hz)
  934. * - @ref LL_RCC_PERIPH_FREQUENCY_NO indicates that oscillator is not ready
  935. */
  936. uint32_t LL_RCC_GetSPDIFRXClockFreq(uint32_t SPDIFRXxSource)
  937. {
  938. uint32_t spdifrx_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
  939. /* Check parameter */
  940. assert_param(IS_LL_RCC_SPDIFRX_CLKSOURCE(SPDIFRXxSource));
  941. /* SPDIFRX1CLK clock frequency */
  942. switch (LL_RCC_GetSPDIFRXClockSource(SPDIFRXxSource))
  943. {
  944. case LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S: /* SPDIFRX Clock is PLLI2S Osc. */
  945. if (LL_RCC_PLLI2S_IsReady())
  946. {
  947. spdifrx_frequency = RCC_PLLI2S_GetFreqDomain_SPDIFRX();
  948. }
  949. break;
  950. case LL_RCC_SPDIFRX1_CLKSOURCE_PLL: /* SPDIFRX Clock is PLL Osc. */
  951. default:
  952. if (LL_RCC_PLL_IsReady())
  953. {
  954. spdifrx_frequency = RCC_PLL_GetFreqDomain_SPDIFRX();
  955. }
  956. break;
  957. }
  958. return spdifrx_frequency;
  959. }
  960. #endif /* SPDIFRX */
  961. /**
  962. * @}
  963. */
  964. /**
  965. * @}
  966. */
  967. /** @addtogroup RCC_LL_Private_Functions
  968. * @{
  969. */
  970. /**
  971. * @brief Return SYSTEM clock frequency
  972. * @retval SYSTEM clock frequency (in Hz)
  973. */
  974. uint32_t RCC_GetSystemClockFreq(void)
  975. {
  976. uint32_t frequency = 0U;
  977. /* Get SYSCLK source -------------------------------------------------------*/
  978. switch (LL_RCC_GetSysClkSource())
  979. {
  980. case LL_RCC_SYS_CLKSOURCE_STATUS_HSI: /* HSI used as system clock source */
  981. frequency = HSI_VALUE;
  982. break;
  983. case LL_RCC_SYS_CLKSOURCE_STATUS_HSE: /* HSE used as system clock source */
  984. frequency = HSE_VALUE;
  985. break;
  986. case LL_RCC_SYS_CLKSOURCE_STATUS_PLL: /* PLL used as system clock source */
  987. frequency = RCC_PLL_GetFreqDomain_SYS(LL_RCC_SYS_CLKSOURCE_STATUS_PLL);
  988. break;
  989. #if defined(RCC_PLLR_SYSCLK_SUPPORT)
  990. case LL_RCC_SYS_CLKSOURCE_STATUS_PLLR: /* PLLR used as system clock source */
  991. frequency = RCC_PLL_GetFreqDomain_SYS(LL_RCC_SYS_CLKSOURCE_STATUS_PLLR);
  992. break;
  993. #endif /* RCC_PLLR_SYSCLK_SUPPORT */
  994. default:
  995. frequency = HSI_VALUE;
  996. break;
  997. }
  998. return frequency;
  999. }
  1000. /**
  1001. * @brief Return HCLK clock frequency
  1002. * @param SYSCLK_Frequency SYSCLK clock frequency
  1003. * @retval HCLK clock frequency (in Hz)
  1004. */
  1005. uint32_t RCC_GetHCLKClockFreq(uint32_t SYSCLK_Frequency)
  1006. {
  1007. /* HCLK clock frequency */
  1008. return __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, LL_RCC_GetAHBPrescaler());
  1009. }
  1010. /**
  1011. * @brief Return PCLK1 clock frequency
  1012. * @param HCLK_Frequency HCLK clock frequency
  1013. * @retval PCLK1 clock frequency (in Hz)
  1014. */
  1015. uint32_t RCC_GetPCLK1ClockFreq(uint32_t HCLK_Frequency)
  1016. {
  1017. /* PCLK1 clock frequency */
  1018. return __LL_RCC_CALC_PCLK1_FREQ(HCLK_Frequency, LL_RCC_GetAPB1Prescaler());
  1019. }
  1020. /**
  1021. * @brief Return PCLK2 clock frequency
  1022. * @param HCLK_Frequency HCLK clock frequency
  1023. * @retval PCLK2 clock frequency (in Hz)
  1024. */
  1025. uint32_t RCC_GetPCLK2ClockFreq(uint32_t HCLK_Frequency)
  1026. {
  1027. /* PCLK2 clock frequency */
  1028. return __LL_RCC_CALC_PCLK2_FREQ(HCLK_Frequency, LL_RCC_GetAPB2Prescaler());
  1029. }
  1030. /**
  1031. * @brief Return PLL clock frequency used for system domain
  1032. * @param SYSCLK_Source System clock source
  1033. * @retval PLL clock frequency (in Hz)
  1034. */
  1035. uint32_t RCC_PLL_GetFreqDomain_SYS(uint32_t SYSCLK_Source)
  1036. {
  1037. uint32_t pllinputfreq = 0U, pllsource = 0U, plloutputfreq = 0U;
  1038. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  1039. SYSCLK = PLL_VCO / (PLLP or PLLR)
  1040. */
  1041. pllsource = LL_RCC_PLL_GetMainSource();
  1042. switch (pllsource)
  1043. {
  1044. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1045. pllinputfreq = HSI_VALUE;
  1046. break;
  1047. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1048. pllinputfreq = HSE_VALUE;
  1049. break;
  1050. default:
  1051. pllinputfreq = HSI_VALUE;
  1052. break;
  1053. }
  1054. if (SYSCLK_Source == LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
  1055. {
  1056. plloutputfreq = __LL_RCC_CALC_PLLCLK_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1057. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetP());
  1058. }
  1059. #if defined(RCC_PLLR_SYSCLK_SUPPORT)
  1060. else
  1061. {
  1062. plloutputfreq = __LL_RCC_CALC_PLLRCLK_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1063. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
  1064. }
  1065. #endif /* RCC_PLLR_SYSCLK_SUPPORT */
  1066. return plloutputfreq;
  1067. }
  1068. /**
  1069. * @brief Return PLL clock frequency used for 48 MHz domain
  1070. * @retval PLL clock frequency (in Hz)
  1071. */
  1072. uint32_t RCC_PLL_GetFreqDomain_48M(void)
  1073. {
  1074. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1075. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM ) * PLLN
  1076. 48M Domain clock = PLL_VCO / PLLQ
  1077. */
  1078. pllsource = LL_RCC_PLL_GetMainSource();
  1079. switch (pllsource)
  1080. {
  1081. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1082. pllinputfreq = HSI_VALUE;
  1083. break;
  1084. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1085. pllinputfreq = HSE_VALUE;
  1086. break;
  1087. default:
  1088. pllinputfreq = HSI_VALUE;
  1089. break;
  1090. }
  1091. return __LL_RCC_CALC_PLLCLK_48M_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1092. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetQ());
  1093. }
  1094. #if defined(DSI)
  1095. /**
  1096. * @brief Return PLL clock frequency used for DSI clock
  1097. * @retval PLL clock frequency (in Hz)
  1098. */
  1099. uint32_t RCC_PLL_GetFreqDomain_DSI(void)
  1100. {
  1101. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1102. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  1103. DSICLK = PLL_VCO / PLLR
  1104. */
  1105. pllsource = LL_RCC_PLL_GetMainSource();
  1106. switch (pllsource)
  1107. {
  1108. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1109. pllinputfreq = HSE_VALUE;
  1110. break;
  1111. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1112. default:
  1113. pllinputfreq = HSI_VALUE;
  1114. break;
  1115. }
  1116. return __LL_RCC_CALC_PLLCLK_DSI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1117. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
  1118. }
  1119. #endif /* DSI */
  1120. #if defined(RCC_DCKCFGR_I2SSRC) || defined(RCC_DCKCFGR_I2S1SRC)
  1121. /**
  1122. * @brief Return PLL clock frequency used for I2S clock
  1123. * @retval PLL clock frequency (in Hz)
  1124. */
  1125. uint32_t RCC_PLL_GetFreqDomain_I2S(void)
  1126. {
  1127. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1128. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  1129. I2SCLK = PLL_VCO / PLLR
  1130. */
  1131. pllsource = LL_RCC_PLL_GetMainSource();
  1132. switch (pllsource)
  1133. {
  1134. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1135. pllinputfreq = HSE_VALUE;
  1136. break;
  1137. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1138. default:
  1139. pllinputfreq = HSI_VALUE;
  1140. break;
  1141. }
  1142. return __LL_RCC_CALC_PLLCLK_I2S_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1143. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
  1144. }
  1145. #endif /* RCC_DCKCFGR_I2SSRC || RCC_DCKCFGR_I2S1SRC */
  1146. #if defined(SPDIFRX)
  1147. /**
  1148. * @brief Return PLL clock frequency used for SPDIFRX clock
  1149. * @retval PLL clock frequency (in Hz)
  1150. */
  1151. uint32_t RCC_PLL_GetFreqDomain_SPDIFRX(void)
  1152. {
  1153. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1154. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  1155. SPDIFRXCLK = PLL_VCO / PLLR
  1156. */
  1157. pllsource = LL_RCC_PLL_GetMainSource();
  1158. switch (pllsource)
  1159. {
  1160. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1161. pllinputfreq = HSE_VALUE;
  1162. break;
  1163. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1164. default:
  1165. pllinputfreq = HSI_VALUE;
  1166. break;
  1167. }
  1168. return __LL_RCC_CALC_PLLCLK_SPDIFRX_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1169. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
  1170. }
  1171. #endif /* SPDIFRX */
  1172. #if defined(RCC_PLLCFGR_PLLR)
  1173. #if defined(SAI1)
  1174. /**
  1175. * @brief Return PLL clock frequency used for SAI clock
  1176. * @retval PLL clock frequency (in Hz)
  1177. */
  1178. uint32_t RCC_PLL_GetFreqDomain_SAI(void)
  1179. {
  1180. uint32_t pllinputfreq = 0U, pllsource = 0U, plloutputfreq = 0U;
  1181. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
  1182. SAICLK = (PLL_VCO / PLLR) / PLLDIVR
  1183. or
  1184. SAICLK = PLL_VCO / PLLR
  1185. */
  1186. pllsource = LL_RCC_PLL_GetMainSource();
  1187. switch (pllsource)
  1188. {
  1189. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
  1190. pllinputfreq = HSE_VALUE;
  1191. break;
  1192. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
  1193. default:
  1194. pllinputfreq = HSI_VALUE;
  1195. break;
  1196. }
  1197. #if defined(RCC_DCKCFGR_PLLDIVR)
  1198. plloutputfreq = __LL_RCC_CALC_PLLCLK_SAI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1199. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR(), LL_RCC_PLL_GetDIVR());
  1200. #else
  1201. plloutputfreq = __LL_RCC_CALC_PLLCLK_SAI_FREQ(pllinputfreq, LL_RCC_PLL_GetDivider(),
  1202. LL_RCC_PLL_GetN(), LL_RCC_PLL_GetR());
  1203. #endif /* RCC_DCKCFGR_PLLDIVR */
  1204. return plloutputfreq;
  1205. }
  1206. #endif /* SAI1 */
  1207. #endif /* RCC_PLLCFGR_PLLR */
  1208. #if defined(RCC_PLLSAI_SUPPORT)
  1209. /**
  1210. * @brief Return PLLSAI clock frequency used for SAI domain
  1211. * @retval PLLSAI clock frequency (in Hz)
  1212. */
  1213. uint32_t RCC_PLLSAI_GetFreqDomain_SAI(void)
  1214. {
  1215. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1216. /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLSAIM) * PLLSAIN
  1217. SAI domain clock = (PLLSAI_VCO / PLLSAIQ) / PLLSAIDIVQ
  1218. */
  1219. pllsource = LL_RCC_PLL_GetMainSource();
  1220. switch (pllsource)
  1221. {
  1222. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLSAI clock source */
  1223. pllinputfreq = HSI_VALUE;
  1224. break;
  1225. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLSAI clock source */
  1226. pllinputfreq = HSE_VALUE;
  1227. break;
  1228. default:
  1229. pllinputfreq = HSI_VALUE;
  1230. break;
  1231. }
  1232. return __LL_RCC_CALC_PLLSAI_SAI_FREQ(pllinputfreq, LL_RCC_PLLSAI_GetDivider(),
  1233. LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetQ(), LL_RCC_PLLSAI_GetDIVQ());
  1234. }
  1235. #if defined(RCC_PLLSAICFGR_PLLSAIP)
  1236. /**
  1237. * @brief Return PLLSAI clock frequency used for 48Mhz domain
  1238. * @retval PLLSAI clock frequency (in Hz)
  1239. */
  1240. uint32_t RCC_PLLSAI_GetFreqDomain_48M(void)
  1241. {
  1242. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1243. /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLSAIM) * PLLSAIN
  1244. 48M Domain clock = PLLSAI_VCO / PLLSAIP
  1245. */
  1246. pllsource = LL_RCC_PLL_GetMainSource();
  1247. switch (pllsource)
  1248. {
  1249. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLSAI clock source */
  1250. pllinputfreq = HSI_VALUE;
  1251. break;
  1252. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLSAI clock source */
  1253. pllinputfreq = HSE_VALUE;
  1254. break;
  1255. default:
  1256. pllinputfreq = HSI_VALUE;
  1257. break;
  1258. }
  1259. return __LL_RCC_CALC_PLLSAI_48M_FREQ(pllinputfreq, LL_RCC_PLLSAI_GetDivider(),
  1260. LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetP());
  1261. }
  1262. #endif /* RCC_PLLSAICFGR_PLLSAIP */
  1263. #if defined(LTDC)
  1264. /**
  1265. * @brief Return PLLSAI clock frequency used for LTDC domain
  1266. * @retval PLLSAI clock frequency (in Hz)
  1267. */
  1268. uint32_t RCC_PLLSAI_GetFreqDomain_LTDC(void)
  1269. {
  1270. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1271. /* PLLSAI_VCO = (HSE_VALUE or HSI_VALUE / PLLSAIM) * PLLSAIN
  1272. LTDC Domain clock = (PLLSAI_VCO / PLLSAIR) / PLLSAIDIVR
  1273. */
  1274. pllsource = LL_RCC_PLL_GetMainSource();
  1275. switch (pllsource)
  1276. {
  1277. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLSAI clock source */
  1278. pllinputfreq = HSI_VALUE;
  1279. break;
  1280. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLSAI clock source */
  1281. pllinputfreq = HSE_VALUE;
  1282. break;
  1283. default:
  1284. pllinputfreq = HSI_VALUE;
  1285. break;
  1286. }
  1287. return __LL_RCC_CALC_PLLSAI_LTDC_FREQ(pllinputfreq, LL_RCC_PLLSAI_GetDivider(),
  1288. LL_RCC_PLLSAI_GetN(), LL_RCC_PLLSAI_GetR(), LL_RCC_PLLSAI_GetDIVR());
  1289. }
  1290. #endif /* LTDC */
  1291. #endif /* RCC_PLLSAI_SUPPORT */
  1292. #if defined(RCC_PLLI2S_SUPPORT)
  1293. #if defined(SAI1)
  1294. /**
  1295. * @brief Return PLLI2S clock frequency used for SAI domains
  1296. * @retval PLLI2S clock frequency (in Hz)
  1297. */
  1298. uint32_t RCC_PLLI2S_GetFreqDomain_SAI(void)
  1299. {
  1300. uint32_t plli2sinputfreq = 0U, plli2ssource = 0U, plli2soutputfreq = 0U;
  1301. /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN
  1302. SAI domain clock = (PLLI2S_VCO / PLLI2SQ) / PLLI2SDIVQ
  1303. or
  1304. SAI domain clock = (PLLI2S_VCO / PLLI2SR) / PLLI2SDIVR
  1305. */
  1306. plli2ssource = LL_RCC_PLLI2S_GetMainSource();
  1307. switch (plli2ssource)
  1308. {
  1309. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLI2S clock source */
  1310. plli2sinputfreq = HSE_VALUE;
  1311. break;
  1312. #if defined(RCC_PLLI2SCFGR_PLLI2SSRC)
  1313. case LL_RCC_PLLI2SSOURCE_PIN: /* External pin input clock used as PLLI2S clock source */
  1314. plli2sinputfreq = EXTERNAL_CLOCK_VALUE;
  1315. break;
  1316. #endif /* RCC_PLLI2SCFGR_PLLI2SSRC */
  1317. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLI2S clock source */
  1318. default:
  1319. plli2sinputfreq = HSI_VALUE;
  1320. break;
  1321. }
  1322. #if defined(RCC_DCKCFGR_PLLI2SDIVQ)
  1323. plli2soutputfreq = __LL_RCC_CALC_PLLI2S_SAI_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(),
  1324. LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetQ(), LL_RCC_PLLI2S_GetDIVQ());
  1325. #else
  1326. plli2soutputfreq = __LL_RCC_CALC_PLLI2S_SAI_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(),
  1327. LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetR(), LL_RCC_PLLI2S_GetDIVR());
  1328. #endif /* RCC_DCKCFGR_PLLI2SDIVQ */
  1329. return plli2soutputfreq;
  1330. }
  1331. #endif /* SAI1 */
  1332. #if defined(SPDIFRX)
  1333. /**
  1334. * @brief Return PLLI2S clock frequency used for SPDIFRX domain
  1335. * @retval PLLI2S clock frequency (in Hz)
  1336. */
  1337. uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void)
  1338. {
  1339. uint32_t pllinputfreq = 0U, pllsource = 0U;
  1340. /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN
  1341. SPDIFRX Domain clock = PLLI2S_VCO / PLLI2SP
  1342. */
  1343. pllsource = LL_RCC_PLLI2S_GetMainSource();
  1344. switch (pllsource)
  1345. {
  1346. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLI2S clock source */
  1347. pllinputfreq = HSE_VALUE;
  1348. break;
  1349. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLI2S clock source */
  1350. default:
  1351. pllinputfreq = HSI_VALUE;
  1352. break;
  1353. }
  1354. return __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ(pllinputfreq, LL_RCC_PLLI2S_GetDivider(),
  1355. LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetP());
  1356. }
  1357. #endif /* SPDIFRX */
  1358. /**
  1359. * @brief Return PLLI2S clock frequency used for I2S domain
  1360. * @retval PLLI2S clock frequency (in Hz)
  1361. */
  1362. uint32_t RCC_PLLI2S_GetFreqDomain_I2S(void)
  1363. {
  1364. uint32_t plli2sinputfreq = 0U, plli2ssource = 0U, plli2soutputfreq = 0U;
  1365. /* PLLI2S_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN
  1366. I2S Domain clock = PLLI2S_VCO / PLLI2SR
  1367. */
  1368. plli2ssource = LL_RCC_PLLI2S_GetMainSource();
  1369. switch (plli2ssource)
  1370. {
  1371. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLI2S clock source */
  1372. plli2sinputfreq = HSE_VALUE;
  1373. break;
  1374. #if defined(RCC_PLLI2SCFGR_PLLI2SSRC)
  1375. case LL_RCC_PLLI2SSOURCE_PIN: /* External pin input clock used as PLLI2S clock source */
  1376. plli2sinputfreq = EXTERNAL_CLOCK_VALUE;
  1377. break;
  1378. #endif /* RCC_PLLI2SCFGR_PLLI2SSRC */
  1379. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLI2S clock source */
  1380. default:
  1381. plli2sinputfreq = HSI_VALUE;
  1382. break;
  1383. }
  1384. plli2soutputfreq = __LL_RCC_CALC_PLLI2S_I2S_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(),
  1385. LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetR());
  1386. return plli2soutputfreq;
  1387. }
  1388. #if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ)
  1389. /**
  1390. * @brief Return PLLI2S clock frequency used for 48Mhz domain
  1391. * @retval PLLI2S clock frequency (in Hz)
  1392. */
  1393. uint32_t RCC_PLLI2S_GetFreqDomain_48M(void)
  1394. {
  1395. uint32_t plli2sinputfreq = 0U, plli2ssource = 0U, plli2soutputfreq = 0U;
  1396. /* PLL48M_VCO = (HSE_VALUE or HSI_VALUE / PLLI2SM) * PLLI2SN
  1397. 48M Domain clock = PLLI2S_VCO / PLLI2SQ
  1398. */
  1399. plli2ssource = LL_RCC_PLLI2S_GetMainSource();
  1400. switch (plli2ssource)
  1401. {
  1402. case LL_RCC_PLLSOURCE_HSE: /* HSE used as PLLI2S clock source */
  1403. plli2sinputfreq = HSE_VALUE;
  1404. break;
  1405. #if defined(RCC_PLLI2SCFGR_PLLI2SSRC)
  1406. case LL_RCC_PLLI2SSOURCE_PIN: /* External pin input clock used as PLLI2S clock source */
  1407. plli2sinputfreq = EXTERNAL_CLOCK_VALUE;
  1408. break;
  1409. #endif /* RCC_PLLI2SCFGR_PLLI2SSRC */
  1410. case LL_RCC_PLLSOURCE_HSI: /* HSI used as PLLI2S clock source */
  1411. default:
  1412. plli2sinputfreq = HSI_VALUE;
  1413. break;
  1414. }
  1415. plli2soutputfreq = __LL_RCC_CALC_PLLI2S_48M_FREQ(plli2sinputfreq, LL_RCC_PLLI2S_GetDivider(),
  1416. LL_RCC_PLLI2S_GetN(), LL_RCC_PLLI2S_GetQ());
  1417. return plli2soutputfreq;
  1418. }
  1419. #endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */
  1420. #endif /* RCC_PLLI2S_SUPPORT */
  1421. /**
  1422. * @}
  1423. */
  1424. /**
  1425. * @}
  1426. */
  1427. #endif /* defined(RCC) */
  1428. /**
  1429. * @}
  1430. */
  1431. #endif /* USE_FULL_LL_DRIVER */
  1432. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/