lib_clk.c 20 KB

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