gd32f3x0_it.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. /*!
  2. \file gd32f3x0_it.c
  3. \brief interrupt service routines
  4. */
  5. /*
  6. Copyright (C) 2017 GigaDevice
  7. 2017-06-06, V1.0.0, firmware for GD32F3x0
  8. */
  9. #include "gd32f3x0_it.h"
  10. #include "gd32f3x0_eval.h"
  11. #include "systick.h"
  12. /* array1 transmission */
  13. uint8_t senddata1[2] = {0xA5,0x5A};
  14. /* array2 transmission */
  15. uint8_t senddata2[2] = {0x5A,0xA5};
  16. /* receive array buffer */
  17. uint8_t rcvdata[10];
  18. /* sent data pointer */
  19. uint8_t *transdata;
  20. __IO uint8_t rcvstatus = 0U;
  21. __IO uint8_t send_inc = 0U, rcv_inc = 0U;
  22. uint16_t senderrorcode = 0U;
  23. uint16_t rcverrorcode = 0U;
  24. __IO uint8_t bytenum = 0U;
  25. /*!
  26. \brief this function handles NMI exception
  27. \param[in] none
  28. \param[out] none
  29. \retval none
  30. */
  31. void NMI_Handler(void)
  32. {
  33. }
  34. /*!
  35. \brief this function handles HardFault exception
  36. \param[in] none
  37. \param[out] none
  38. \retval none
  39. */
  40. void HardFault_Handler(void)
  41. {
  42. /* if Hard Fault exception occurs, go to infinite loop */
  43. while (1);
  44. }
  45. /*!
  46. \brief this function handles MemManage exception
  47. \param[in] none
  48. \param[out] none
  49. \retval none
  50. */
  51. void MemManage_Handler(void)
  52. {
  53. /* if Memory Manage exception occurs, go to infinite loop */
  54. while (1);
  55. }
  56. /*!
  57. \brief this function handles BusFault exception
  58. \param[in] none
  59. \param[out] none
  60. \retval none
  61. */
  62. void BusFault_Handler(void)
  63. {
  64. /* if Bus Fault exception occurs, go to infinite loop */
  65. while (1);
  66. }
  67. /*!
  68. \brief this function handles UsageFault exception
  69. \param[in] none
  70. \param[out] none
  71. \retval none
  72. */
  73. void UsageFault_Handler(void)
  74. {
  75. /* if Usage Fault exception occurs, go to infinite loop */
  76. while (1);
  77. }
  78. /*!
  79. \brief this function handles SVC exception
  80. \param[in] none
  81. \param[out] none
  82. \retval none
  83. */
  84. void SVC_Handler(void)
  85. {
  86. }
  87. /*!
  88. \brief this function handles DebugMon exception
  89. \param[in] none
  90. \param[out] none
  91. \retval none
  92. */
  93. void DebugMon_Handler(void)
  94. {
  95. }
  96. /*!
  97. \brief this function handles PendSV exception
  98. \param[in] none
  99. \param[out] none
  100. \retval none
  101. */
  102. void PendSV_Handler(void)
  103. {
  104. }
  105. /*!
  106. \brief this function handles SysTick exception
  107. \param[in] none
  108. \param[out] none
  109. \retval none
  110. */
  111. void SysTick_Handler(void)
  112. {
  113. delay_decrement();
  114. }
  115. /*!
  116. \brief this function handles EXTI0_1 interrupt request
  117. \param[in] none
  118. \param[out] none
  119. \retval none
  120. */
  121. void EXTI0_1_IRQHandler(void)
  122. {
  123. if(RESET != exti_flag_get(WAKEUP_KEY_EXTI_LINE)){
  124. /* Tamper key press */
  125. bytenum = 2U;
  126. /* send CEC address */
  127. cec_data_send(0x12U);
  128. /* start transmission */
  129. transdata = senddata1;
  130. /* start transmission */
  131. cec_transmission_start();
  132. exti_flag_clear(WAKEUP_KEY_EXTI_LINE);
  133. }
  134. }
  135. /*!
  136. \brief this function handles EXTI4_15 interrupt request
  137. \param[in] none
  138. \param[out] none
  139. \retval none
  140. */
  141. void EXTI4_15_IRQHandler(void)
  142. {
  143. if(RESET != exti_flag_get(TAMPER_KEY_EXTI_LINE)){
  144. /* Tamper key press */
  145. bytenum = 2U;
  146. /* send CEC address */
  147. cec_data_send(0x12U);
  148. /* start transmission */
  149. transdata = senddata2;
  150. /* start transmission */
  151. cec_transmission_start();
  152. exti_flag_clear(TAMPER_KEY_EXTI_LINE);
  153. }
  154. }
  155. /*!
  156. \brief this function handles CEC interrupt request
  157. \param[in] none
  158. \param[out] none
  159. \retval none
  160. */
  161. void CEC_IRQHandler(void)
  162. {
  163. /* check if a reception error occured */
  164. if(cec_interrupt_flag_get(CEC_INTF_RO | CEC_INTF_BRE | CEC_INTF_BPSE | CEC_INTF_BPLE | CEC_INTF_RAE)){
  165. rcverrorcode = CEC_INTF;
  166. cec_interrupt_flag_clear(CEC_INTF_RO | CEC_INTF_BRE | CEC_INTF_BPSE | CEC_INTF_BPLE | CEC_INTF_RAE);
  167. rcvstatus = 2U;
  168. }
  169. /* receive data */
  170. if(cec_interrupt_flag_get(CEC_INTF_BR)){
  171. rcvdata[rcv_inc] = cec_data_receive();
  172. rcv_inc++;
  173. cec_interrupt_flag_clear(CEC_INTF_BR);
  174. }
  175. /* check if the byte received is the last one of the message */
  176. if(cec_interrupt_flag_get(CEC_INTF_REND)){
  177. rcvstatus = 1U;
  178. rcv_inc = 0U;
  179. cec_interrupt_flag_clear(CEC_INTF_REND);
  180. }
  181. /* check if a transmission error occurred */
  182. if(cec_interrupt_flag_get(CEC_INTF_ARBF | CEC_INTF_TU | CEC_INTF_TERR | CEC_INTF_TAERR)){
  183. senderrorcode = CEC_INTF;
  184. cec_interrupt_flag_clear(CEC_INTF_ARBF | CEC_INTF_TU | CEC_INTF_TERR | CEC_INTF_TAERR);
  185. }
  186. /* check if end of message bit is set in the data to be transmitted */
  187. if(cec_interrupt_flag_get(CEC_INTF_TEND)){
  188. cec_interrupt_flag_clear(CEC_INTF_TEND| CEC_INTF_TBR);
  189. send_inc = 0U;
  190. }else if(cec_interrupt_flag_get(CEC_INTF_TBR)){
  191. /* set EOM bit if the byte to be transmitted is the last one of the senddata */
  192. if(send_inc++ == (bytenum - 1U)){
  193. cec_transmission_end();
  194. cec_data_send(*transdata++);
  195. }else{
  196. /* send the byte in the transdata */
  197. cec_data_send(*transdata++);
  198. }
  199. cec_interrupt_flag_clear(CEC_INTF_TBR);
  200. }
  201. }