lib_clk.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675
  1. /**
  2. ******************************************************************************
  3. * @file lib_clk.c
  4. * @author Application Team
  5. * @version V1.1.0
  6. * @date 2019-10-28
  7. * @brief Clock library.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. ******************************************************************************
  12. */
  13. #include "lib_clk.h"
  14. /**
  15. * @brief Initializes the CPU, AHB and APB buses clocks according to the specified
  16. * parameters in the CLK_ClkInitStruct.
  17. *
  18. * @note This function performs the following:
  19. * 1. If want to switch AHB clock source, enable BGP, enable 6.5M RC,
  20. * AHB clock source switch to RCH first.
  21. * 2. configure clock (except AHB clock source configuration). - optional
  22. * 3. configure AHB clock source. - optional
  23. * 4. HCLK/PCLK divider configuration. - optional
  24. *
  25. * @note CLK_InitTypeDef *CLK_ClkInitStruct
  26. * [in]CLK_ClkInitStruct->ClockType, can use the '|' operator, the selection of parameters is as follows
  27. * CLK_TYPE_ALL
  28. * CLK_TYPE_AHBSRC
  29. * CLK_TYPE_PLLL
  30. * CLK_TYPE_PLLH
  31. * CLK_TYPE_XTALH
  32. * CLK_TYPE_RTCCLK
  33. * CLK_TYPE_HCLK
  34. * CLK_TYPE_PCLK
  35. *
  36. * CLK_TYPE_ALL All clocks' configurations is valid
  37. * CLK_TYPE_AHBSRC CLK_ClkInitStruct->AHBSource(AHB Clock source configuration) is valid
  38. * [in]CLK_ClkInitStruct->AHBSource:
  39. * CLK_AHBSEL_6_5MRC
  40. * CLK_AHBSEL_6_5MXTAL
  41. * CLK_AHBSEL_HSPLL
  42. * CLK_AHBSEL_RTCCLK
  43. * CLK_AHBSEL_LSPLL
  44. * CLK_TYPE_PLLL CLK_ClkInitStruct->PLLL(PLLL configuration) is valid
  45. * [in]CLK_ClkInitStruct->PLLL.State:
  46. * CLK_PLLL_ON (PLLL.Source/Frequency configuration is valid)
  47. * CLK_PLLL_OFF (PLLL.Source/Frequency configuration is not valid)
  48. * [in]CLK_ClkInitStruct->PLLL.Source:
  49. * CLK_PLLLSRC_RCL
  50. * CLK_PLLLSRC_XTALL
  51. * [in]CLK_ClkInitStruct->PLLL.Frequency:
  52. * CLK_PLLL_26_2144MHz
  53. * CLK_PLLL_13_1072MHz
  54. * CLK_PLLL_6_5536MHz
  55. * CLK_PLLL_3_2768MHz
  56. * CLK_PLLL_1_6384MHz
  57. * CLK_PLLL_0_8192MHz
  58. * CLK_PLLL_0_4096MHz
  59. * CLK_PLLL_0_2048MHz
  60. * CLK_TYPE_PLLH CLK_ClkInitStruct->PLLH(PLLH configuration) is valid
  61. * [in]CLK_ClkInitStruct->PLLH.State:
  62. * CLK_PLLH_ON (PLLH.Source/Frequency configuration is valid)
  63. * CLK_PLLH_OFF (PLLH.Source/Frequency configuration is not valid)
  64. * [in]CLK_ClkInitStruct->PLLH.Source:
  65. * CLK_PLLHSRC_RCH
  66. * CLK_PLLHSRC_XTALH
  67. * [in]CLK_ClkInitStruct->PLLH.Frequency:
  68. * CLK_PLLH_13_1072MHz
  69. * CLK_PLLH_16_384MHz
  70. * CLK_PLLH_19_6608MHz
  71. * CLK_PLLH_22_9376MHz
  72. * CLK_PLLH_26_2144MHz
  73. * CLK_PLLH_29_4912MHz
  74. * CLK_PLLH_32_768MHz
  75. * CLK_PLLH_36_0448MHz
  76. * CLK_PLLH_39_3216MHz
  77. * CLK_PLLH_42_5984MHz
  78. * CLK_PLLH_45_8752MHz
  79. * CLK_PLLH_49_152MHz
  80. * CLK_TYPE_XTALH CLK_ClkInitStruct->XTALH(XTALH configuration) is valid
  81. * [in]CLK_ClkInitStruct->XTALH.State:
  82. * CLK_XTALH_ON
  83. * CLK_XTALH_OFF
  84. * CLK_TYPE_RTCCLK CLK_ClkInitStruct->RTCCLK(RTCCLK configuration) is valid
  85. * [in]CLK_ClkInitStruct->RTCCLK.Source:
  86. * CLK_RTCCLKSRC_XTALL
  87. * CLK_RTCCLKSRC_RCL
  88. * [in]CLK_ClkInitStruct->RTCCLK.Divider:
  89. * CLK_RTCCLKDIV_1
  90. * CLK_RTCCLKDIV_4
  91. * CLK_TYPE_HCLK CLK_ClkInitStruct->HCLK(AHB Clock(divider) configuration) is valid
  92. * [in]CLK_ClkInitStruct->HCLK.Divider:
  93. * 1 ~ 256
  94. * CLK_TYPE_PCLK CLK_ClkInitStruct->PCLK(APB Clock(divider) configuration) is valid
  95. * [in]CLK_ClkInitStruct->PCLK.Divider:
  96. * 1 ~ 256
  97. *
  98. * @param CLK_ClkInitStruct pointer to an CLK_InitTypeDef structure that
  99. * contains the configuration information for the clocks.
  100. *
  101. * @retval None
  102. */
  103. void CLK_ClockConfig(CLK_InitTypeDef *CLK_ClkInitStruct)
  104. {
  105. uint32_t tmp;
  106. assert_parameters(IS_CLK_TYPE(CLK_ClkInitStruct->ClockType));
  107. if (CLK_ClkInitStruct->ClockType & CLK_TYPE_AHBSRC)
  108. {
  109. /* Enable BGP */
  110. ANA->REG3 &= ~ANA_REG3_BGPPD;
  111. /* Enable 6.5M RC */
  112. ANA->REG3 &= ~ANA_REG3_RCHPD;
  113. /* AHB clock source switch to RCH */
  114. MISC2->CLKSEL = 0;
  115. }
  116. ANA->REGA &= ~BIT6;
  117. /*---------- XTALH configuration ----------*/
  118. if ((CLK_ClkInitStruct->ClockType) & CLK_TYPE_XTALH)
  119. {
  120. assert_parameters(IS_CLK_XTALHSTA(CLK_ClkInitStruct->XTALH.State));
  121. /* XTALH state configure */
  122. ANA->REG3 &= ~ANA_REG3_XOHPDN;
  123. ANA->REG3 |= CLK_ClkInitStruct->XTALH.State;
  124. }
  125. /*-------------------- PLLL configuration --------------------*/
  126. if ((CLK_ClkInitStruct->ClockType) & CLK_TYPE_PLLL)
  127. {
  128. assert_parameters(IS_CLK_PLLLSRC(CLK_ClkInitStruct->PLLL.Source));
  129. assert_parameters(IS_CLK_PLLLSTA(CLK_ClkInitStruct->PLLL.State));
  130. assert_parameters(IS_CLK_PLLLFRQ(CLK_ClkInitStruct->PLLL.Frequency));
  131. /* PLLL state configure */
  132. if (CLK_ClkInitStruct->PLLL.State == CLK_PLLL_ON)
  133. {
  134. /* power up PLLL */
  135. ANA->REG3 |= ANA_REG3_PLLLPDN;
  136. /* Configure PLLL frequency */
  137. tmp = ANA->REG9;
  138. tmp &= ~ANA_REG9_PLLLSEL;
  139. tmp |= CLK_ClkInitStruct->PLLL.Frequency;
  140. ANA->REG9 = tmp;
  141. /* Configure PLLL input clock selection */
  142. tmp = PMU->CONTROL;
  143. tmp &= ~PMU_CONTROL_PLLL_SEL;
  144. tmp |= CLK_ClkInitStruct->PLLL.Source;
  145. PMU->CONTROL = tmp;
  146. }
  147. else
  148. {
  149. /* power down PLLL */
  150. ANA->REG3 &= ~ANA_REG3_PLLLPDN;
  151. }
  152. }
  153. /*-------------------- PLLH configuration --------------------*/
  154. if ((CLK_ClkInitStruct->ClockType) & CLK_TYPE_PLLH)
  155. {
  156. assert_parameters(IS_CLK_PLLHSRC(CLK_ClkInitStruct->PLLH.Source));
  157. assert_parameters(IS_CLK_PLLHSTA(CLK_ClkInitStruct->PLLH.State));
  158. assert_parameters(IS_CLK_PLLHFRQ(CLK_ClkInitStruct->PLLH.Frequency));
  159. /* PLLH state configure */
  160. if (CLK_ClkInitStruct->PLLH.State == CLK_PLLH_ON)
  161. {
  162. /* Power up PLLH */
  163. ANA->REG3 |= ANA_REG3_PLLHPDN;
  164. /* Configure PLLH frequency */
  165. tmp = ANA->REG9;
  166. tmp &= ~ANA_REG9_PLLHSEL;
  167. tmp |= CLK_ClkInitStruct->PLLH.Frequency;
  168. ANA->REG9 = tmp;
  169. /* Clock input source, XTALH, XOH power on*/
  170. if (CLK_ClkInitStruct->PLLH.Source == CLK_PLLHSRC_XTALH)
  171. {
  172. ANA->REG3 |= ANA_REG3_XOHPDN;
  173. }
  174. /* Configure PLLH input clock selection */
  175. tmp = PMU->CONTROL;
  176. tmp &= ~PMU_CONTROL_PLLH_SEL;
  177. tmp |= CLK_ClkInitStruct->PLLH.Source;
  178. PMU->CONTROL = tmp;
  179. }
  180. else
  181. {
  182. /* Power down PLLH */
  183. ANA->REG3 &= ~ANA_REG3_PLLHPDN;
  184. }
  185. }
  186. /*---------- RTCCLK configuration ----------*/
  187. if ((CLK_ClkInitStruct->ClockType) & CLK_TYPE_RTCCLK)
  188. {
  189. assert_parameters(IS_CLK_RTCSRC(CLK_ClkInitStruct->RTCCLK.Source));
  190. assert_parameters(IS_CLK_RTCDIV(CLK_ClkInitStruct->RTCCLK.Divider));
  191. /* RTCCLK source(optional) */
  192. tmp = PMU->CONTROL;
  193. tmp &= ~PMU_CONTROL_RTCCLK_SEL;
  194. tmp |= CLK_ClkInitStruct->RTCCLK.Source;
  195. PMU->CONTROL = tmp;
  196. /*----- RTCCLK Divider -----*/
  197. RTC_PrescalerConfig(CLK_ClkInitStruct->RTCCLK.Divider);
  198. }
  199. /*---------- AHB clock source configuration ----------*/
  200. if ((CLK_ClkInitStruct->ClockType) & CLK_TYPE_AHBSRC)
  201. {
  202. assert_parameters(IS_CLK_AHBSRC(CLK_ClkInitStruct->AHBSource));
  203. /* clock source: 6.5M RC */
  204. if (CLK_ClkInitStruct->AHBSource == CLK_AHBSEL_6_5MRC)
  205. {
  206. /* clock source configuration */
  207. MISC2->CLKSEL = CLK_ClkInitStruct->AHBSource;
  208. }
  209. /* clock source: 6_5MXTAL */
  210. else if (CLK_ClkInitStruct->AHBSource == CLK_AHBSEL_6_5MXTAL)
  211. {
  212. /* Power up 6.5M xtal */
  213. ANA->REG3 |= ANA_REG3_XOHPDN;
  214. /* clock source configuration */
  215. MISC2->CLKSEL = CLK_ClkInitStruct->AHBSource;
  216. }
  217. /* clock source: PLLH */
  218. else if (CLK_ClkInitStruct->AHBSource == CLK_AHBSEL_HSPLL)
  219. {
  220. /* Power up PLLH */
  221. ANA->REG3 |= ANA_REG3_PLLHPDN;
  222. /* while loop until PLLL is lock */
  223. while (!(ANA->CMPOUT & ANA_CMPOUT_LOCKH))
  224. {
  225. }
  226. /* clock source configuration */
  227. MISC2->CLKSEL = CLK_ClkInitStruct->AHBSource;
  228. }
  229. /* clock source: PLLL */
  230. else if (CLK_ClkInitStruct->AHBSource == CLK_AHBSEL_LSPLL)
  231. {
  232. /* Power up PLLL */
  233. ANA->REG3 |= ANA_REG3_PLLLPDN;
  234. /* while loop until PLLL is lock */
  235. while (!(ANA->CMPOUT & ANA_CMPOUT_LOCKL))
  236. {
  237. }
  238. /* clock source configuration */
  239. MISC2->CLKSEL = CLK_ClkInitStruct->AHBSource;
  240. }
  241. /* clock source: RTCCLK */
  242. else
  243. {
  244. /* clock source configuration */
  245. MISC2->CLKSEL = CLK_ClkInitStruct->AHBSource;
  246. }
  247. }
  248. /*---------- HCLK configuration ----------*/
  249. if ((CLK_ClkInitStruct->ClockType) & CLK_TYPE_HCLK)
  250. {
  251. assert_parameters(IS_CLK_HCLKDIV(CLK_ClkInitStruct->HCLK.Divider));
  252. MISC2->CLKDIVH = (CLK_ClkInitStruct->HCLK.Divider) - 1;
  253. }
  254. /*---------- PCLK configuration ----------*/
  255. if ((CLK_ClkInitStruct->ClockType) & CLK_TYPE_PCLK)
  256. {
  257. assert_parameters(IS_CLK_PCLKDIV(CLK_ClkInitStruct->PCLK.Divider));
  258. MISC2->CLKDIVP = (CLK_ClkInitStruct->PCLK.Divider) - 1;
  259. }
  260. }
  261. /**
  262. * @brief Enables or disables AHB Periphral clock.
  263. * @param Periphral: can use the '|' operator
  264. CLK_AHBPERIPHRAL_DMA
  265. CLK_AHBPERIPHRAL_GPIO
  266. CLK_AHBPERIPHRAL_LCD
  267. CLK_AHBPERIPHRAL_CRYPT
  268. NewState:
  269. ENABLE
  270. DISABLE
  271. * @retval None.
  272. */
  273. void CLK_AHBPeriphralCmd(uint32_t Periphral, uint32_t NewState)
  274. {
  275. /* Check parameters */
  276. assert_parameters(IS_CLK_AHBPERIPHRAL(Periphral));
  277. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  278. if (NewState == ENABLE)
  279. {
  280. MISC2->HCLKEN |= Periphral;
  281. }
  282. else
  283. {
  284. MISC2->HCLKEN &= ~Periphral;
  285. }
  286. }
  287. /**
  288. * @brief Enables or disables APB Periphral clock.
  289. * @param Periphral: can use the '|' operator
  290. CLK_APBPERIPHRAL_DMA
  291. CLK_APBPERIPHRAL_I2C
  292. CLK_APBPERIPHRAL_SPI1
  293. CLK_APBPERIPHRAL_SPI2
  294. CLK_APBPERIPHRAL_UART0
  295. CLK_APBPERIPHRAL_UART1
  296. CLK_APBPERIPHRAL_UART2
  297. CLK_APBPERIPHRAL_UART3
  298. CLK_APBPERIPHRAL_UART4
  299. CLK_APBPERIPHRAL_UART5
  300. CLK_APBPERIPHRAL_ISO78160
  301. CLK_APBPERIPHRAL_ISO78161
  302. CLK_APBPERIPHRAL_TIMER
  303. CLK_APBPERIPHRAL_MISC
  304. CLK_APBPERIPHRAL_MISC2
  305. CLK_APBPERIPHRAL_PMU
  306. CLK_APBPERIPHRAL_RTC
  307. CLK_APBPERIPHRAL_ANA
  308. CLK_APBPERIPHRAL_U32K0
  309. CLK_APBPERIPHRAL_U32K1
  310. NewState:
  311. ENABLE
  312. DISABLE
  313. * @retval None.
  314. */
  315. void CLK_APBPeriphralCmd(uint32_t Periphral, uint32_t NewState)
  316. {
  317. /* Check parameters */
  318. assert_parameters(IS_CLK_APBPERIPHRAL(Periphral));
  319. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  320. if (NewState == ENABLE)
  321. {
  322. MISC2->PCLKEN |= Periphral;
  323. }
  324. else
  325. {
  326. MISC2->PCLKEN &= ~Periphral;
  327. }
  328. }
  329. /**
  330. * @brief Returns the HCLK frequency
  331. * @param None
  332. * @retval HCLK frequency
  333. */
  334. uint32_t CLK_GetHCLKFreq(void)
  335. {
  336. uint32_t ahb_clksrc;
  337. uint32_t ahb_div;
  338. uint32_t pllh_frq;
  339. uint32_t plll_frq;
  340. uint32_t rtcclk_div;
  341. uint32_t hclk;
  342. /* Get current AHB clock source */
  343. ahb_clksrc = MISC2->CLKSEL & MISC2_CLKSEL_CLKSEL;
  344. /* Get AHB clock divider */
  345. ahb_div = (MISC2->CLKDIVH & MISC2_CLKDIVH_CLKDIVH) + 1;
  346. switch (ahb_clksrc)
  347. {
  348. /* AHB Clock source : 6.5M RC */
  349. case MISC2_CLKSEL_CLKSEL_RCOH:
  350. hclk = 6553600 / ahb_div;
  351. break;
  352. /* AHB Clock source : 6.5M XTAL */
  353. case MISC2_CLKSEL_CLKSEL_XOH:
  354. hclk = 6553600 / ahb_div;
  355. break;
  356. /* AHB Clock source : PLLH */
  357. case MISC2_CLKSEL_CLKSEL_PLLH:
  358. /* Get PLLH Frequency */
  359. pllh_frq = ANA->REG9 & ANA_REG9_PLLHSEL;
  360. switch (pllh_frq)
  361. {
  362. case ANA_REG9_PLLHSEL_X2:
  363. hclk = 13107200 / ahb_div;
  364. break;
  365. case ANA_REG9_PLLHSEL_X2_5:
  366. hclk = 16384000 / ahb_div;
  367. break;
  368. case ANA_REG9_PLLHSEL_X3:
  369. hclk = 19660800 / ahb_div;
  370. break;
  371. case ANA_REG9_PLLHSEL_X3_5:
  372. hclk = 22937600 / ahb_div;
  373. break;
  374. case ANA_REG9_PLLHSEL_X4:
  375. hclk = 26214400 / ahb_div;
  376. break;
  377. case ANA_REG9_PLLHSEL_X4_5:
  378. hclk = 29491200 / ahb_div;
  379. break;
  380. case ANA_REG9_PLLHSEL_X5:
  381. hclk = 32768000 / ahb_div;
  382. break;
  383. case ANA_REG9_PLLHSEL_X5_5:
  384. hclk = 36044800 / ahb_div;
  385. break;
  386. case ANA_REG9_PLLHSEL_X6:
  387. hclk = 39321600 / ahb_div;
  388. break;
  389. case ANA_REG9_PLLHSEL_X6_5:
  390. hclk = 42598400 / ahb_div;
  391. break;
  392. case ANA_REG9_PLLHSEL_X7:
  393. hclk = 45875200 / ahb_div;
  394. break;
  395. case ANA_REG9_PLLHSEL_X7_5:
  396. hclk = 49152000 / ahb_div;
  397. break;
  398. default:
  399. hclk = 0;
  400. break;
  401. }
  402. break;
  403. /* AHB Clock source : RTCCLK */
  404. case MISC2_CLKSEL_CLKSEL_RTCCLK:
  405. /* Get current RTC clock divider */
  406. rtcclk_div = RTC->PSCA & RTC_PSCA_PSCA;
  407. if (rtcclk_div == RTC_PSCA_PSCA_0)
  408. {
  409. hclk = 32768 / ahb_div;
  410. }
  411. else if (rtcclk_div == RTC_PSCA_PSCA_1)
  412. {
  413. hclk = 8192 / ahb_div;
  414. }
  415. else
  416. {
  417. hclk = 0;
  418. }
  419. break;
  420. /* AHB Clock source : PLLL */
  421. case MISC2_CLKSEL_CLKSEL_PLLL:
  422. /* Get PLLL Frequency */
  423. plll_frq = ANA->REG9 & ANA_REG9_PLLLSEL;
  424. switch (plll_frq)
  425. {
  426. case ANA_REG9_PLLLSEL_26M:
  427. hclk = 26214400 / ahb_div;
  428. break;
  429. case ANA_REG9_PLLLSEL_13M:
  430. hclk = 13107200 / ahb_div;
  431. break;
  432. case ANA_REG9_PLLLSEL_6_5M:
  433. hclk = 6553600 / ahb_div;
  434. break;
  435. case ANA_REG9_PLLLSEL_3_2M:
  436. hclk = 3276800 / ahb_div;
  437. break;
  438. case ANA_REG9_PLLLSEL_1_6M:
  439. hclk = 1638400 / ahb_div;
  440. break;
  441. case ANA_REG9_PLLLSEL_800K:
  442. hclk = 819200 / ahb_div;
  443. break;
  444. case ANA_REG9_PLLLSEL_400K:
  445. hclk = 409600 / ahb_div;
  446. break;
  447. case ANA_REG9_PLLLSEL_200K:
  448. hclk = 204800 / ahb_div;
  449. break;
  450. default:
  451. hclk = 0;
  452. break;
  453. }
  454. break;
  455. default:
  456. hclk = 0;
  457. break;
  458. }
  459. return (hclk);
  460. }
  461. /**
  462. * @brief Returns the PLLL frequency
  463. * @param None
  464. * @retval PLLL frequency
  465. */
  466. uint32_t CLK_GetPLLLFreq(void)
  467. {
  468. uint32_t plll_frq;
  469. if (!(ANA->REG3 & ANA_REG3_PLLLPDN))
  470. return 0;
  471. /* Get PLLL Frequency */
  472. plll_frq = ANA->REG9 & ANA_REG9_PLLLSEL;
  473. switch (plll_frq)
  474. {
  475. case ANA_REG9_PLLLSEL_26M:
  476. plll_frq = 26214400;
  477. break;
  478. case ANA_REG9_PLLLSEL_13M:
  479. plll_frq = 13107200;
  480. break;
  481. case ANA_REG9_PLLLSEL_6_5M:
  482. plll_frq = 6553600;
  483. break;
  484. case ANA_REG9_PLLLSEL_3_2M:
  485. plll_frq = 3276800;
  486. break;
  487. case ANA_REG9_PLLLSEL_1_6M:
  488. plll_frq = 1638400;
  489. break;
  490. case ANA_REG9_PLLLSEL_800K:
  491. plll_frq = 819200;
  492. break;
  493. case ANA_REG9_PLLLSEL_400K:
  494. plll_frq = 409600;
  495. break;
  496. case ANA_REG9_PLLLSEL_200K:
  497. plll_frq = 204800;
  498. break;
  499. default:
  500. plll_frq = 0;
  501. break;
  502. }
  503. return (plll_frq);
  504. }
  505. /**
  506. * @brief Returns the PCLK frequency
  507. * @param None
  508. * @retval PCLK frequency
  509. */
  510. uint32_t CLK_GetPCLKFreq(void)
  511. {
  512. return ((CLK_GetHCLKFreq()) / ((MISC2->CLKDIVP & MISC2_CLKDIVP_CLKDIVP) + 1));
  513. }
  514. /**
  515. * @brief Get the CLK_ClkInitStruct according to the internal
  516. * Clock configuration registers.
  517. *
  518. * @param CLK_ClkInitStruct pointer to an CLK_ClkInitStruct structure that
  519. * contains the current clock configuration.
  520. *
  521. * @retval None
  522. */
  523. void CLK_GetClockConfig(CLK_InitTypeDef *CLK_ClkInitStruct)
  524. {
  525. /* Set all possible values for the Clock type parameter --------------------*/
  526. CLK_ClkInitStruct->ClockType = CLK_TYPE_ALL;
  527. /* Get AHB clock source ----------------------------------------------------*/
  528. CLK_ClkInitStruct->AHBSource = (uint32_t)(MISC2->CLKSEL & MISC2_CLKSEL_CLKSEL);
  529. /* Get PLLL clock configration ---------------------------------------------*/
  530. CLK_ClkInitStruct->PLLL.Source = (uint32_t)(PMU->CONTROL & PMU_CONTROL_PLLL_SEL);
  531. CLK_ClkInitStruct->PLLL.Frequency = (uint32_t)(ANA->REG9 & ANA_REG9_PLLLSEL);
  532. CLK_ClkInitStruct->PLLL.State = (uint32_t)(ANA->REG3 & ANA_REG3_PLLLPDN);
  533. /* Get PLLH clock configuration --------------------------------------------*/
  534. CLK_ClkInitStruct->PLLH.Source = (uint32_t)(PMU->CONTROL & PMU_CONTROL_PLLH_SEL);
  535. CLK_ClkInitStruct->PLLH.Frequency = (uint32_t)(ANA->REG9 & ANA_REG9_PLLHSEL);
  536. CLK_ClkInitStruct->PLLH.State = (uint32_t)(ANA->REG3 & ANA_REG3_PLLHPDN);
  537. /* Get XTALH configuration -------------------------------------------------*/
  538. CLK_ClkInitStruct->XTALH.State = (uint32_t)(ANA->REG3 & ANA_REG3_XOHPDN);
  539. /* Get HCLK(Divider) configuration -----------------------------------------*/
  540. CLK_ClkInitStruct->HCLK.Divider = (uint32_t)((MISC2->CLKDIVH & MISC2_CLKDIVH_CLKDIVH) + 1);
  541. /* Get PCLK((Divider) configuration ----------------------------------------*/
  542. CLK_ClkInitStruct->PCLK.Divider = (uint32_t)((MISC2->CLKDIVP & MISC2_CLKDIVP_CLKDIVP) + 1);
  543. }
  544. /**
  545. * @brief Gets current external 6.5M crystal status.
  546. *
  547. * @param None
  548. *
  549. * @retval 6.5M crystal status
  550. * 0: 6.5536M crystal is absent.
  551. * 1: 6.5536M crystal is present.
  552. */
  553. uint8_t CLK_GetXTALHStatus(void)
  554. {
  555. if (PMU->STS & PMU_STS_EXIST_6M)
  556. return (1);
  557. else
  558. return (0);
  559. }
  560. /**
  561. * @brief Gets current external 32K crystal status.
  562. *
  563. * @param None
  564. *
  565. * @retval 32K crystal status
  566. * 0: 32K crystal is absent
  567. * 1: 32K crystal is present.
  568. */
  569. uint8_t CLK_GetXTALLStatus(void)
  570. {
  571. if (PMU->STS & PMU_STS_EXIST_32K)
  572. return (1);
  573. else
  574. return (0);
  575. }
  576. /**
  577. * @brief Gets PLL lock status.
  578. * @param PLLStatus:
  579. * CLK_STATUS_LOCKL
  580. * CLK_STATUS_LOCKH
  581. * @retval PLL lock status
  582. * 0 PLL is not locked.
  583. * 1 PLL is locked.
  584. */
  585. uint8_t CLK_GetPLLLockStatus(uint32_t PLLStatus)
  586. {
  587. /* Check parameters */
  588. assert_parameters(IS_CLK_PLLLOCK(PLLStatus));
  589. if (ANA->CMPOUT & PLLStatus)
  590. return 1;
  591. else
  592. return 0;
  593. }
  594. /*********************************** END OF FILE ******************************/