gd32f3x0_ctc.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. /*!
  2. \file gd32f3x0_ctc.c
  3. \brief CTC driver
  4. \version 2017-06-06, V1.0.0, firmware for GD32F3x0
  5. \version 2019-06-01, V2.0.0, firmware for GD32F3x0
  6. */
  7. /*
  8. Copyright (c) 2019, GigaDevice Semiconductor Inc.
  9. Redistribution and use in source and binary forms, with or without modification,
  10. are permitted provided that the following conditions are met:
  11. 1. Redistributions of source code must retain the above copyright notice, this
  12. list of conditions and the following disclaimer.
  13. 2. Redistributions in binary form must reproduce the above copyright notice,
  14. this list of conditions and the following disclaimer in the documentation
  15. and/or other materials provided with the distribution.
  16. 3. Neither the name of the copyright holder nor the names of its contributors
  17. may be used to endorse or promote products derived from this software without
  18. specific prior written permission.
  19. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  20. AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  21. WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  22. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
  23. INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  24. NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  25. PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  26. WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  27. ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
  28. OF SUCH DAMAGE.
  29. */
  30. #include "gd32f3x0_ctc.h"
  31. #define CTC_FLAG_MASK ((uint32_t)0x00000700U)
  32. /*!
  33. \brief reset CTC clock trim controller
  34. \param[in] none
  35. \param[out] none
  36. \retval none
  37. */
  38. void ctc_deinit(void)
  39. {
  40. /* reset CTC */
  41. rcu_periph_reset_enable(RCU_CTCRST);
  42. rcu_periph_reset_disable(RCU_CTCRST);
  43. }
  44. /*!
  45. \brief configure reference signal source polarity
  46. \param[in] polarity:
  47. only one parameter can be selected which is shown as below:
  48. \arg CTC_REFSOURCE_POLARITY_FALLING: reference signal source polarity is falling edge
  49. \arg CTC_REFSOURCE_POLARITY_RISING: reference signal source polarity is rising edge
  50. \param[out] none
  51. \retval none
  52. */
  53. void ctc_refsource_polarity_config(uint32_t polarity)
  54. {
  55. CTC_CTL1 &= (uint32_t)(~CTC_CTL1_REFPOL);
  56. CTC_CTL1 |= (uint32_t)polarity;
  57. }
  58. /*!
  59. \brief select reference signal source
  60. \param[in] refs:
  61. only one parameter can be selected which is shown as below:
  62. \arg CTC_REFSOURCE_GPIO: GPIO is selected
  63. \arg CTC_REFSOURCE_LXTAL: LXTAL is clock selected
  64. \arg CTC_REFSOURCE_USBSOF: USBSOF is selected
  65. \param[out] none
  66. \retval none
  67. */
  68. void ctc_refsource_signal_select(uint32_t refs)
  69. {
  70. CTC_CTL1 &= (uint32_t)(~CTC_CTL1_REFSEL);
  71. CTC_CTL1 |= (uint32_t)refs;
  72. }
  73. /*!
  74. \brief configure reference signal source prescaler
  75. \param[in] prescaler:
  76. only one parameter can be selected which is shown as below:
  77. \arg CTC_REFSOURCE_PSC_OFF: reference signal not divided
  78. \arg CTC_REFSOURCE_PSC_DIV2: reference signal divided by 2
  79. \arg CTC_REFSOURCE_PSC_DIV4: reference signal divided by 4
  80. \arg CTC_REFSOURCE_PSC_DIV8: reference signal divided by 8
  81. \arg CTC_REFSOURCE_PSC_DIV16: reference signal divided by 16
  82. \arg CTC_REFSOURCE_PSC_DIV32: reference signal divided by 32
  83. \arg CTC_REFSOURCE_PSC_DIV64: reference signal divided by 64
  84. \arg CTC_REFSOURCE_PSC_DIV128: reference signal divided by 128
  85. \param[out] none
  86. \retval none
  87. */
  88. void ctc_refsource_prescaler_config(uint32_t prescaler)
  89. {
  90. CTC_CTL1 &= (uint32_t)(~CTC_CTL1_REFPSC);
  91. CTC_CTL1 |= (uint32_t)prescaler;
  92. }
  93. /*!
  94. \brief configure clock trim base limit value
  95. \param[in] limit_value: 8-bit clock trim base limit value
  96. \arg 0x00-0xFF
  97. \param[out] none
  98. \retval none
  99. */
  100. void ctc_clock_limit_value_config(uint8_t limit_value)
  101. {
  102. CTC_CTL1 &= (uint32_t)(~CTC_CTL1_CKLIM);
  103. CTC_CTL1 |= CTL1_CKLIM(limit_value);
  104. }
  105. /*!
  106. \brief configure CTC counter reload value
  107. \param[in] reload_value: 16-bit CTC counter reload value
  108. \arg 0x0000-0xFFFF
  109. \param[out] none
  110. \retval none
  111. */
  112. void ctc_counter_reload_value_config(uint16_t reload_value)
  113. {
  114. CTC_CTL1 &= (uint32_t)(~CTC_CTL1_RLVALUE);
  115. CTC_CTL1 |= (uint32_t)reload_value;
  116. }
  117. /*!
  118. \brief enable CTC trim counter
  119. \param[in] none
  120. \param[out] none
  121. \retval none
  122. */
  123. void ctc_counter_enable(void)
  124. {
  125. CTC_CTL0 |= (uint32_t)CTC_CTL0_CNTEN;
  126. }
  127. /*!
  128. \brief disable CTC trim counter
  129. \param[in] none
  130. \param[out] none
  131. \retval none
  132. */
  133. void ctc_counter_disable(void)
  134. {
  135. CTC_CTL0 &= (uint32_t)(~CTC_CTL0_CNTEN);
  136. }
  137. /*!
  138. \brief configure the IRC48M trim value
  139. \param[in] trim_value: 8-bit IRC48M trim value
  140. \arg 0x00-0x3F
  141. \param[out] none
  142. \retval none
  143. */
  144. void ctc_irc48m_trim_value_config(uint8_t trim_value)
  145. {
  146. /* clear TRIMVALUE bits */
  147. CTC_CTL0 &= (~(uint32_t)CTC_CTL0_TRIMVALUE);
  148. /* set TRIMVALUE bits */
  149. CTC_CTL0 |= CTL0_TRIMVALUE(trim_value);
  150. }
  151. /*!
  152. \brief generate software reference source sync pulse
  153. \param[in] none
  154. \param[out] none
  155. \retval none
  156. */
  157. void ctc_software_refsource_pulse_generate(void)
  158. {
  159. CTC_CTL0 |= (uint32_t)CTC_CTL0_SWREFPUL;
  160. }
  161. /*!
  162. \brief configure hardware automatically trim mode
  163. \param[in] hardmode:
  164. only one parameter can be selected which is shown as below:
  165. \arg CTC_HARDWARE_TRIM_MODE_ENABLE: hardware automatically trim mode enable
  166. \arg CTC_HARDWARE_TRIM_MODE_DISABLE: hardware automatically trim mode disable
  167. \param[out] none
  168. \retval none
  169. */
  170. void ctc_hardware_trim_mode_config(uint32_t hardmode)
  171. {
  172. CTC_CTL0 &= (uint32_t)(~CTC_CTL0_AUTOTRIM);
  173. CTC_CTL0 |= (uint32_t)hardmode;
  174. }
  175. /*!
  176. \brief read CTC counter capture value when reference sync pulse occurred
  177. \param[in] none
  178. \param[out] none
  179. \retval the 16-bit CTC counter capture value
  180. */
  181. uint16_t ctc_counter_capture_value_read(void)
  182. {
  183. uint16_t capture_value = 0U;
  184. capture_value = (uint16_t)GET_STAT_REFCAP(CTC_STAT);
  185. return (capture_value);
  186. }
  187. /*!
  188. \brief read CTC trim counter direction when reference sync pulse occurred
  189. \param[in] none
  190. \param[out] none
  191. \retval FlagStatus: SET or RESET
  192. \arg SET: CTC trim counter direction is down-counting
  193. \arg RESET: CTC trim counter direction is up-counting
  194. */
  195. FlagStatus ctc_counter_direction_read(void)
  196. {
  197. FlagStatus ret_status = RESET;
  198. if(RESET != (CTC_STAT & CTC_STAT_REFDIR)){
  199. ret_status = SET;
  200. }
  201. return ret_status;
  202. }
  203. /*!
  204. \brief read CTC counter reload value
  205. \param[in] none
  206. \param[out] none
  207. \retval the 16-bit CTC counter reload value
  208. */
  209. uint16_t ctc_counter_reload_value_read(void)
  210. {
  211. uint16_t reload_value = 0U;
  212. reload_value = (uint16_t)(CTC_CTL1 & CTC_CTL1_RLVALUE);
  213. return (reload_value);
  214. }
  215. /*!
  216. \brief read the IRC48M trim value
  217. \param[in] none
  218. \param[out] none
  219. \retval the 8-bit IRC48M trim value
  220. */
  221. uint8_t ctc_irc48m_trim_value_read(void)
  222. {
  223. uint8_t trim_value = 0U;
  224. trim_value = (uint8_t)GET_CTL0_TRIMVALUE(CTC_CTL0);
  225. return (trim_value);
  226. }
  227. /*!
  228. \brief enable the CTC interrupt
  229. \param[in] interrupt: CTC interrupt enable
  230. one or more parameters can be selected which are shown as below:
  231. \arg CTC_INT_CKOK: clock trim OK interrupt enable
  232. \arg CTC_INT_CKWARN: clock trim warning interrupt enable
  233. \arg CTC_INT_ERR: error interrupt enable
  234. \arg CTC_INT_EREF: expect reference interrupt enable
  235. \param[out] none
  236. \retval none
  237. */
  238. void ctc_interrupt_enable(uint32_t interrupt)
  239. {
  240. CTC_CTL0 |= (uint32_t)interrupt;
  241. }
  242. /*!
  243. \brief disable the CTC interrupt
  244. \param[in] interrupt: CTC interrupt enable source
  245. one or more parameters can be selected which are shown as below:
  246. \arg CTC_INT_CKOK: clock trim OK interrupt enable
  247. \arg CTC_INT_CKWARN: clock trim warning interrupt enable
  248. \arg CTC_INT_ERR: error interrupt enable
  249. \arg CTC_INT_EREF: expect reference interrupt enable
  250. \param[out] none
  251. \retval none
  252. */
  253. void ctc_interrupt_disable(uint32_t interrupt)
  254. {
  255. CTC_CTL0 &= (uint32_t)(~(interrupt));
  256. }
  257. /*!
  258. \brief get CTC flag
  259. \param[in] flag: the CTC flag
  260. only one parameter can be selected which is shown as below:
  261. \arg CTC_FLAG_CKOK: clock trim OK flag
  262. \arg CTC_FLAG_CKWARN: clock trim warning flag
  263. \arg CTC_FLAG_ERR: error flag
  264. \arg CTC_FLAG_EREF: expect reference flag
  265. \arg CTC_FLAG_CKERR: clock trim error bit
  266. \arg CTC_FLAG_REFMISS: reference sync pulse miss
  267. \arg CTC_FLAG_TRIMERR: trim value error bit
  268. \param[out] none
  269. \retval FlagStatus: SET or RESET
  270. */
  271. FlagStatus ctc_flag_get(uint32_t flag)
  272. {
  273. FlagStatus ret_status = RESET;
  274. if(RESET != (CTC_STAT & flag)){
  275. ret_status = SET;
  276. }
  277. return ret_status;
  278. }
  279. /*!
  280. \brief clear CTC flag
  281. \param[in] flag: the CTC flag
  282. only one parameter can be selected which is shown as below:
  283. \arg CTC_FLAG_CKOK: clock trim OK flag
  284. \arg CTC_FLAG_CKWARN: clock trim warning flag
  285. \arg CTC_FLAG_ERR: error flag
  286. \arg CTC_FLAG_EREF: expect reference flag
  287. \arg CTC_FLAG_CKERR: clock trim error bit
  288. \arg CTC_FLAG_REFMISS: reference sync pulse miss
  289. \arg CTC_FLAG_TRIMERR: trim value error bit
  290. \param[out] none
  291. \retval none
  292. */
  293. void ctc_flag_clear(uint32_t flag)
  294. {
  295. if(flag & CTC_FLAG_MASK){
  296. CTC_INTC |= CTC_INTC_ERRIC;
  297. }else{
  298. CTC_INTC |= flag;
  299. }
  300. }
  301. /*!
  302. \brief get CTC interrupt flag
  303. \param[in] interrupt: the CTC interrupt flag
  304. only one parameter can be selected which is shown as below:
  305. \arg CTC_INT_FLAG_CKOK: clock trim OK interrupt
  306. \arg CTC_INT_FLAG_CKWARN: clock trim warning interrupt
  307. \arg CTC_INT_FLAG_ERR: error interrupt
  308. \arg CTC_INT_FLAG_EREF: expect reference interrupt
  309. \arg CTC_INT_FLAG_CKERR: clock trim error bit interrupt
  310. \arg CTC_INT_FLAG_REFMISS: reference sync pulse miss interrupt
  311. \arg CTC_INT_FLAG_TRIMERR: trim value error interrupt
  312. \param[out] none
  313. \retval FlagStatus: SET or RESET
  314. */
  315. FlagStatus ctc_interrupt_flag_get(uint32_t interrupt)
  316. {
  317. uint32_t ctc_int = 0U, intenable = 0U;
  318. FlagStatus ret_status = RESET;
  319. if(interrupt & CTC_FLAG_MASK){
  320. intenable = CTC_CTL0 & CTC_INT_ERR;
  321. }else{
  322. intenable = CTC_CTL0 & interrupt;
  323. }
  324. ctc_int = CTC_STAT & interrupt;
  325. if(ctc_int && intenable){
  326. ret_status = SET;
  327. }
  328. return ret_status;
  329. }
  330. /*!
  331. \brief clear CTC interrupt flag
  332. \param[in] interrupt: the CTC interrupt flag
  333. only one parameter can be selected which is shown as below:
  334. \arg CTC_INT_FLAG_CKOK: clock trim OK interrupt
  335. \arg CTC_INT_FLAG_CKWARN: clock trim warning interrupt
  336. \arg CTC_INT_FLAG_ERR: error interrupt
  337. \arg CTC_INT_FLAG_EREF: expect reference interrupt
  338. \arg CTC_INT_FLAG_CKERR: clock trim error bit interrupt
  339. \arg CTC_INT_FLAG_REFMISS: reference sync pulse miss interrupt
  340. \arg CTC_INT_FLAG_TRIMERR: trim value error interrupt
  341. \param[out] none
  342. \retval none
  343. */
  344. void ctc_interrupt_flag_clear(uint32_t interrupt)
  345. {
  346. if(interrupt & CTC_FLAG_MASK){
  347. CTC_INTC |= CTC_INTC_ERRIC;
  348. }else{
  349. CTC_INTC |= interrupt;
  350. }
  351. }