at32f413_crm.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822
  1. /**
  2. **************************************************************************
  3. * @file at32f413_crm.c
  4. * @brief contains all the functions for the crm firmware library
  5. **************************************************************************
  6. * Copyright notice & Disclaimer
  7. *
  8. * The software Board Support Package (BSP) that is made available to
  9. * download from Artery official website is the copyrighted work of Artery.
  10. * Artery authorizes customers to use, copy, and distribute the BSP
  11. * software and its related documentation for the purpose of design and
  12. * development in conjunction with Artery microcontrollers. Use of the
  13. * software is governed by this copyright notice and the following disclaimer.
  14. *
  15. * THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
  16. * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
  17. * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
  18. * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
  19. * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
  20. * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
  21. *
  22. **************************************************************************
  23. */
  24. #include "at32f413_conf.h"
  25. /** @addtogroup AT32F413_periph_driver
  26. * @{
  27. */
  28. /** @defgroup CRM
  29. * @brief CRM driver modules
  30. * @{
  31. */
  32. #ifdef CRM_MODULE_ENABLED
  33. /** @defgroup CRM_private_functions
  34. * @{
  35. */
  36. /**
  37. * @brief reset the crm register
  38. * @param none
  39. * @retval none
  40. */
  41. void crm_reset(void)
  42. {
  43. /* reset the crm clock configuration to the default reset state(for debug purpose) */
  44. /* set hicken bit */
  45. CRM->ctrl_bit.hicken = TRUE;
  46. /* wait hick stable */
  47. while(CRM->ctrl_bit.hickstbl != SET);
  48. /* hick used as system clock */
  49. CRM->cfg_bit.sclksel = CRM_SCLK_HICK;
  50. /* wait sclk switch status */
  51. while(CRM->cfg_bit.sclksts != CRM_SCLK_HICK);
  52. /* reset hexten, hextbyps, cfden and pllen bits */
  53. CRM->ctrl &= ~(0x010D0000U);
  54. /* reset cfg register, include sclk switch, ahbdiv, apb1div, apb2div, adcdiv,
  55. clkout pllrcs, pllhextdiv, pllmult, usbdiv and pllrange bits */
  56. CRM->cfg = 0;
  57. /* reset clkout[3], usbbufs, hickdiv, clkoutdiv */
  58. CRM->misc1 = 0;
  59. /* disable all interrupts enable and clear pending bits */
  60. CRM->clkint = 0x009F0000;
  61. }
  62. /**
  63. * @brief enable or disable crm low speed external crystal bypass
  64. * @param new_state (TRUE or FALSE)
  65. * @retval none
  66. */
  67. void crm_lext_bypass(confirm_state new_state)
  68. {
  69. CRM->bpdc_bit.lextbyps = new_state;
  70. }
  71. /**
  72. * @brief enable or disable crm high speed external crystal bypass
  73. * @param new_state (TRUE or FALSE)
  74. * @retval none
  75. */
  76. void crm_hext_bypass(confirm_state new_state)
  77. {
  78. CRM->ctrl_bit.hextbyps = new_state;
  79. }
  80. /**
  81. * @brief get crm flag status
  82. * @param flag
  83. * this parameter can be one of the following values:
  84. * - CRM_HICK_STABLE_FLAG
  85. * - CRM_HEXT_STABLE_FLAG
  86. * - CRM_PLL_STABLE_FLAG
  87. * - CRM_LEXT_STABLE_FLAG
  88. * - CRM_LICK_STABLE_FLAG
  89. * - CRM_NRST_RESET_FLAG
  90. * - CRM_POR_RESET_FLAG
  91. * - CRM_SW_RESET_FLAG
  92. * - CRM_WDT_RESET_FLAG
  93. * - CRM_WWDT_RESET_FLAG
  94. * - CRM_LOWPOWER_RESET_FLAG
  95. * interrupt flag:
  96. * - CRM_LICK_READY_INT_FLAG
  97. * - CRM_LEXT_READY_INT_FLAG
  98. * - CRM_HICK_READY_INT_FLAG
  99. * - CRM_HEXT_READY_INT_FLAG
  100. * - CRM_PLL_READY_INT_FLAG
  101. * - CRM_CLOCK_FAILURE_INT_FLAG
  102. * @retval flag_status (SET or RESET)
  103. */
  104. flag_status crm_flag_get(uint32_t flag)
  105. {
  106. flag_status status = RESET;
  107. if((CRM_REG(flag) & CRM_REG_BIT(flag)) != CRM_REG_BIT(flag))
  108. {
  109. status = RESET;
  110. }
  111. else
  112. {
  113. status = SET;
  114. }
  115. return status;
  116. }
  117. /**
  118. * @brief wait for hext stable
  119. * @param none
  120. * @retval error_status (ERROR or SUCCESS)
  121. */
  122. error_status crm_hext_stable_wait(void)
  123. {
  124. uint32_t stable_cnt = 0;
  125. error_status status = ERROR;
  126. while((crm_flag_get(CRM_HEXT_STABLE_FLAG) != SET) && (stable_cnt < HEXT_STARTUP_TIMEOUT))
  127. {
  128. stable_cnt ++;
  129. }
  130. if(crm_flag_get(CRM_HEXT_STABLE_FLAG) != SET)
  131. {
  132. status = ERROR;
  133. }
  134. else
  135. {
  136. status = SUCCESS;
  137. }
  138. return status;
  139. }
  140. /**
  141. * @brief set the hick trimming value
  142. * @param trim_value (0x00~0x3F)
  143. * @retval none
  144. */
  145. void crm_hick_clock_trimming_set(uint8_t trim_value)
  146. {
  147. CRM->ctrl_bit.hicktrim = trim_value;
  148. }
  149. /**
  150. * @brief set the crm calibration value
  151. * @param cali_value (0x00~0xFF)
  152. * @retval none
  153. */
  154. void crm_hick_clock_calibration_set(uint8_t cali_value)
  155. {
  156. /* enable write hick calibration */
  157. CRM->misc1_bit.hickcal_key = 0x5A;
  158. /* write hick calibration value */
  159. CRM->ctrl_bit.hickcal = cali_value;
  160. /* disable write hick calibration */
  161. CRM->misc1_bit.hickcal_key = 0x0;
  162. }
  163. /**
  164. * @brief enable or disable the peripheral clock
  165. * @param value
  166. * this parameter can be one of the following values:
  167. * - CRM_DMA1_PERIPH_CLOCK - CRM_DMA2_PERIPH_CLOCK - CRM_CRC_PERIPH_CLOCK - CRM_SDIO1_PERIPH_CLOCK
  168. * - CRM_IOMUX_PERIPH_CLOCK - CRM_GPIOA_PERIPH_CLOCK - CRM_GPIOB_PERIPH_CLOCK - CRM_GPIOC_PERIPH_CLOCK
  169. * - CRM_GPIOD_PERIPH_CLOCK - CRM_GPIOF_PERIPH_CLOCK - CRM_ADC1_PERIPH_CLOCK - CRM_ADC2_PERIPH_CLOCK
  170. * - CRM_TMR1_PERIPH_CLOCK - CRM_SPI1_PERIPH_CLOCK - CRM_TMR8_PERIPH_CLOCK - CRM_USART1_PERIPH_CLOCK
  171. * - CRM_TMR9_PERIPH_CLOCK - CRM_TMR10_PERIPH_CLOCK - CRM_TMR11_PERIPH_CLOCK - CRM_ACC_PERIPH_CLOCK
  172. * - CRM_TMR3_PERIPH_CLOCK - CRM_TMR4_PERIPH_CLOCK - CRM_TMR5_PERIPH_CLOCK - CRM_WWDT_PERIPH_CLOCK
  173. * - CRM_SPI2_PERIPH_CLOCK - CRM_USART2_PERIPH_CLOCK - CRM_USART3_PERIPH_CLOCK - CRM_UART4_PERIPH_CLOCK
  174. * - CRM_UART5_PERIPH_CLOCK - CRM_I2C1_PERIPH_CLOCK - CRM_I2C2_PERIPH_CLOCK - CRM_USB_PERIPH_CLOCK
  175. * - CRM_CAN1_PERIPH_CLOCK - CRM_BPR_PERIPH_CLOCK - CRM_PWC_PERIPH_CLOCK - CRM_CAN2_PERIPH_CLOCK
  176. * @param new_state (TRUE or FALSE)
  177. * @retval none
  178. */
  179. void crm_periph_clock_enable(crm_periph_clock_type value, confirm_state new_state)
  180. {
  181. /* enable periph clock */
  182. if(TRUE == new_state)
  183. {
  184. CRM_REG(value) |= CRM_REG_BIT(value);
  185. }
  186. /* disable periph clock */
  187. else
  188. {
  189. CRM_REG(value) &= ~(CRM_REG_BIT(value));
  190. }
  191. }
  192. /**
  193. * @brief enable or disable the peripheral reset
  194. * @param value
  195. * this parameter can be one of the following values:
  196. * - CRM_IOMUX_PERIPH_RESET - CRM_EXINT_PERIPH_RESET - CRM_GPIOA_PERIPH_RESET - CRM_GPIOB_PERIPH_RESET
  197. * - CRM_GPIOC_PERIPH_RESET - CRM_GPIOD_PERIPH_RESET - CRM_GPIOF_PERIPH_RESET - CRM_ADC1_PERIPH_RESET
  198. * - CRM_ADC2_PERIPH_RESET - CRM_TMR1_PERIPH_RESET - CRM_SPI1_PERIPH_RESET - CRM_TMR8_PERIPH_RESET
  199. * - CRM_USART1_PERIPH_RESET - CRM_TMR9_PERIPH_RESET - CRM_TMR10_PERIPH_RESET - CRM_TMR11_PERIPH_RESET
  200. * - CRM_ACC_PERIPH_RESET - CRM_TMR2_PERIPH_RESET - CRM_TMR3_PERIPH_RESET - CRM_TMR4_PERIPH_RESET
  201. * - CRM_TMR5_PERIPH_RESET - CRM_WWDT_PERIPH_RESET - CRM_SPI2_PERIPH_RESET - CRM_USART2_PERIPH_RESET
  202. * - CRM_USART3_PERIPH_RESET - CRM_UART4_PERIPH_RESET - CRM_UART5_PERIPH_RESET - CRM_I2C1_PERIPH_RESET
  203. * - CRM_I2C2_PERIPH_RESET - CRM_USB_PERIPH_RESET - CRM_CAN1_PERIPH_RESET - CRM_BPR_PERIPH_RESET
  204. * - CRM_PWC_PERIPH_RESET - CRM_CAN2_PERIPH_RESET
  205. * @param new_state (TRUE or FALSE)
  206. * @retval none
  207. */
  208. void crm_periph_reset(crm_periph_reset_type value, confirm_state new_state)
  209. {
  210. /* enable periph reset */
  211. if(new_state == TRUE)
  212. {
  213. CRM_REG(value) |= (CRM_REG_BIT(value));
  214. }
  215. /* disable periph reset */
  216. else
  217. {
  218. CRM_REG(value) &= ~(CRM_REG_BIT(value));
  219. }
  220. }
  221. /**
  222. * @brief enable or disable the peripheral clock in sleep mode
  223. * @param value
  224. * this parameter can be one of the following values:
  225. * - CRM_SRAM_PERIPH_CLOCK_SLEEP_MODE
  226. * - CRM_FLASH_PERIPH_CLOCK_SLEEP_MODE
  227. * @param new_state (TRUE or FALSE)
  228. * @retval none
  229. */
  230. void crm_periph_sleep_mode_clock_enable(crm_periph_clock_sleepmd_type value, confirm_state new_state)
  231. {
  232. /* enable periph clock in sleep mode */
  233. if(new_state == TRUE)
  234. {
  235. CRM_REG(value) |= (CRM_REG_BIT(value));
  236. }
  237. /* disable perph clock in sleep mode */
  238. else
  239. {
  240. CRM_REG(value) &= ~(CRM_REG_BIT(value));
  241. }
  242. }
  243. /**
  244. * @brief enable or disable the crm clock source
  245. * @param source
  246. * this parameter can be one of the following values:
  247. * - CRM_CLOCK_SOURCE_HICK
  248. * - CRM_CLOCK_SOURCE_HEXT
  249. * - CRM_CLOCK_SOURCE_PLL
  250. * - CRM_CLOCK_SOURCE_LEXT
  251. * - CRM_CLOCK_SOURCE_LICK
  252. * @param new_state (TRUE or FALSE)
  253. * @retval none
  254. */
  255. void crm_clock_source_enable(crm_clock_source_type source, confirm_state new_state)
  256. {
  257. switch(source)
  258. {
  259. case CRM_CLOCK_SOURCE_HICK:
  260. CRM->ctrl_bit.hicken = new_state;
  261. break;
  262. case CRM_CLOCK_SOURCE_HEXT:
  263. CRM->ctrl_bit.hexten = new_state;
  264. break;
  265. case CRM_CLOCK_SOURCE_PLL:
  266. CRM->ctrl_bit.pllen = new_state;
  267. break;
  268. case CRM_CLOCK_SOURCE_LEXT:
  269. CRM->bpdc_bit.lexten = new_state;
  270. break;
  271. case CRM_CLOCK_SOURCE_LICK:
  272. CRM->ctrlsts_bit.licken = new_state;
  273. break;
  274. default:
  275. break;
  276. }
  277. }
  278. /**
  279. * @brief clear the crm reset flags
  280. * @param flag
  281. * this parameter can be one of the following values:
  282. * reset flag:
  283. * - CRM_NRST_RESET_FLAG
  284. * - CRM_POR_RESET_FLAG
  285. * - CRM_SW_RESET_FLAG
  286. * - CRM_WDT_RESET_FLAG
  287. * - CRM_WWDT_RESET_FLAG
  288. * - CRM_LOWPOWER_RESET_FLAG
  289. * - CRM_ALL_RESET_FLAG
  290. * interrupt flag:
  291. * - CRM_LICK_READY_INT_FLAG
  292. * - CRM_LEXT_READY_INT_FLAG
  293. * - CRM_HICK_READY_INT_FLAG
  294. * - CRM_HEXT_READY_INT_FLAG
  295. * - CRM_PLL_READY_INT_FLAG
  296. * - CRM_CLOCK_FAILURE_INT_FLAG
  297. * @retval none
  298. */
  299. void crm_flag_clear(uint32_t flag)
  300. {
  301. switch(flag)
  302. {
  303. case CRM_NRST_RESET_FLAG:
  304. case CRM_POR_RESET_FLAG:
  305. case CRM_SW_RESET_FLAG:
  306. case CRM_WDT_RESET_FLAG:
  307. case CRM_WWDT_RESET_FLAG:
  308. case CRM_LOWPOWER_RESET_FLAG:
  309. case CRM_ALL_RESET_FLAG:
  310. CRM->ctrlsts_bit.rstfc = TRUE;
  311. while(CRM->ctrlsts_bit.rstfc == TRUE);
  312. break;
  313. case CRM_LICK_READY_INT_FLAG:
  314. CRM->clkint_bit.lickstblfc = TRUE;
  315. break;
  316. case CRM_LEXT_READY_INT_FLAG:
  317. CRM->clkint_bit.lextstblfc = TRUE;
  318. break;
  319. case CRM_HICK_READY_INT_FLAG:
  320. CRM->clkint_bit.hickstblfc = TRUE;
  321. break;
  322. case CRM_HEXT_READY_INT_FLAG:
  323. CRM->clkint_bit.hextstblfc = TRUE;
  324. break;
  325. case CRM_PLL_READY_INT_FLAG:
  326. CRM->clkint_bit.pllstblfc = TRUE;
  327. break;
  328. case CRM_CLOCK_FAILURE_INT_FLAG:
  329. CRM->clkint_bit.cfdfc = TRUE;
  330. break;
  331. default:
  332. break;
  333. }
  334. }
  335. /**
  336. * @brief select rtc clock
  337. * @param value
  338. * this parameter can be one of the following values:
  339. * - CRM_RTC_CLOCK_LEXT
  340. * - CRM_RTC_CLOCK_LICK
  341. * - CRM_RTC_CLOCK_HEXT_DIV
  342. * @retval none
  343. */
  344. void crm_rtc_clock_select(crm_rtc_clock_type value)
  345. {
  346. CRM->bpdc_bit.rtcsel = value;
  347. }
  348. /**
  349. * @brief enable or disable rtc
  350. * @param new_state (TRUE or FALSE)
  351. * @retval none
  352. */
  353. void crm_rtc_clock_enable(confirm_state new_state)
  354. {
  355. CRM->bpdc_bit.rtcen = new_state;
  356. }
  357. /**
  358. * @brief set crm ahb division
  359. * @param value
  360. * this parameter can be one of the following values:
  361. * - CRM_AHB_DIV_1
  362. * - CRM_AHB_DIV_2
  363. * - CRM_AHB_DIV_4
  364. * - CRM_AHB_DIV_8
  365. * - CRM_AHB_DIV_16
  366. * - CRM_AHB_DIV_64
  367. * - CRM_AHB_DIV_128
  368. * - CRM_AHB_DIV_256
  369. * - CRM_AHB_DIV_512
  370. * @retval none
  371. */
  372. void crm_ahb_div_set(crm_ahb_div_type value)
  373. {
  374. CRM->cfg_bit.ahbdiv = value;
  375. }
  376. /**
  377. * @brief set crm apb1 division
  378. * @note the maximum frequency of APB1/APB2 clock is 100 MHz
  379. * @param value
  380. * this parameter can be one of the following values:
  381. * - CRM_APB1_DIV_1
  382. * - CRM_APB1_DIV_2
  383. * - CRM_APB1_DIV_4
  384. * - CRM_APB1_DIV_8
  385. * - CRM_APB1_DIV_16
  386. * @retval none
  387. */
  388. void crm_apb1_div_set(crm_apb1_div_type value)
  389. {
  390. CRM->cfg_bit.apb1div = value;
  391. }
  392. /**
  393. * @brief set crm apb2 division
  394. * @note the maximum frequency of APB1/APB2 clock is 100 MHz
  395. * @param value
  396. * this parameter can be one of the following values:
  397. * - CRM_APB2_DIV_1
  398. * - CRM_APB2_DIV_2
  399. * - CRM_APB2_DIV_4
  400. * - CRM_APB2_DIV_8
  401. * - CRM_APB2_DIV_16
  402. * @retval none
  403. */
  404. void crm_apb2_div_set(crm_apb2_div_type value)
  405. {
  406. CRM->cfg_bit.apb2div = value;
  407. }
  408. /**
  409. * @brief set crm adc division
  410. * @param value
  411. * this parameter can be one of the following values:
  412. * - CRM_ADC_DIV_2
  413. * - CRM_ADC_DIV_4
  414. * - CRM_ADC_DIV_6
  415. * - CRM_ADC_DIV_8
  416. * - CRM_ADC_DIV_12
  417. * - CRM_ADC_DIV_16
  418. * @retval none
  419. */
  420. void crm_adc_clock_div_set(crm_adc_div_type div_value)
  421. {
  422. CRM->cfg_bit.adcdiv_l = div_value & 0x03;
  423. CRM->cfg_bit.adcdiv_h = (div_value >> 2) & 0x01;
  424. }
  425. /**
  426. * @brief set crm usb division
  427. * @param value
  428. * this parameter can be one of the following values:
  429. * - CRM_USB_DIV_1_5
  430. * - CRM_USB_DIV_1
  431. * - CRM_USB_DIV_2_5
  432. * - CRM_USB_DIV_2
  433. * - CRM_USB_DIV_3_5
  434. * - CRM_USB_DIV_3
  435. * - CRM_USB_DIV_4
  436. * @retval none
  437. */
  438. void crm_usb_clock_div_set(crm_usb_div_type div_value)
  439. {
  440. CRM->cfg_bit.usbdiv_l = div_value & 0x03;
  441. CRM->cfg_bit.usbdiv_h = (div_value >> 2) & 0x01;
  442. }
  443. /**
  444. * @brief enable or disable clock failure detection
  445. * @param new_state (TRUE or FALSE)
  446. * @retval none
  447. */
  448. void crm_clock_failure_detection_enable(confirm_state new_state)
  449. {
  450. CRM->ctrl_bit.cfden = new_state;
  451. }
  452. /**
  453. * @brief battery powered domain software reset
  454. * @param new_state (TRUE or FALSE)
  455. * @retval none
  456. */
  457. void crm_battery_powered_domain_reset(confirm_state new_state)
  458. {
  459. CRM->bpdc_bit.bpdrst = new_state;
  460. }
  461. /**
  462. * @brief config crm pll
  463. * @param clock_source
  464. * this parameter can be one of the following values:
  465. * - CRM_PLL_SOURCE_HICK
  466. * - CRM_PLL_SOURCE_HEXT
  467. * - CRM_PLL_SOURCE_HEXT_DIV
  468. * @param mult_value (CRM_PLL_MULT_2~64)
  469. * @param pll_range
  470. * this parameter can be one of the following values:
  471. * - CRM_PLL_OUTPUT_RANGE_LE72MHZ
  472. * - CRM_PLL_OUTPUT_RANGE_GT72MHZ
  473. * @retval none
  474. */
  475. void crm_pll_config(crm_pll_clock_source_type clock_source, crm_pll_mult_type mult_value, crm_pll_output_range_type pll_range)
  476. {
  477. /* config pll clock source */
  478. if(clock_source == CRM_PLL_SOURCE_HICK)
  479. {
  480. CRM->cfg_bit.pllrcs = FALSE;
  481. CRM->misc1_bit.hickdiv = CRM_HICK48_NODIV;
  482. }
  483. else
  484. {
  485. CRM->cfg_bit.pllrcs = TRUE;
  486. if(CRM_PLL_SOURCE_HEXT == clock_source)
  487. {
  488. CRM->cfg_bit.pllhextdiv = FALSE;
  489. }
  490. else
  491. {
  492. CRM->cfg_bit.pllhextdiv = TRUE;
  493. }
  494. }
  495. /* config pll multiplication factor */
  496. CRM->cfg_bit.pllmult_l = (mult_value & 0x0F);
  497. CRM->cfg_bit.pllmult_h = ((mult_value & 0x30) >> 4);
  498. /* config pll output range */
  499. CRM->cfg_bit.pllrange = pll_range;
  500. }
  501. /**
  502. * @brief select system clock source
  503. * @param value
  504. * this parameter can be one of the following values:
  505. * - CRM_SCLK_HICK
  506. * - CRM_SCLK_HEXT
  507. * - CRM_SCLK_PLL
  508. * @retval none
  509. */
  510. void crm_sysclk_switch(crm_sclk_type value)
  511. {
  512. CRM->cfg_bit.sclksel = value;
  513. }
  514. /**
  515. * @brief indicate which clock source is used as system clock
  516. * @param none
  517. * @retval crm_sclk
  518. * this return can be one of the following values:
  519. * - CRM_SCLK_HICK
  520. * - CRM_SCLK_HEXT
  521. * - CRM_SCLK_PLL
  522. */
  523. crm_sclk_type crm_sysclk_switch_status_get(void)
  524. {
  525. return (crm_sclk_type)CRM->cfg_bit.sclksts;
  526. }
  527. /**
  528. * @brief get crm clocks freqency
  529. * @param clocks
  530. * - pointer to the crm_clocks_freq structure
  531. * @retval none
  532. */
  533. void crm_clocks_freq_get(crm_clocks_freq_type *clocks_struct)
  534. {
  535. uint32_t pll_mult = 0, pll_mult_h = 0, pll_clock_source = 0, temp = 0, div_value = 0;
  536. crm_sclk_type sclk_source;
  537. static const uint8_t sclk_ahb_div_table[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
  538. static const uint8_t ahb_apb1_div_table[8] = {0, 0, 0, 0, 1, 2, 3, 4};
  539. static const uint8_t ahb_apb2_div_table[8] = {0, 0, 0, 0, 1, 2, 3, 4};
  540. static const uint8_t adc_div_table[8] = {2, 4, 6, 8, 2, 12, 8, 16};
  541. /* get sclk source */
  542. sclk_source = crm_sysclk_switch_status_get();
  543. switch(sclk_source)
  544. {
  545. case CRM_SCLK_HICK:
  546. if(((CRM->misc3_bit.hick_to_sclk) != RESET) && ((CRM->misc1_bit.hickdiv) != RESET))
  547. clocks_struct->sclk_freq = HICK_VALUE * 6;
  548. else
  549. clocks_struct->sclk_freq = HICK_VALUE;
  550. break;
  551. case CRM_SCLK_HEXT:
  552. clocks_struct->sclk_freq = HEXT_VALUE;
  553. break;
  554. case CRM_SCLK_PLL:
  555. pll_clock_source = CRM->cfg_bit.pllrcs;
  556. /* get multiplication factor */
  557. pll_mult = CRM->cfg_bit.pllmult_l;
  558. pll_mult_h = CRM->cfg_bit.pllmult_h;
  559. /* process high bits */
  560. if((pll_mult_h != 0U) || (pll_mult == 15U))
  561. {
  562. pll_mult += ((16U * pll_mult_h) + 1U);
  563. }
  564. else
  565. {
  566. pll_mult += 2U;
  567. }
  568. if (pll_clock_source == 0x00)
  569. {
  570. /* hick divided by 2 selected as pll clock entry */
  571. clocks_struct->sclk_freq = (HICK_VALUE >> 1) * pll_mult;
  572. }
  573. else
  574. {
  575. /* hext selected as pll clock entry */
  576. if (CRM->cfg_bit.pllhextdiv != RESET)
  577. {
  578. /* hext clock divided by 2 */
  579. clocks_struct->sclk_freq = (HEXT_VALUE / 2) * pll_mult;
  580. }
  581. else
  582. {
  583. clocks_struct->sclk_freq = HEXT_VALUE * pll_mult;
  584. }
  585. }
  586. break;
  587. default:
  588. clocks_struct->sclk_freq = HICK_VALUE;
  589. break;
  590. }
  591. /* compute sclk, ahbclk, abp1clk apb2clk and adcclk frequencies */
  592. /* get ahb division */
  593. temp = CRM->cfg_bit.ahbdiv;
  594. div_value = sclk_ahb_div_table[temp];
  595. /* ahbclk frequency */
  596. clocks_struct->ahb_freq = clocks_struct->sclk_freq >> div_value;
  597. /* get apb1 division */
  598. temp = CRM->cfg_bit.apb1div;
  599. div_value = ahb_apb1_div_table[temp];
  600. /* apb1clk frequency */
  601. clocks_struct->apb1_freq = clocks_struct->ahb_freq >> div_value;
  602. /* get apb2 division */
  603. temp = CRM->cfg_bit.apb2div;
  604. div_value = ahb_apb2_div_table[temp];
  605. /* apb2clk frequency */
  606. clocks_struct->apb2_freq = clocks_struct->ahb_freq >> div_value;
  607. /* get adc division */
  608. temp = CRM->cfg_bit.adcdiv_h;
  609. temp = ((temp << 2) | (CRM->cfg_bit.adcdiv_l));
  610. div_value = adc_div_table[temp];
  611. /* adcclk clock frequency */
  612. clocks_struct->adc_freq = clocks_struct->apb2_freq / div_value;
  613. }
  614. /**
  615. * @brief set crm clkout
  616. * @param clkout
  617. * this parameter can be one of the following values:
  618. * - CRM_CLKOUT_NOCLK
  619. * - CRM_CLKOUT_LICK
  620. * - CRM_CLKOUT_LEXT
  621. * - CRM_CLKOUT_SCLK
  622. * - CRM_CLKOUT_HICK
  623. * - CRM_CLKOUT_HEXT
  624. * - CRM_CLKOUT_PLL_DIV_2
  625. * - CRM_CLKOUT_PLL_DIV_4
  626. * - CRM_CLKOUT_USB
  627. * - CRM_CLKOUT_ADC
  628. * @retval none
  629. */
  630. void crm_clock_out_set(crm_clkout_select_type clkout)
  631. {
  632. CRM->cfg_bit.clkout_sel = clkout & 0x7;
  633. CRM->misc1_bit.clkout_sel = (clkout >> 3) & 0x1;
  634. }
  635. /**
  636. * @brief config crm interrupt
  637. * @param int
  638. * this parameter can be any combination of the following values:
  639. * - CRM_LICK_STABLE_INT
  640. * - CRM_LEXT_STABLE_INT
  641. * - CRM_HICK_STABLE_INT
  642. * - CRM_HEXT_STABLE_INT
  643. * - CRM_PLL_STABLE_INT
  644. * @param new_state (TRUE or FALSE)
  645. * @retval none
  646. */
  647. void crm_interrupt_enable(uint32_t crm_int, confirm_state new_state)
  648. {
  649. if(new_state == TRUE)
  650. CRM->clkint |= crm_int;
  651. else
  652. CRM->clkint &= ~crm_int;
  653. }
  654. /**
  655. * @brief auto step clock switch enable
  656. * @param new_state (TRUE or FALSE)
  657. * @retval none
  658. */
  659. void crm_auto_step_mode_enable(confirm_state new_state)
  660. {
  661. if(new_state == TRUE)
  662. CRM->misc3_bit.auto_step_en = CRM_AUTO_STEP_MODE_ENABLE;
  663. else
  664. CRM->misc3_bit.auto_step_en = CRM_AUTO_STEP_MODE_DISABLE;
  665. }
  666. /**
  667. * @brief usbdev interrupt remapping control
  668. * @param int_remap
  669. * this parameter can be one of the following values:
  670. * - CRM_USB_INT19_INT20
  671. * - CRM_USB_INT73_INT74
  672. * @retval none
  673. */
  674. void crm_usb_interrupt_remapping_set(crm_usb_int_map_type int_remap)
  675. {
  676. CRM->intmap_bit.usbintmap = int_remap;
  677. }
  678. /**
  679. * @brief config hick divider select
  680. * @param value
  681. * this parameter can be one of the following values:
  682. * - CRM_HICK48_DIV6
  683. * - CRM_HICK48_NODIV
  684. * @retval none
  685. */
  686. void crm_hick_divider_select(crm_hick_div_6_type value)
  687. {
  688. CRM->misc1_bit.hickdiv = value;
  689. }
  690. /**
  691. * @brief hick as system clock frequency select
  692. * @param value
  693. * this parameter can be one of the following values:
  694. * - CRM_HICK_SCLK_8MHZ
  695. * - CRM_HICK_SCLK_48MHZ
  696. * @retval none
  697. */
  698. void crm_hick_sclk_frequency_select(crm_hick_sclk_frequency_type value)
  699. {
  700. crm_hick_divider_select(CRM_HICK48_NODIV);
  701. CRM->misc3_bit.hick_to_sclk = value;
  702. }
  703. /**
  704. * @brief usb 48 mhz clock source select
  705. * @param value
  706. * this parameter can be one of the following values:
  707. * - CRM_USB_CLOCK_SOURCE_PLL
  708. * - CRM_USB_CLOCK_SOURCE_HICK
  709. * @retval none
  710. */
  711. void crm_usb_clock_source_select(crm_usb_clock_source_type value)
  712. {
  713. if(value == CRM_USB_CLOCK_SOURCE_HICK)
  714. {
  715. crm_hick_sclk_frequency_select(CRM_HICK_SCLK_48MHZ);
  716. }
  717. CRM->misc3_bit.hick_to_usb = value;
  718. }
  719. /**
  720. * @brief enable or disable clkout direct to tmr10 channel 1
  721. * @param new_state (TRUE or FALSE)
  722. * @retval none
  723. */
  724. void crm_clkout_to_tmr10_enable(confirm_state new_state)
  725. {
  726. CRM->misc2_bit.clk_to_tmr = new_state;
  727. }
  728. /**
  729. * @brief set crm clkout division
  730. * @param clkout_div
  731. * this parameter can be one of the following values:
  732. * - CRM_CLKOUT_DIV_1
  733. * - CRM_CLKOUT_DIV_2
  734. * - CRM_CLKOUT_DIV_4
  735. * - CRM_CLKOUT_DIV_8
  736. * - CRM_CLKOUT_DIV_16
  737. * - CRM_CLKOUT_DIV_64
  738. * - CRM_CLKOUT_DIV_128
  739. * - CRM_CLKOUT_DIV_256
  740. * - CRM_CLKOUT_DIV_512
  741. * @retval none
  742. */
  743. void crm_clkout_div_set(crm_clkout_div_type clkout_div)
  744. {
  745. CRM->misc1_bit.clkoutdiv = clkout_div;
  746. }
  747. /**
  748. * @}
  749. */
  750. #endif
  751. /**
  752. * @}
  753. */
  754. /**
  755. * @}
  756. */