Exti.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #include "Exti.h"
  2. #include "gd32e230x_conf.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_9
  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_9
  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_GPIOB);
  19. rcu_periph_clock_enable(RCU_CFGCMP);
  20. //rcu_periph_clock_enable(RCU_AF);
  21. gpio_mode_set(GPIOA,GPIO_MODE_INPUT,GPIO_PUPD_NONE,INPUT_PIN_1);
  22. gpio_mode_set(GPIOA,GPIO_MODE_INPUT,GPIO_PUPD_NONE,INPUT_PIN_2);
  23. gpio_mode_set(GPIOB,GPIO_MODE_INPUT,GPIO_PUPD_NONE,SWTICH_PIN);
  24. // nvic_irq_enable(EXTI0_1_IRQn,0);
  25. nvic_irq_enable(EXTI4_15_IRQn,0);
  26. // syscfg_exti_line_config(EXTI_SOURCE_GPIOA,EXIT_INPUT_PIN_1);
  27. // syscfg_exti_line_config(EXTI_SOURCE_GPIOA,EXIT_INPUT_PIN_2);
  28. syscfg_exti_line_config(EXTI_SOURCE_GPIOB,SWITCH_INPUT_PIN);
  29. //
  30. // exti_init(INPUT_EXIT_1,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
  31. // exti_init(INPUT_EXIT_2,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
  32. exti_init(SWITCH_EXTI,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
  33. //
  34. // exti_interrupt_flag_clear(INPUT_EXIT_1);
  35. // exti_interrupt_flag_clear(INPUT_EXIT_2);
  36. exti_interrupt_flag_clear(SWITCH_EXTI);
  37. sts_data_t * data = get_sts();
  38. data->read_input_level = read_input_level;
  39. data->read_switch_level = read_switch_level;
  40. }
  41. uint8_t get_exti_in_1(void)
  42. {
  43. if(gpio_input_bit_get(GPIOA,INPUT_PIN_1))
  44. {
  45. return 1;
  46. }else
  47. return 0;
  48. }
  49. uint8_t get_exti_in_2(void)
  50. {
  51. if(gpio_input_bit_get(GPIOA,INPUT_PIN_2))
  52. {
  53. return 1;
  54. }else
  55. return 0;
  56. }
  57. static void read_input_level(uint8_t channel)
  58. {
  59. sts_data_t * data = get_sts();
  60. switch(channel)
  61. {
  62. case INPUT_CHANNEL_1:
  63. {
  64. data->m_data.input_status.input_status[INPUT_CHANNEL_1] = get_exti_in_1();
  65. }
  66. break;
  67. case INPUT_CHANNEL_2:
  68. {
  69. data->m_data.input_status.input_status[INPUT_CHANNEL_2] = get_exti_in_2();
  70. }
  71. break;
  72. default:
  73. break;
  74. }
  75. }
  76. uint8_t get_exti_switch(void)
  77. {
  78. if(gpio_input_bit_get(GPIOB,SWTICH_PIN))
  79. {
  80. return 1;
  81. }else
  82. return 0;
  83. }
  84. static void read_switch_level()
  85. {
  86. sts_data_t * data = get_sts();
  87. data->switch_status = get_exti_switch();
  88. }
  89. void EXTI0_1_IRQHandler(void)
  90. {
  91. sts_data_t * data = get_sts();
  92. if(RESET != exti_interrupt_flag_get(INPUT_EXIT_1))
  93. {
  94. exti_interrupt_flag_clear(INPUT_EXIT_1);
  95. if(get_exti_in_1() == SET) //rising
  96. {
  97. data->m_data.input_status.input_status[INPUT_CHANNEL_1] = 0;
  98. if(data->m_data.input_status.input_status[INPUT_CHANNEL_2])
  99. {
  100. data->choise_input(INPUT_CHANNEL_2);
  101. }
  102. }else //falling
  103. {
  104. data->m_data.input_status.input_status[INPUT_CHANNEL_1] = 1;
  105. }
  106. }
  107. if(RESET != exti_interrupt_flag_get(INPUT_EXIT_2))
  108. {
  109. if(get_exti_in_2() == SET) //rising
  110. {
  111. data->m_data.input_status.input_status[INPUT_CHANNEL_2] = 0;
  112. if(data->m_data.input_status.input_status[INPUT_CHANNEL_1])
  113. {
  114. data->choise_input(INPUT_CHANNEL_1);
  115. }
  116. }else //falling
  117. {
  118. data->m_data.input_status.input_status[INPUT_CHANNEL_2] = 1;
  119. }
  120. exti_interrupt_flag_clear(INPUT_EXIT_2);
  121. }
  122. }
  123. void EXTI4_15_IRQHandler(void)
  124. {
  125. sts_data_t * data = get_sts();
  126. if(RESET != exti_interrupt_flag_get(SWITCH_EXTI))
  127. {
  128. if(get_exti_switch() == SET) //rising
  129. {
  130. if(data->m_data.input_status.input_status[INPUT_CHANNEL_1])
  131. {
  132. if(data->m_data.md_choise.choise_ch != INPUT_CHANNEL_1)
  133. data->choise_input(INPUT_CHANNEL_1);
  134. }
  135. }else //falling
  136. {
  137. if(data->m_data.input_status.input_status[INPUT_CHANNEL_2])
  138. {
  139. if(data->m_data.md_choise.choise_ch != INPUT_CHANNEL_2)
  140. data->choise_input(INPUT_CHANNEL_2);
  141. }
  142. }
  143. exti_interrupt_flag_clear(SWITCH_EXTI);
  144. }
  145. }