gd32f30x_bkp.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. /*!
  2. \file gd32f30x_bkp.c
  3. \brief BKP driver
  4. */
  5. /*
  6. Copyright (C) 2017 GigaDevice
  7. 2017-02-10, V1.0.2, firmware for GD32F30x
  8. */
  9. #include "gd32f30x_bkp.h"
  10. #define TAMPER_FLAG_SHIFT ((uint8_t)8U)
  11. /*!
  12. \brief reset BKP registers
  13. \param[in] none
  14. \param[out] none
  15. \retval none
  16. */
  17. void bkp_deinit(void)
  18. {
  19. /* reset BKP domain register*/
  20. rcu_bkp_reset_enable();
  21. rcu_bkp_reset_disable();
  22. }
  23. /*!
  24. \brief write BKP data register
  25. \param[in] register_number: refer to bkp_data_register_enum, only one parameter can be selected
  26. \arg BKP_DATA_x(x = 0..41): bkp data register number x
  27. \param[in] data: the data to be write in BKP data register
  28. \param[out] none
  29. \retval none
  30. */
  31. void bkp_write_data(bkp_data_register_enum register_number, uint16_t data)
  32. {
  33. if((register_number >= BKP_DATA_10) && (register_number <= BKP_DATA_41)){
  34. BKP_DATA10_41(register_number-1U) = data;
  35. }else if((register_number >= BKP_DATA_0) && (register_number <= BKP_DATA_9)){
  36. BKP_DATA0_9(register_number-1U) = data;
  37. }else{
  38. /* illegal parameters */
  39. }
  40. }
  41. /*!
  42. \brief read BKP data register
  43. \param[in] register_number: refer to bkp_data_register_enum, only one parameter can be selected
  44. \arg BKP_DATA_x(x = 0..41): bkp data register number x
  45. \param[out] none
  46. \retval data of BKP data register
  47. */
  48. uint16_t bkp_read_data(bkp_data_register_enum register_number)
  49. {
  50. uint16_t data = 0U;
  51. /* get the data from the BKP data register */
  52. if((register_number >= BKP_DATA_10) && (register_number <= BKP_DATA_41)){
  53. data = BKP_DATA10_41(register_number-1U);
  54. }else if((register_number >= BKP_DATA_0) && (register_number <= BKP_DATA_9)){
  55. data = BKP_DATA0_9(register_number-1U);
  56. }else{
  57. /* illegal parameters */
  58. }
  59. return data;
  60. }
  61. /*!
  62. \brief enable RTC clock calibration output
  63. \param[in] none
  64. \param[out] none
  65. \retval none
  66. */
  67. void bkp_rtc_calibration_output_enable(void)
  68. {
  69. BKP_OCTL |= (uint16_t)BKP_OCTL_COEN;
  70. }
  71. /*!
  72. \brief disable RTC clock calibration output
  73. \param[in] none
  74. \param[out] none
  75. \retval none
  76. */
  77. void bkp_rtc_calibration_output_disable(void)
  78. {
  79. BKP_OCTL &= (uint16_t)~BKP_OCTL_COEN;
  80. }
  81. /*!
  82. \brief enable RTC alarm or second signal output
  83. \param[in] none
  84. \param[out] none
  85. \retval none
  86. */
  87. void bkp_rtc_signal_output_enable(void)
  88. {
  89. BKP_OCTL |= (uint16_t)BKP_OCTL_ASOEN;
  90. }
  91. /*!
  92. \brief disable RTC alarm or second signal output
  93. \param[in] none
  94. \param[out] none
  95. \retval none
  96. */
  97. void bkp_rtc_signal_output_disable(void)
  98. {
  99. BKP_OCTL &= (uint16_t)~BKP_OCTL_ASOEN;
  100. }
  101. /*!
  102. \brief select RTC output
  103. \param[in] outputsel: RTC output selection
  104. \arg RTC_OUTPUT_ALARM_PULSE: RTC alarm pulse is selected as the RTC output
  105. \arg RTC_OUTPUT_SECOND_PULSE: RTC second pulse is selected as the RTC output
  106. \param[out] none
  107. \retval none
  108. */
  109. void bkp_rtc_output_select(uint16_t outputsel)
  110. {
  111. uint16_t ctl = 0U;
  112. ctl = BKP_OCTL;
  113. ctl &= (uint16_t)~BKP_OCTL_ROSEL;
  114. ctl |= outputsel;
  115. BKP_OCTL = ctl;
  116. }
  117. /*!
  118. \brief select RTC clock output
  119. \param[in] clocksel: RTC clock output selection
  120. \arg RTC_CLOCK_DIV_64: RTC clock div 64
  121. \arg RTC_CLOCK_DIV_1: RTC clock
  122. \param[out] none
  123. \retval none
  124. */
  125. void bkp_rtc_clock_output_select(uint16_t clocksel)
  126. {
  127. uint16_t ctl = 0U;
  128. ctl = BKP_OCTL;
  129. ctl &= (uint16_t)~BKP_OCTL_CCOSEL;
  130. ctl |= clocksel;
  131. BKP_OCTL = ctl;
  132. }
  133. /*!
  134. \brief RTC clock calibration direction
  135. \param[in] direction: RTC clock calibration direction
  136. \arg RTC_CLOCK_SLOWED_DOWN: RTC clock slow down
  137. \arg RTC_CLOCK_SPEED_UP: RTC clock speed up
  138. \param[out] none
  139. \retval none
  140. */
  141. void bkp_rtc_clock_calibration_direction(uint16_t direction)
  142. {
  143. uint16_t ctl = 0U;
  144. ctl = BKP_OCTL;
  145. ctl &= (uint16_t)~BKP_OCTL_CALDIR;
  146. ctl |= direction;
  147. BKP_OCTL = ctl;
  148. }
  149. /*!
  150. \brief set RTC clock calibration value
  151. \param[in] value: RTC clock calibration value
  152. \arg 0x00 - 0x7F
  153. \param[out] none
  154. \retval none
  155. */
  156. void bkp_rtc_calibration_value_set(uint8_t value)
  157. {
  158. uint16_t ctl;
  159. ctl = BKP_OCTL;
  160. ctl &= (uint16_t)OCTL_RCCV(0);
  161. ctl |= (uint16_t)OCTL_RCCV(value);
  162. BKP_OCTL = ctl;
  163. }
  164. /*!
  165. \brief enable tamper detection
  166. \param[in] none
  167. \param[out] none
  168. \retval none
  169. */
  170. void bkp_tamper_detection_enable(void)
  171. {
  172. BKP_TPCTL |= (uint16_t)BKP_TPCTL_TPEN;
  173. }
  174. /*!
  175. \brief disable tamper detection
  176. \param[in] none
  177. \param[out] none
  178. \retval none
  179. */
  180. void bkp_tamper_detection_disable(void)
  181. {
  182. BKP_TPCTL &= (uint16_t)~BKP_TPCTL_TPEN;
  183. }
  184. /*!
  185. \brief set tamper pin active level
  186. \param[in] level: tamper active level
  187. \arg TAMPER_PIN_ACTIVE_HIGH: the tamper pin is active high
  188. \arg TAMPER_PIN_ACTIVE_LOW: the tamper pin is active low
  189. \param[out] none
  190. \retval none
  191. */
  192. void bkp_tamper_active_level_set(uint16_t level)
  193. {
  194. uint16_t ctl = 0U;
  195. ctl = BKP_TPCTL;
  196. ctl &= (uint16_t)~BKP_TPCTL_TPAL;
  197. ctl |= level;
  198. BKP_TPCTL = ctl;
  199. }
  200. /*!
  201. \brief enable tamper interrupt
  202. \param[in] none
  203. \param[out] none
  204. \retval none
  205. */
  206. void bkp_tamper_interrupt_enable(void)
  207. {
  208. BKP_TPCS |= (uint16_t)BKP_TPCS_TPIE;
  209. }
  210. /*!
  211. \brief disable tamper interrupt
  212. \param[in] none
  213. \param[out] none
  214. \retval none
  215. */
  216. void bkp_tamper_interrupt_disable(void)
  217. {
  218. BKP_TPCS &= (uint16_t)~BKP_TPCS_TPIE;
  219. }
  220. /*!
  221. \brief get bkp flag state
  222. \param[in] flag
  223. \arg BKP_FLAG_TAMPER: tamper event flag
  224. \param[out] none
  225. \retval FlagStatus: SET or RESET
  226. */
  227. FlagStatus bkp_flag_get(uint16_t flag)
  228. {
  229. if(RESET != (BKP_TPCS & flag)){
  230. return SET;
  231. }else{
  232. return RESET;
  233. }
  234. }
  235. /*!
  236. \brief clear bkp flag state
  237. \param[in] flag
  238. \arg BKP_FLAG_TAMPER: tamper event flag
  239. \param[out] none
  240. \retval none
  241. */
  242. void bkp_flag_clear(uint16_t flag)
  243. {
  244. BKP_TPCS |= (uint16_t)(flag >> TAMPER_FLAG_SHIFT);
  245. }
  246. /*!
  247. \brief get bkp interrupt flag state
  248. \param[in] flag
  249. \arg BKP_INT_FLAG_TAMPER: tamper interrupt flag
  250. \param[out] none
  251. \retval FlagStatus: SET or RESET
  252. */
  253. FlagStatus bkp_interrupt_flag_get(uint16_t flag)
  254. {
  255. if(RESET != (BKP_TPCS & flag)){
  256. return SET;
  257. }else{
  258. return RESET;
  259. }
  260. }
  261. /*!
  262. \brief clear bkp interrupt flag state
  263. \param[in] flag
  264. \arg BKP_INT_FLAG_TAMPER: tamper interrupt flag
  265. \param[out] none
  266. \retval none
  267. */
  268. void bkp_interrupt_flag_clear(uint16_t flag)
  269. {
  270. BKP_TPCS |= (uint16_t)(flag >> TAMPER_FLAG_SHIFT);
  271. }