gd32f30x_ctc.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. /*!
  2. \file gd32f30x_ctc.c
  3. \brief CTC driver
  4. */
  5. /*
  6. Copyright (C) 2017 GigaDevice
  7. 2017-02-10, V1.0.1, firmware for GD32F30x
  8. */
  9. #include "gd32f30x_ctc.h"
  10. #define CTC_FLAG_MASK ((uint32_t)0x00000700U)
  11. /*!
  12. \brief reset CTC clock trim controller
  13. \param[in] none
  14. \param[out] none
  15. \retval none
  16. */
  17. void ctc_deinit(void)
  18. {
  19. /* reset CTC */
  20. rcu_periph_reset_enable(RCU_CTCRST);
  21. rcu_periph_reset_disable(RCU_CTCRST);
  22. }
  23. /*!
  24. \brief configure the IRC48M trim value
  25. \param[in] ctc_trim_value: 8-bit IRC48M trim value
  26. \param[out] none
  27. \retval none
  28. */
  29. void ctc_irc48m_trim_value_config(uint8_t ctc_trim_value)
  30. {
  31. /* clear TRIMVALUE bits */
  32. CTC_CTL0 &= (~(uint32_t)CTC_CTL0_TRIMVALUE);
  33. /* set TRIMVALUE bits */
  34. CTC_CTL0 |= ((uint32_t)ctc_trim_value << 8);
  35. }
  36. /*!
  37. \brief generate software reference source sync pulse
  38. \param[in] none
  39. \param[out] none
  40. \retval none
  41. */
  42. void ctc_software_refsource_pulse_generate(void)
  43. {
  44. CTC_CTL0 |= (uint32_t)CTC_CTL0_SWREFPUL;
  45. }
  46. /*!
  47. \brief configure hardware automatically trim mode
  48. \param[in] ctc_hardmode:
  49. \arg CTC_HARDWARE_TRIM_MODE_ENABLE: hardware automatically trim mode enable
  50. \arg CTC_HARDWARE_TRIM_MODE_DISABLE: hardware automatically trim mode disable
  51. \param[out] none
  52. \retval none
  53. */
  54. void ctc_hardware_trim_mode_config(uint32_t ctc_hardmode)
  55. {
  56. CTC_CTL0 &= (uint32_t)(~CTC_CTL0_AUTOTRIM);
  57. CTC_CTL0 |= (uint32_t)ctc_hardmode;
  58. }
  59. /*!
  60. \brief enable CTC trim counter
  61. \param[in] none
  62. \param[out] none
  63. \retval none
  64. */
  65. void ctc_counter_enable(void)
  66. {
  67. CTC_CTL0 |= (uint32_t)CTC_CTL0_CNTEN;
  68. }
  69. /*!
  70. \brief disable CTC trim counter
  71. \param[in] none
  72. \param[out] none
  73. \retval none
  74. */
  75. void ctc_counter_disable(void)
  76. {
  77. CTC_CTL0 &= (uint32_t)(~CTC_CTL0_CNTEN);
  78. }
  79. /*!
  80. \brief configure reference signal source polarity
  81. \param[in] ctc_polarity:
  82. \arg CTC_REFSOURCE_POLARITY_FALLING: reference signal source polarity is falling edge
  83. \arg CTC_REFSOURCE_POLARITY_RISING: reference signal source polarity is rising edge
  84. \param[out] none
  85. \retval none
  86. */
  87. void ctc_refsource_polarity_config(uint32_t ctc_polarity)
  88. {
  89. CTC_CTL1 &= (uint32_t)(~CTC_CTL1_REFPOL);
  90. CTC_CTL1 |= (uint32_t)ctc_polarity;
  91. }
  92. /*!
  93. \brief select reference signal source
  94. \param[in] ctc_refs:
  95. \arg CTC_REFSOURCE_GPIO: GPIO is selected
  96. \arg CTC_REFSOURCE_LXTAL: LXTAL is clock selected
  97. \arg CTC_REFSOURCE_USBSOF: USBSOF is selected
  98. \param[out] none
  99. \retval none
  100. */
  101. void ctc_refsource_signal_select(uint32_t ctc_refs)
  102. {
  103. CTC_CTL1 &= (uint32_t)(~CTC_CTL1_REFSEL);
  104. CTC_CTL1 |= (uint32_t)ctc_refs;
  105. }
  106. /*!
  107. \brief configure reference signal source prescaler
  108. \param[in] ctc_prescaler:
  109. \arg CTC_REFSOURCE_PSC_OFF: reference signal not divided
  110. \arg CTC_REFSOURCE_PSC_DIV2: reference signal divided by 2
  111. \arg CTC_REFSOURCE_PSC_DIV4: reference signal divided by 4
  112. \arg CTC_REFSOURCE_PSC_DIV8: reference signal divided by 8
  113. \arg CTC_REFSOURCE_PSC_DIV16: reference signal divided by 16
  114. \arg CTC_REFSOURCE_PSC_DIV32: reference signal divided by 32
  115. \arg CTC_REFSOURCE_PSC_DIV64: reference signal divided by 64
  116. \arg CTC_REFSOURCE_PSC_DIV128: reference signal divided by 128
  117. \param[out] none
  118. \retval none
  119. */
  120. void ctc_refsource_prescaler_config(uint32_t ctc_prescaler)
  121. {
  122. CTC_CTL1 &= (uint32_t)(~CTC_CTL1_REFPSC);
  123. CTC_CTL1 |= (uint32_t)ctc_prescaler;
  124. }
  125. /*!
  126. \brief configure clock trim base limit value
  127. \param[in] ctc_limit_value: 8-bit clock trim base limit value
  128. \param[out] none
  129. \retval none
  130. */
  131. void ctc_clock_limit_value_config(uint8_t ctc_limit_value)
  132. {
  133. CTC_CTL1 &= (uint32_t)(~CTC_CTL1_CKLIM);
  134. CTC_CTL1 |= (uint32_t)((uint32_t)ctc_limit_value << 16);
  135. }
  136. /*!
  137. \brief configure CTC counter reload value
  138. \param[in] ctc_reload_value: 16-bit CTC counter reload value
  139. \param[out] none
  140. \retval none
  141. */
  142. void ctc_counter_reload_value_config(uint16_t ctc_reload_value)
  143. {
  144. CTC_CTL1 &= (uint32_t)(~CTC_CTL1_RLVALUE);
  145. CTC_CTL1 |= (uint32_t)ctc_reload_value;
  146. }
  147. /*!
  148. \brief read CTC counter capture value when reference sync pulse occurred
  149. \param[in] none
  150. \param[out] none
  151. \retval the 16-bit CTC counter capture value
  152. */
  153. uint16_t ctc_counter_capture_value_read(void)
  154. {
  155. uint16_t capture_value = 0U;
  156. capture_value = (uint16_t)((CTC_STAT & CTC_STAT_REFCAP)>> 16);
  157. return (capture_value);
  158. }
  159. /*!
  160. \brief read CTC trim counter direction when reference sync pulse occurred
  161. \param[in] none
  162. \param[out] none
  163. \retval FlagStatus: SET or RESET
  164. \arg SET: CTC trim counter direction is down-counting
  165. \arg RESET: CTC trim counter direction is up-counting
  166. */
  167. FlagStatus ctc_counter_direction_read(void)
  168. {
  169. if(RESET != (CTC_STAT & CTC_STAT_REFDIR)){
  170. return SET;
  171. }else{
  172. return RESET;
  173. }
  174. }
  175. /*!
  176. \brief read CTC counter reload value
  177. \param[in] none
  178. \param[out] none
  179. \retval the 16-bit CTC counter reload value
  180. */
  181. uint16_t ctc_counter_reload_value_read(void)
  182. {
  183. uint16_t reload_value = 0U;
  184. reload_value = (uint16_t)(CTC_CTL1 & CTC_CTL1_RLVALUE);
  185. return (reload_value);
  186. }
  187. /*!
  188. \brief read the IRC48M trim value
  189. \param[in] none
  190. \param[out] none
  191. \retval the 8-bit IRC48M trim value
  192. */
  193. uint8_t ctc_irc48m_trim_value_read(void)
  194. {
  195. uint8_t trim_value = 0U;
  196. trim_value = (uint8_t)((CTC_CTL0 & CTC_CTL0_TRIMVALUE) >> 8);
  197. return (trim_value);
  198. }
  199. /*!
  200. \brief enable the CTC interrupt
  201. \param[in] ctc_interrupt: CTC interrupt enable
  202. \arg CTC_INT_CKOK: clock trim OK interrupt enable
  203. \arg CTC_INT_CKWARN: clock trim warning interrupt enable
  204. \arg CTC_INT_ERR: error interrupt enable
  205. \arg CTC_INT_EREF: expect reference interrupt enable
  206. \param[out] none
  207. \retval none
  208. */
  209. void ctc_interrupt_enable(uint32_t ctc_interrupt)
  210. {
  211. CTC_CTL0 |= (uint32_t)ctc_interrupt;
  212. }
  213. /*!
  214. \brief disable the CTC interrupt
  215. \param[in] ctc_interrupt: CTC interrupt enable source
  216. \arg CTC_INT_CKOK: clock trim OK interrupt enable
  217. \arg CTC_INT_CKWARN: clock trim warning interrupt enable
  218. \arg CTC_INT_ERR: error interrupt enable
  219. \arg CTC_INT_EREF: expect reference interrupt enable
  220. \param[out] none
  221. \retval none
  222. */
  223. void ctc_interrupt_disable(uint32_t ctc_interrupt)
  224. {
  225. CTC_CTL0 &= (uint32_t)(~ctc_interrupt);
  226. }
  227. /*!
  228. \brief get CTC interrupt flag
  229. \param[in] ctc_interrupt: the CTC interrupt flag
  230. \arg CTC_INT_FLAG_CKOK: clock trim OK interrupt
  231. \arg CTC_INT_FLAG_CKWARN: clock trim warning interrupt
  232. \arg CTC_INT_FLAG_ERR: error interrupt
  233. \arg CTC_INT_FLAG_EREF: expect reference interrupt
  234. \arg CTC_INT_FLAG_CKERR: clock trim error bit interrupt
  235. \arg CTC_INT_FLAG_REFMISS: reference sync pulse miss interrupt
  236. \arg CTC_INT_FLAG_TRIMERR: trim value error interrupt
  237. \param[out] none
  238. \retval FlagStatus: SET or RESET
  239. */
  240. FlagStatus ctc_interrupt_flag_get(uint32_t ctc_interrupt)
  241. {
  242. uint32_t interrupt = 0U, intenable = 0U;
  243. if(ctc_interrupt & CTC_FLAG_MASK){
  244. intenable = CTC_CTL0 & CTC_CTL0_ERRIE;
  245. }else{
  246. intenable = CTC_CTL0 & ctc_interrupt;
  247. }
  248. interrupt = CTC_STAT & ctc_interrupt;
  249. if(interrupt && intenable){
  250. return SET;
  251. }else{
  252. return RESET;
  253. }
  254. }
  255. /*!
  256. \brief clear CTC interrupt flag
  257. \param[in] ctc_interrupt: the CTC interrupt flag
  258. \arg CTC_INT_FLAG_CKOK: clock trim OK interrupt
  259. \arg CTC_INT_FLAG_CKWARN: clock trim warning interrupt
  260. \arg CTC_INT_FLAG_ERR: error interrupt
  261. \arg CTC_INT_FLAG_EREF: expect reference interrupt
  262. \arg CTC_INT_FLAG_CKERR: clock trim error bit interrupt
  263. \arg CTC_INT_FLAG_REFMISS: reference sync pulse miss interrupt
  264. \arg CTC_INT_FLAG_TRIMERR: trim value error interrupt
  265. \param[out] none
  266. \retval none
  267. */
  268. void ctc_interrupt_flag_clear(uint32_t ctc_interrupt)
  269. {
  270. if(ctc_interrupt & CTC_FLAG_MASK){
  271. CTC_INTC |= CTC_INTC_ERRIC;
  272. }else{
  273. CTC_INTC |= ctc_interrupt;
  274. }
  275. }
  276. /*!
  277. \brief get CTC flag
  278. \param[in] ctc_flag: the CTC flag
  279. \arg CTC_FLAG_CKOK: clock trim OK flag
  280. \arg CTC_FLAG_CKWARN: clock trim warning flag
  281. \arg CTC_FLAG_ERR: error flag
  282. \arg CTC_FLAG_EREF: expect reference flag
  283. \arg CTC_FLAG_CKERR: clock trim error bit
  284. \arg CTC_FLAG_REFMISS: reference sync pulse miss
  285. \arg CTC_FLAG_TRIMERR: trim value error bit
  286. \param[out] none
  287. \retval FlagStatus: SET or RESET
  288. */
  289. FlagStatus ctc_flag_get(uint32_t ctc_flag)
  290. {
  291. if(RESET != (CTC_STAT & ctc_flag)){
  292. return SET;
  293. }else{
  294. return RESET;
  295. }
  296. }
  297. /*!
  298. \brief clear CTC flag
  299. \param[in] ctc_flag: the CTC flag
  300. \arg CTC_FLAG_CKOK: clock trim OK flag
  301. \arg CTC_FLAG_CKWARN: clock trim warning flag
  302. \arg CTC_FLAG_ERR: error flag
  303. \arg CTC_FLAG_EREF: expect reference flag
  304. \arg CTC_FLAG_CKERR: clock trim error bit
  305. \arg CTC_FLAG_REFMISS: reference sync pulse miss
  306. \arg CTC_FLAG_TRIMERR: trim value error bit
  307. \param[out] none
  308. \retval none
  309. */
  310. void ctc_flag_clear(uint32_t ctc_flag)
  311. {
  312. if(ctc_flag & CTC_FLAG_MASK){
  313. CTC_INTC |= CTC_INTC_ERRIC;
  314. }else{
  315. CTC_INTC |= ctc_flag;
  316. }
  317. }