at32f403a_407_crm.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921
  1. /**
  2. **************************************************************************
  3. * @file at32f403a_407_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 "at32f403a_407_conf.h"
  25. /** @addtogroup AT32F403A_407_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 get crm interrupt flag status
  119. * @param flag
  120. * this parameter can be one of the following values:
  121. * - CRM_LICK_READY_INT_FLAG
  122. * - CRM_LEXT_READY_INT_FLAG
  123. * - CRM_HICK_READY_INT_FLAG
  124. * - CRM_HEXT_READY_INT_FLAG
  125. * - CRM_PLL_READY_INT_FLAG
  126. * - CRM_CLOCK_FAILURE_INT_FLAG
  127. * @retval flag_status (SET or RESET)
  128. */
  129. flag_status crm_interrupt_flag_get(uint32_t flag)
  130. {
  131. flag_status status = RESET;
  132. switch(flag)
  133. {
  134. case CRM_LICK_READY_INT_FLAG:
  135. if(CRM->clkint_bit.lickstblf && CRM->clkint_bit.lickstblien)
  136. {
  137. status = SET;
  138. }
  139. break;
  140. case CRM_LEXT_READY_INT_FLAG:
  141. if(CRM->clkint_bit.lextstblf && CRM->clkint_bit.lextstblien)
  142. {
  143. status = SET;
  144. }
  145. break;
  146. case CRM_HICK_READY_INT_FLAG:
  147. if(CRM->clkint_bit.hickstblf && CRM->clkint_bit.hickstblien)
  148. {
  149. status = SET;
  150. }
  151. break;
  152. case CRM_HEXT_READY_INT_FLAG:
  153. if(CRM->clkint_bit.hextstblf && CRM->clkint_bit.hextstblien)
  154. {
  155. status = SET;
  156. }
  157. break;
  158. case CRM_PLL_READY_INT_FLAG:
  159. if(CRM->clkint_bit.pllstblf && CRM->clkint_bit.pllstblien)
  160. {
  161. status = SET;
  162. }
  163. break;
  164. case CRM_CLOCK_FAILURE_INT_FLAG:
  165. if(CRM->clkint_bit.cfdf && CRM->ctrl_bit.cfden)
  166. {
  167. status = SET;
  168. }
  169. break;
  170. }
  171. return status;
  172. }
  173. /**
  174. * @brief wait for hext stable
  175. * @param none
  176. * @retval error_status (ERROR or SUCCESS)
  177. */
  178. error_status crm_hext_stable_wait(void)
  179. {
  180. uint32_t stable_cnt = 0;
  181. error_status status = ERROR;
  182. while((crm_flag_get(CRM_HEXT_STABLE_FLAG) != SET) && (stable_cnt < HEXT_STARTUP_TIMEOUT))
  183. {
  184. stable_cnt ++;
  185. }
  186. if(crm_flag_get(CRM_HEXT_STABLE_FLAG) != SET)
  187. {
  188. status = ERROR;
  189. }
  190. else
  191. {
  192. status = SUCCESS;
  193. }
  194. return status;
  195. }
  196. /**
  197. * @brief set the hick trimming value
  198. * @param trim_value (0x00~0x3F)
  199. * @retval none
  200. */
  201. void crm_hick_clock_trimming_set(uint8_t trim_value)
  202. {
  203. CRM->ctrl_bit.hicktrim = trim_value;
  204. }
  205. /**
  206. * @brief set the crm calibration value
  207. * @param cali_value (0x00~0xFF)
  208. * @retval none
  209. */
  210. void crm_hick_clock_calibration_set(uint8_t cali_value)
  211. {
  212. /* enable write hick calibration */
  213. CRM->misc1_bit.hickcal_key = 0x5A;
  214. /* write hick calibration value */
  215. CRM->ctrl_bit.hickcal = cali_value;
  216. /* disable write hick calibration */
  217. CRM->misc1_bit.hickcal_key = 0x0;
  218. }
  219. /**
  220. * @brief enable or disable the peripheral clock
  221. * @param value
  222. * this parameter can be one of the following values:
  223. * - CRM_DMA1_PERIPH_CLOCK - CRM_DMA2_PERIPH_CLOCK - CRM_CRC_PERIPH_CLOCK - CRM_XMC_PERIPH_CLOCK
  224. * - CRM_SDIO1_PERIPH_CLOCK - CRM_SDIO2_PERIPH_CLOCK - CRM_EMAC_PERIPH_CLOCK - CRM_EMACTX_PERIPH_CLOCK
  225. * - CRM_EMACRX_PERIPH_CLOCK - CRM_EMACPTP_PERIPH_CLOCK - CRM_IOMUX_PERIPH_CLOCK - CRM_GPIOA_PERIPH_CLOCK
  226. * - CRM_GPIOB_PERIPH_CLOCK - CRM_GPIOC_PERIPH_CLOCK - CRM_GPIOD_PERIPH_CLOCK - CRM_GPIOE_PERIPH_CLOCK
  227. * - CRM_ADC1_PERIPH_CLOCK - CRM_ADC2_PERIPH_CLOCK - CRM_TMR1_PERIPH_CLOCK - CRM_SPI1_PERIPH_CLOCK
  228. * - CRM_TMR8_PERIPH_CLOCK - CRM_USART1_PERIPH_CLOCK - CRM_ADC3_PERIPH_CLOCK - CRM_TMR9_PERIPH_CLOCK
  229. * - CRM_TMR10_PERIPH_CLOCK - CRM_TMR11_PERIPH_CLOCK - CRM_ACC_PERIPH_CLOCK - CRM_I2C3_PERIPH_CLOCK
  230. * - CRM_USART6_PERIPH_CLOCK - CRM_UART7_PERIPH_CLOCK - CRM_UART8_PERIPH_CLOCK - CRM_TMR2_PERIPH_CLOCK
  231. * - CRM_TMR3_PERIPH_CLOCK - CRM_TMR4_PERIPH_CLOCK - CRM_TMR5_PERIPH_CLOCK - CRM_TMR6_PERIPH_CLOCK
  232. * - CRM_TMR7_PERIPH_CLOCK - CRM_TMR12_PERIPH_CLOCK - CRM_TMR13_PERIPH_CLOCK - CRM_TMR14_PERIPH_CLOCK
  233. * - CRM_WWDT_PERIPH_CLOCK - CRM_SPI2_PERIPH_CLOCK - CRM_SPI3_PERIPH_CLOCK - CRM_SPI4_PERIPH_CLOCK
  234. * - CRM_USART2_PERIPH_CLOCK - CRM_USART3_PERIPH_CLOCK - CRM_UART4_PERIPH_CLOCK - CRM_UART5_PERIPH_CLOCK
  235. * - CRM_I2C1_PERIPH_CLOCK - CRM_I2C2_PERIPH_CLOCK - CRM_USB_PERIPH_CLOCK - CRM_CAN1_PERIPH_CLOCK
  236. * - CRM_CAN2_PERIPH_CLOCK - CRM_BPR_PERIPH_CLOCK - CRM_PWC_PERIPH_CLOCK - CRM_DAC_PERIPH_CLOCK
  237. * @param new_state (TRUE or FALSE)
  238. * @retval none
  239. */
  240. void crm_periph_clock_enable(crm_periph_clock_type value, confirm_state new_state)
  241. {
  242. /* enable periph clock */
  243. if(TRUE == new_state)
  244. {
  245. CRM_REG(value) |= CRM_REG_BIT(value);
  246. }
  247. /* disable periph clock */
  248. else
  249. {
  250. CRM_REG(value) &= ~(CRM_REG_BIT(value));
  251. }
  252. }
  253. /**
  254. * @brief enable or disable the peripheral reset
  255. * @param value
  256. * this parameter can be one of the following values:
  257. * - CRM_EMAC_PERIPH_RESET - CRM_IOMUX_PERIPH_RESET - CRM_EXINT_PERIPH_RESET - CRM_GPIOA_PERIPH_RESET
  258. * - CRM_GPIOB_PERIPH_RESET - CRM_GPIOC_PERIPH_RESET - CRM_GPIOD_PERIPH_RESET - CRM_GPIOE_PERIPH_RESET
  259. * - CRM_ADC1_PERIPH_RESET - CRM_ADC2_PERIPH_RESET - CRM_TMR1_PERIPH_RESET - CRM_SPI1_PERIPH_RESET
  260. * - CRM_TMR8_PERIPH_RESET - CRM_USART1_PERIPH_RESET - CRM_ADC3_PERIPH_RESET - CRM_TMR9_PERIPH_RESET
  261. * - CRM_TMR10_PERIPH_RESET - CRM_TMR11_PERIPH_RESET - CRM_ACC_PERIPH_RESET - CRM_I2C3_PERIPH_RESET
  262. * - CRM_USART6_PERIPH_RESET - CRM_UART7_PERIPH_RESET - CRM_UART8_PERIPH_RESET - CRM_TMR2_PERIPH_RESET
  263. * - CRM_TMR3_PERIPH_RESET - CRM_TMR4_PERIPH_RESET - CRM_TMR5_PERIPH_RESET - CRM_TMR6_PERIPH_RESET
  264. * - CRM_TMR7_PERIPH_RESET - CRM_TMR12_PERIPH_RESET - CRM_TMR13_PERIPH_RESET - CRM_TMR14_PERIPH_RESET
  265. * - CRM_WWDT_PERIPH_RESET - CRM_SPI2_PERIPH_RESET - CRM_SPI3_PERIPH_RESET - CRM_SPI4_PERIPH_RESET
  266. * - CRM_USART2_PERIPH_RESET - CRM_USART3_PERIPH_RESET - CRM_UART4_PERIPH_RESET - CRM_UART5_PERIPH_RESET
  267. * - CRM_I2C1_PERIPH_RESET - CRM_I2C2_PERIPH_RESET - CRM_USB_PERIPH_RESET - CRM_CAN1_PERIPH_RESET
  268. * - CRM_CAN2_PERIPH_RESET - CRM_BPR_PERIPH_RESET - CRM_PWC_PERIPH_RESET - CRM_DAC_PERIPH_RESET
  269. * @param new_state (TRUE or FALSE)
  270. * @retval none
  271. */
  272. void crm_periph_reset(crm_periph_reset_type value, confirm_state new_state)
  273. {
  274. /* enable periph reset */
  275. if(new_state == TRUE)
  276. {
  277. CRM_REG(value) |= (CRM_REG_BIT(value));
  278. }
  279. /* disable periph reset */
  280. else
  281. {
  282. CRM_REG(value) &= ~(CRM_REG_BIT(value));
  283. }
  284. }
  285. /**
  286. * @brief enable or disable the peripheral clock in sleep mode
  287. * @param value
  288. * this parameter can be one of the following values:
  289. * - CRM_SRAM_PERIPH_CLOCK_SLEEP_MODE
  290. * - CRM_FLASH_PERIPH_CLOCK_SLEEP_MODE
  291. * @param new_state (TRUE or FALSE)
  292. * @retval none
  293. */
  294. void crm_periph_sleep_mode_clock_enable(crm_periph_clock_sleepmd_type value, confirm_state new_state)
  295. {
  296. /* enable periph clock in sleep mode */
  297. if(new_state == TRUE)
  298. {
  299. CRM_REG(value) |= (CRM_REG_BIT(value));
  300. }
  301. /* disable perph clock in sleep mode */
  302. else
  303. {
  304. CRM_REG(value) &= ~(CRM_REG_BIT(value));
  305. }
  306. }
  307. /**
  308. * @brief enable or disable the crm clock source
  309. * @param source
  310. * this parameter can be one of the following values:
  311. * - CRM_CLOCK_SOURCE_HICK
  312. * - CRM_CLOCK_SOURCE_HEXT
  313. * - CRM_CLOCK_SOURCE_PLL
  314. * - CRM_CLOCK_SOURCE_LEXT
  315. * - CRM_CLOCK_SOURCE_LICK
  316. * @param new_state (TRUE or FALSE)
  317. * @retval none
  318. */
  319. void crm_clock_source_enable(crm_clock_source_type source, confirm_state new_state)
  320. {
  321. switch(source)
  322. {
  323. case CRM_CLOCK_SOURCE_HICK:
  324. CRM->ctrl_bit.hicken = new_state;
  325. break;
  326. case CRM_CLOCK_SOURCE_HEXT:
  327. CRM->ctrl_bit.hexten = new_state;
  328. break;
  329. case CRM_CLOCK_SOURCE_PLL:
  330. CRM->ctrl_bit.pllen = new_state;
  331. break;
  332. case CRM_CLOCK_SOURCE_LEXT:
  333. CRM->bpdc_bit.lexten = new_state;
  334. break;
  335. case CRM_CLOCK_SOURCE_LICK:
  336. CRM->ctrlsts_bit.licken = new_state;
  337. break;
  338. default:
  339. break;
  340. }
  341. }
  342. /**
  343. * @brief clear the crm reset flags
  344. * @param flag
  345. * this parameter can be one of the following values:
  346. * reset flag:
  347. * - CRM_NRST_RESET_FLAG
  348. * - CRM_POR_RESET_FLAG
  349. * - CRM_SW_RESET_FLAG
  350. * - CRM_WDT_RESET_FLAG
  351. * - CRM_WWDT_RESET_FLAG
  352. * - CRM_LOWPOWER_RESET_FLAG
  353. * - CRM_ALL_RESET_FLAG
  354. * interrupt flag:
  355. * - CRM_LICK_READY_INT_FLAG
  356. * - CRM_LEXT_READY_INT_FLAG
  357. * - CRM_HICK_READY_INT_FLAG
  358. * - CRM_HEXT_READY_INT_FLAG
  359. * - CRM_PLL_READY_INT_FLAG
  360. * - CRM_CLOCK_FAILURE_INT_FLAG
  361. * @retval none
  362. */
  363. void crm_flag_clear(uint32_t flag)
  364. {
  365. switch(flag)
  366. {
  367. case CRM_NRST_RESET_FLAG:
  368. case CRM_POR_RESET_FLAG:
  369. case CRM_SW_RESET_FLAG:
  370. case CRM_WDT_RESET_FLAG:
  371. case CRM_WWDT_RESET_FLAG:
  372. case CRM_LOWPOWER_RESET_FLAG:
  373. case CRM_ALL_RESET_FLAG:
  374. CRM->ctrlsts_bit.rstfc = TRUE;
  375. while(CRM->ctrlsts_bit.rstfc == TRUE);
  376. break;
  377. case CRM_LICK_READY_INT_FLAG:
  378. CRM->clkint_bit.lickstblfc = TRUE;
  379. break;
  380. case CRM_LEXT_READY_INT_FLAG:
  381. CRM->clkint_bit.lextstblfc = TRUE;
  382. break;
  383. case CRM_HICK_READY_INT_FLAG:
  384. CRM->clkint_bit.hickstblfc = TRUE;
  385. break;
  386. case CRM_HEXT_READY_INT_FLAG:
  387. CRM->clkint_bit.hextstblfc = TRUE;
  388. break;
  389. case CRM_PLL_READY_INT_FLAG:
  390. CRM->clkint_bit.pllstblfc = TRUE;
  391. break;
  392. case CRM_CLOCK_FAILURE_INT_FLAG:
  393. CRM->clkint_bit.cfdfc = TRUE;
  394. break;
  395. default:
  396. break;
  397. }
  398. }
  399. /**
  400. * @brief select rtc clock
  401. * @param value
  402. * this parameter can be one of the following values:
  403. * - CRM_RTC_CLOCK_LEXT
  404. * - CRM_RTC_CLOCK_LICK
  405. * - CRM_RTC_CLOCK_HEXT_DIV
  406. * @retval none
  407. */
  408. void crm_rtc_clock_select(crm_rtc_clock_type value)
  409. {
  410. CRM->bpdc_bit.rtcsel = value;
  411. }
  412. /**
  413. * @brief enable or disable rtc
  414. * @param new_state (TRUE or FALSE)
  415. * @retval none
  416. */
  417. void crm_rtc_clock_enable(confirm_state new_state)
  418. {
  419. CRM->bpdc_bit.rtcen = new_state;
  420. }
  421. /**
  422. * @brief set crm ahb division
  423. * @param value
  424. * this parameter can be one of the following values:
  425. * - CRM_AHB_DIV_1
  426. * - CRM_AHB_DIV_2
  427. * - CRM_AHB_DIV_4
  428. * - CRM_AHB_DIV_8
  429. * - CRM_AHB_DIV_16
  430. * - CRM_AHB_DIV_64
  431. * - CRM_AHB_DIV_128
  432. * - CRM_AHB_DIV_256
  433. * - CRM_AHB_DIV_512
  434. * @retval none
  435. */
  436. void crm_ahb_div_set(crm_ahb_div_type value)
  437. {
  438. CRM->cfg_bit.ahbdiv = value;
  439. }
  440. /**
  441. * @brief set crm apb1 division
  442. * @note the maximum frequency of APB1/APB2 clock is 120 MHz
  443. * @param value
  444. * this parameter can be one of the following values:
  445. * - CRM_APB1_DIV_1
  446. * - CRM_APB1_DIV_2
  447. * - CRM_APB1_DIV_4
  448. * - CRM_APB1_DIV_8
  449. * - CRM_APB1_DIV_16
  450. * @retval none
  451. */
  452. void crm_apb1_div_set(crm_apb1_div_type value)
  453. {
  454. CRM->cfg_bit.apb1div = value;
  455. }
  456. /**
  457. * @brief set crm apb2 division
  458. * @note the maximum frequency of APB1/APB2 clock is 120 MHz
  459. * @param value
  460. * this parameter can be one of the following values:
  461. * - CRM_APB2_DIV_1
  462. * - CRM_APB2_DIV_2
  463. * - CRM_APB2_DIV_4
  464. * - CRM_APB2_DIV_8
  465. * - CRM_APB2_DIV_16
  466. * @retval none
  467. */
  468. void crm_apb2_div_set(crm_apb2_div_type value)
  469. {
  470. CRM->cfg_bit.apb2div = value;
  471. }
  472. /**
  473. * @brief set crm adc division
  474. * @param value
  475. * this parameter can be one of the following values:
  476. * - CRM_ADC_DIV_2
  477. * - CRM_ADC_DIV_4
  478. * - CRM_ADC_DIV_6
  479. * - CRM_ADC_DIV_8
  480. * - CRM_ADC_DIV_12
  481. * - CRM_ADC_DIV_16
  482. * @retval none
  483. */
  484. void crm_adc_clock_div_set(crm_adc_div_type div_value)
  485. {
  486. CRM->cfg_bit.adcdiv_l = div_value & 0x03;
  487. CRM->cfg_bit.adcdiv_h = (div_value >> 2) & 0x01;
  488. }
  489. /**
  490. * @brief set crm usb division
  491. * @param value
  492. * this parameter can be one of the following values:
  493. * - CRM_USB_DIV_1_5
  494. * - CRM_USB_DIV_1
  495. * - CRM_USB_DIV_2_5
  496. * - CRM_USB_DIV_2
  497. * - CRM_USB_DIV_3_5
  498. * - CRM_USB_DIV_3
  499. * - CRM_USB_DIV_4
  500. * @retval none
  501. */
  502. void crm_usb_clock_div_set(crm_usb_div_type div_value)
  503. {
  504. CRM->cfg_bit.usbdiv_l = div_value & 0x03;
  505. CRM->cfg_bit.usbdiv_h = (div_value >> 2) & 0x01;
  506. }
  507. /**
  508. * @brief enable or disable clock failure detection
  509. * @param new_state (TRUE or FALSE)
  510. * @retval none
  511. */
  512. void crm_clock_failure_detection_enable(confirm_state new_state)
  513. {
  514. CRM->ctrl_bit.cfden = new_state;
  515. }
  516. /**
  517. * @brief battery powered domain software reset
  518. * @param new_state (TRUE or FALSE)
  519. * @retval none
  520. */
  521. void crm_battery_powered_domain_reset(confirm_state new_state)
  522. {
  523. CRM->bpdc_bit.bpdrst = new_state;
  524. }
  525. /**
  526. * @brief config crm pll
  527. * @param clock_source
  528. * this parameter can be one of the following values:
  529. * - CRM_PLL_SOURCE_HICK
  530. * - CRM_PLL_SOURCE_HEXT
  531. * - CRM_PLL_SOURCE_HEXT_DIV
  532. * @param mult_value (CRM_PLL_MULT_2~64)
  533. * @param pll_range
  534. * this parameter can be one of the following values:
  535. * - CRM_PLL_OUTPUT_RANGE_LE72MHZ
  536. * - CRM_PLL_OUTPUT_RANGE_GT72MHZ
  537. * @retval none
  538. */
  539. void crm_pll_config(crm_pll_clock_source_type clock_source, crm_pll_mult_type mult_value, crm_pll_output_range_type pll_range)
  540. {
  541. /* config pll clock source */
  542. if(clock_source == CRM_PLL_SOURCE_HICK)
  543. {
  544. CRM->cfg_bit.pllrcs = FALSE;
  545. CRM->misc1_bit.hickdiv = CRM_HICK48_NODIV;
  546. }
  547. else
  548. {
  549. CRM->cfg_bit.pllrcs = TRUE;
  550. if(CRM_PLL_SOURCE_HEXT == clock_source)
  551. {
  552. CRM->cfg_bit.pllhextdiv = FALSE;
  553. }
  554. else
  555. {
  556. CRM->cfg_bit.pllhextdiv = TRUE;
  557. }
  558. }
  559. /* config pll multiplication factor */
  560. CRM->cfg_bit.pllmult_l = (mult_value & 0x0F);
  561. CRM->cfg_bit.pllmult_h = ((mult_value & 0x30) >> 4);
  562. /* config pll output range */
  563. CRM->cfg_bit.pllrange = pll_range;
  564. }
  565. /**
  566. * @brief select system clock source
  567. * @param value
  568. * this parameter can be one of the following values:
  569. * - CRM_SCLK_HICK
  570. * - CRM_SCLK_HEXT
  571. * - CRM_SCLK_PLL
  572. * @retval none
  573. */
  574. void crm_sysclk_switch(crm_sclk_type value)
  575. {
  576. CRM->cfg_bit.sclksel = value;
  577. DUMMY_NOP();
  578. }
  579. /**
  580. * @brief indicate which clock source is used as system clock
  581. * @param none
  582. * @retval crm_sclk
  583. * this return can be one of the following values:
  584. * - CRM_SCLK_HICK
  585. * - CRM_SCLK_HEXT
  586. * - CRM_SCLK_PLL
  587. */
  588. crm_sclk_type crm_sysclk_switch_status_get(void)
  589. {
  590. return (crm_sclk_type)CRM->cfg_bit.sclksts;
  591. }
  592. /**
  593. * @brief get crm clocks freqency
  594. * @param clocks
  595. * - pointer to the crm_clocks_freq structure
  596. * @retval none
  597. */
  598. void crm_clocks_freq_get(crm_clocks_freq_type *clocks_struct)
  599. {
  600. uint32_t hext_prediv = 0, pll_mult = 0, pll_mult_h = 0, pll_clock_source = 0, temp = 0, div_value = 0;
  601. crm_sclk_type sclk_source;
  602. 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};
  603. static const uint8_t ahb_apb1_div_table[8] = {0, 0, 0, 0, 1, 2, 3, 4};
  604. static const uint8_t ahb_apb2_div_table[8] = {0, 0, 0, 0, 1, 2, 3, 4};
  605. static const uint8_t adc_div_table[8] = {2, 4, 6, 8, 2, 12, 8, 16};
  606. /* get sclk source */
  607. sclk_source = crm_sysclk_switch_status_get();
  608. switch(sclk_source)
  609. {
  610. case CRM_SCLK_HICK:
  611. if(((CRM->misc3_bit.hick_to_sclk) != RESET) && ((CRM->misc1_bit.hickdiv) != RESET))
  612. clocks_struct->sclk_freq = HICK_VALUE * 6;
  613. else
  614. clocks_struct->sclk_freq = HICK_VALUE;
  615. break;
  616. case CRM_SCLK_HEXT:
  617. clocks_struct->sclk_freq = HEXT_VALUE;
  618. break;
  619. case CRM_SCLK_PLL:
  620. pll_clock_source = CRM->cfg_bit.pllrcs;
  621. /* get multiplication factor */
  622. pll_mult = CRM->cfg_bit.pllmult_l;
  623. pll_mult_h = CRM->cfg_bit.pllmult_h;
  624. /* process high bits */
  625. if((pll_mult_h != 0U) || (pll_mult == 15U))
  626. {
  627. pll_mult += ((16U * pll_mult_h) + 1U);
  628. }
  629. else
  630. {
  631. pll_mult += 2U;
  632. }
  633. if (pll_clock_source == 0x00)
  634. {
  635. /* hick divided by 2 selected as pll clock entry */
  636. clocks_struct->sclk_freq = (HICK_VALUE >> 1) * pll_mult;
  637. }
  638. else
  639. {
  640. /* hext selected as pll clock entry */
  641. if (CRM->cfg_bit.pllhextdiv != RESET)
  642. {
  643. hext_prediv = CRM->misc3_bit.hextdiv;
  644. /* hext clock divided by 2 */
  645. clocks_struct->sclk_freq = (HEXT_VALUE / (hext_prediv + 2)) * pll_mult;
  646. }
  647. else
  648. {
  649. clocks_struct->sclk_freq = HEXT_VALUE * pll_mult;
  650. }
  651. }
  652. break;
  653. default:
  654. clocks_struct->sclk_freq = HICK_VALUE;
  655. break;
  656. }
  657. /* compute sclk, ahbclk, abp1clk apb2clk and adcclk frequencies */
  658. /* get ahb division */
  659. temp = CRM->cfg_bit.ahbdiv;
  660. div_value = sclk_ahb_div_table[temp];
  661. /* ahbclk frequency */
  662. clocks_struct->ahb_freq = clocks_struct->sclk_freq >> div_value;
  663. /* get apb1 division */
  664. temp = CRM->cfg_bit.apb1div;
  665. div_value = ahb_apb1_div_table[temp];
  666. /* apb1clk frequency */
  667. clocks_struct->apb1_freq = clocks_struct->ahb_freq >> div_value;
  668. /* get apb2 division */
  669. temp = CRM->cfg_bit.apb2div;
  670. div_value = ahb_apb2_div_table[temp];
  671. /* apb2clk frequency */
  672. clocks_struct->apb2_freq = clocks_struct->ahb_freq >> div_value;
  673. /* get adc division */
  674. temp = CRM->cfg_bit.adcdiv_h;
  675. temp = ((temp << 2) | (CRM->cfg_bit.adcdiv_l));
  676. div_value = adc_div_table[temp];
  677. /* adcclk clock frequency */
  678. clocks_struct->adc_freq = clocks_struct->apb2_freq / div_value;
  679. }
  680. /**
  681. * @brief set crm clkout
  682. * @param clkout
  683. * this parameter can be one of the following values:
  684. * - CRM_CLKOUT_NOCLK
  685. * - CRM_CLKOUT_LICK
  686. * - CRM_CLKOUT_LEXT
  687. * - CRM_CLKOUT_SCLK
  688. * - CRM_CLKOUT_HICK
  689. * - CRM_CLKOUT_HEXT
  690. * - CRM_CLKOUT_PLL_DIV_2
  691. * - CRM_CLKOUT_PLL_DIV_4
  692. * - CRM_CLKOUT_USB
  693. * - CRM_CLKOUT_ADC
  694. * @retval none
  695. */
  696. void crm_clock_out_set(crm_clkout_select_type clkout)
  697. {
  698. CRM->cfg_bit.clkout_sel = clkout & 0x7;
  699. CRM->misc1_bit.clkout_sel = (clkout >> 3) & 0x1;
  700. }
  701. /**
  702. * @brief config crm interrupt
  703. * @param int
  704. * this parameter can be any combination of the following values:
  705. * - CRM_LICK_STABLE_INT
  706. * - CRM_LEXT_STABLE_INT
  707. * - CRM_HICK_STABLE_INT
  708. * - CRM_HEXT_STABLE_INT
  709. * - CRM_PLL_STABLE_INT
  710. * @param new_state (TRUE or FALSE)
  711. * @retval none
  712. */
  713. void crm_interrupt_enable(uint32_t crm_int, confirm_state new_state)
  714. {
  715. if(new_state == TRUE)
  716. CRM->clkint |= crm_int;
  717. else
  718. CRM->clkint &= ~crm_int;
  719. }
  720. /**
  721. * @brief auto step clock switch enable
  722. * @param new_state (TRUE or FALSE)
  723. * @retval none
  724. */
  725. void crm_auto_step_mode_enable(confirm_state new_state)
  726. {
  727. if(new_state == TRUE)
  728. CRM->misc3_bit.auto_step_en = CRM_AUTO_STEP_MODE_ENABLE;
  729. else
  730. CRM->misc3_bit.auto_step_en = CRM_AUTO_STEP_MODE_DISABLE;
  731. }
  732. /**
  733. * @brief usbdev interrupt remapping control
  734. * @param int_remap
  735. * this parameter can be one of the following values:
  736. * - CRM_USB_INT19_INT20
  737. * - CRM_USB_INT73_INT74
  738. * @retval none
  739. */
  740. void crm_usb_interrupt_remapping_set(crm_usb_int_map_type int_remap)
  741. {
  742. CRM->intmap_bit.usbintmap = int_remap;
  743. }
  744. /**
  745. * @brief config hick divider select
  746. * @param value
  747. * this parameter can be one of the following values:
  748. * - CRM_HICK48_DIV6
  749. * - CRM_HICK48_NODIV
  750. * @retval none
  751. */
  752. void crm_hick_divider_select(crm_hick_div_6_type value)
  753. {
  754. CRM->misc1_bit.hickdiv = value;
  755. }
  756. /**
  757. * @brief hick as system clock frequency select
  758. * @param value
  759. * this parameter can be one of the following values:
  760. * - CRM_HICK_SCLK_8MHZ
  761. * - CRM_HICK_SCLK_48MHZ
  762. * @retval none
  763. */
  764. void crm_hick_sclk_frequency_select(crm_hick_sclk_frequency_type value)
  765. {
  766. crm_hick_divider_select(CRM_HICK48_NODIV);
  767. CRM->misc3_bit.hick_to_sclk = value;
  768. }
  769. /**
  770. * @brief usb 48 mhz clock source select
  771. * @param value
  772. * this parameter can be one of the following values:
  773. * - CRM_USB_CLOCK_SOURCE_PLL
  774. * - CRM_USB_CLOCK_SOURCE_HICK
  775. * @retval none
  776. */
  777. void crm_usb_clock_source_select(crm_usb_clock_source_type value)
  778. {
  779. if(value == CRM_USB_CLOCK_SOURCE_HICK)
  780. {
  781. crm_hick_sclk_frequency_select(CRM_HICK_SCLK_48MHZ);
  782. }
  783. CRM->misc3_bit.hick_to_usb = value;
  784. }
  785. /**
  786. * @brief enable or disable clkout direct to tmr10 channel 1
  787. * @param new_state (TRUE or FALSE)
  788. * @retval none
  789. */
  790. void crm_clkout_to_tmr10_enable(confirm_state new_state)
  791. {
  792. CRM->misc2_bit.clk_to_tmr = new_state;
  793. }
  794. /**
  795. * @brief set hext clock division
  796. * @param value
  797. * this parameter can be one of the following values:
  798. * - CRM_HEXT_DIV_2
  799. * - CRM_HEXT_DIV_3
  800. * - CRM_HEXT_DIV_4
  801. * - CRM_HEXT_DIV_5
  802. * @retval none
  803. */
  804. void crm_hext_clock_div_set(crm_hext_div_type value)
  805. {
  806. CRM->misc3_bit.hextdiv = value;
  807. }
  808. /**
  809. * @brief set crm clkout division
  810. * @param clkout_div
  811. * this parameter can be one of the following values:
  812. * - CRM_CLKOUT_DIV_1
  813. * - CRM_CLKOUT_DIV_2
  814. * - CRM_CLKOUT_DIV_4
  815. * - CRM_CLKOUT_DIV_8
  816. * - CRM_CLKOUT_DIV_16
  817. * - CRM_CLKOUT_DIV_64
  818. * - CRM_CLKOUT_DIV_128
  819. * - CRM_CLKOUT_DIV_256
  820. * - CRM_CLKOUT_DIV_512
  821. * @retval none
  822. */
  823. void crm_clkout_div_set(crm_clkout_div_type clkout_div)
  824. {
  825. CRM->misc1_bit.clkoutdiv = clkout_div;
  826. }
  827. #if defined (AT32F407xx)
  828. /**
  829. * @brief set emac output pulse width
  830. * @param width
  831. * this parameter can be one of the following values:
  832. * - CRM_EMAC_PULSE_125MS
  833. * - CRM_EMAC_PULSE_1SCLK
  834. * @retval none
  835. */
  836. void crm_emac_output_pulse_set(crm_emac_output_pulse_type width)
  837. {
  838. CRM->misc3_bit.emac_pps_sel = width;
  839. }
  840. #endif
  841. /**
  842. * @}
  843. */
  844. #endif
  845. /**
  846. * @}
  847. */
  848. /**
  849. * @}
  850. */