Exti.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #include "Exti.h"
  2. #include "gd32f30x_libopt.h"
  3. #include "main.h"
  4. #define INPUT_PIN_1 GPIO_PIN_0
  5. #define INPUT_PIN_2 GPIO_PIN_1
  6. #define SWTICH_PIN GPIO_PIN_5
  7. #define EXIT_INPUT_PIN_1 EXTI_SOURCE_PIN0
  8. #define EXIT_INPUT_PIN_2 EXTI_SOURCE_PIN1
  9. #define SWITCH_INPUT_PIN EXTI_SOURCE_PIN9
  10. #define INPUT_EXIT_1 EXTI_0
  11. #define INPUT_EXIT_2 EXTI_1
  12. #define SWITCH_EXTI EXTI_5
  13. static void read_input_level(uint8_t channel);
  14. static void read_switch_level();
  15. void sts_exti_init(void)
  16. {
  17. rcu_periph_clock_enable(RCU_GPIOA);
  18. rcu_periph_clock_enable(RCU_GPIOC);
  19. rcu_periph_clock_enable(RCU_AF);
  20. //rcu_periph_clock_enable(RCU_CFGCMP);
  21. //rcu_periph_clock_enable(RCU_AF);
  22. gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,INPUT_PIN_1 | INPUT_PIN_2);
  23. gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,INPUT_PIN_1 | INPUT_PIN_2);
  24. gpio_init(GPIOC,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,SWTICH_PIN);
  25. nvic_irq_enable(EXTI0_IRQn,0,0);
  26. nvic_irq_enable(EXTI1_IRQn,0,0);
  27. nvic_irq_enable(EXTI5_9_IRQn,0,0);
  28. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_0);
  29. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_1);
  30. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOC, GPIO_PIN_SOURCE_5);
  31. exti_init(INPUT_EXIT_1,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
  32. exti_init(INPUT_EXIT_2,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
  33. // syscfg_exti_line_config(EXTI_SOURCE_GPIOA,EXIT_INPUT_PIN_1);
  34. // syscfg_exti_line_config(EXTI_SOURCE_GPIOA,EXIT_INPUT_PIN_2);
  35. // syscfg_exti_line_config(EXTI_SOURCE_GPIOB,SWITCH_INPUT_PIN);
  36. //
  37. // exti_init(INPUT_EXIT_1,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
  38. // exti_init(INPUT_EXIT_2,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
  39. exti_init(SWITCH_EXTI,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
  40. //
  41. exti_interrupt_flag_clear(INPUT_EXIT_1);
  42. exti_interrupt_flag_clear(INPUT_EXIT_2);
  43. exti_interrupt_flag_clear(SWITCH_EXTI);
  44. sts_data_t * data = get_sts();
  45. data->read_input_level = read_input_level;
  46. data->read_switch_level = read_switch_level;
  47. }
  48. uint8_t get_exti_in_1(void)
  49. {
  50. if(gpio_input_bit_get(GPIOA,INPUT_PIN_1))
  51. {
  52. return 0;
  53. }else
  54. return 1;
  55. }
  56. uint8_t get_exti_in_2(void)
  57. {
  58. if(gpio_input_bit_get(GPIOA,INPUT_PIN_2))
  59. {
  60. return 0;
  61. }else
  62. return 1;
  63. }
  64. static void read_input_level(uint8_t channel)
  65. {
  66. sts_data_t * data = get_sts();
  67. switch(channel)
  68. {
  69. case INPUT_CHANNEL_1:
  70. {
  71. data->m_data.input_status.input_status[INPUT_CHANNEL_1] = get_exti_in_1();
  72. }
  73. break;
  74. case INPUT_CHANNEL_2:
  75. {
  76. data->m_data.input_status.input_status[INPUT_CHANNEL_2] = get_exti_in_2();
  77. }
  78. break;
  79. default:
  80. break;
  81. }
  82. }
  83. uint8_t get_exti_switch(void)
  84. {
  85. if(gpio_input_bit_get(GPIOC,SWTICH_PIN))
  86. {
  87. return 0;
  88. }else
  89. return 1;
  90. }
  91. static void read_switch_level()
  92. {
  93. sts_data_t * data = get_sts();
  94. data->switch_status = get_exti_switch();
  95. }
  96. void EXTI0_IRQHandler(void)
  97. {
  98. sts_data_t * data = get_sts();
  99. if(RESET != exti_interrupt_flag_get(INPUT_EXIT_1))
  100. {
  101. exti_interrupt_flag_clear(INPUT_EXIT_1);
  102. if(get_exti_in_1() == RESET) //rising
  103. {
  104. data->m_data.input_status.input_status[INPUT_CHANNEL_1] = 0;
  105. if(data->m_data.input_status.input_status[INPUT_CHANNEL_2])
  106. {
  107. data->choise_input(INPUT_CHANNEL_2);
  108. }
  109. }else //falling
  110. {
  111. data->m_data.input_status.input_status[INPUT_CHANNEL_1] = 1;
  112. }
  113. }
  114. }
  115. void EXTI1_IRQHandler(void)
  116. {
  117. sts_data_t * data = get_sts();
  118. if(RESET != exti_interrupt_flag_get(INPUT_EXIT_2))
  119. {
  120. exti_interrupt_flag_clear(INPUT_EXIT_2);
  121. if(get_exti_in_2() == RESET) //rising
  122. {
  123. data->m_data.input_status.input_status[INPUT_CHANNEL_2] = 0;
  124. if(data->m_data.input_status.input_status[INPUT_CHANNEL_1])
  125. {
  126. data->choise_input(INPUT_CHANNEL_1);
  127. }
  128. }else //falling
  129. {
  130. data->m_data.input_status.input_status[INPUT_CHANNEL_2] = 1;
  131. }
  132. }
  133. }
  134. uint8_t value = 0;
  135. void EXTI5_9_IRQHandler(void)
  136. {
  137. sts_data_t * data = get_sts();
  138. if(RESET != exti_interrupt_flag_get(SWITCH_EXTI))
  139. {
  140. exti_interrupt_flag_clear(SWITCH_EXTI);
  141. value = get_exti_switch();
  142. if(value == RESET) //rising
  143. {
  144. if(data->m_data.input_status.input_status[INPUT_CHANNEL_1])
  145. {
  146. if(data->m_data.md_choise.choise_ch != INPUT_CHANNEL_1)
  147. data->choise_input(INPUT_CHANNEL_1);
  148. }
  149. }else //falling
  150. {
  151. if(data->m_data.input_status.input_status[INPUT_CHANNEL_2])
  152. {
  153. if(data->m_data.md_choise.choise_ch != INPUT_CHANNEL_2)
  154. data->choise_input(INPUT_CHANNEL_2);
  155. }
  156. }
  157. }
  158. }