Exti.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include "Exti.h"
  2. #include "gd32e230x_conf.h"
  3. #include "main.h"
  4. #define INPUT_PIN_1 GPIO_PIN_7
  5. #define INPUT_PIN_2 GPIO_PIN_8
  6. #define SWTICH_PIN GPIO_PIN_5
  7. #define EXIT_INPUT_PIN_1 EXTI_SOURCE_PIN7
  8. #define EXIT_INPUT_PIN_2 EXTI_SOURCE_PIN8
  9. #define SWITCH_INPUT_PIN EXTI_SOURCE_PIN5
  10. #define INPUT_EXIT_1 EXTI_7
  11. #define INPUT_EXIT_2 EXTI_8
  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_GPIOB);
  18. rcu_periph_clock_enable(RCU_CFGCMP);
  19. //rcu_periph_clock_enable(RCU_AF);
  20. gpio_mode_set(GPIOB,GPIO_MODE_INPUT,GPIO_PUPD_NONE,INPUT_PIN_1);
  21. gpio_mode_set(GPIOB,GPIO_MODE_INPUT,GPIO_PUPD_NONE,INPUT_PIN_2);
  22. gpio_mode_set(GPIOB,GPIO_MODE_INPUT,GPIO_PUPD_NONE,SWTICH_PIN);
  23. nvic_irq_enable(EXTI4_15_IRQn,0);
  24. syscfg_exti_line_config(EXTI_SOURCE_GPIOB,EXIT_INPUT_PIN_1);
  25. syscfg_exti_line_config(EXTI_SOURCE_GPIOB,EXIT_INPUT_PIN_2);
  26. syscfg_exti_line_config(EXTI_SOURCE_GPIOB,SWITCH_INPUT_PIN);
  27. exti_init(INPUT_EXIT_1,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
  28. exti_init(INPUT_EXIT_2,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
  29. exti_init(SWITCH_EXTI,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
  30. exti_interrupt_flag_clear(INPUT_EXIT_1);
  31. exti_interrupt_flag_clear(INPUT_EXIT_2);
  32. exti_interrupt_flag_clear(SWITCH_EXTI);
  33. sts_data_t * data = get_sts();
  34. data->read_input_level = read_input_level;
  35. data->read_switch_level = read_switch_level;
  36. }
  37. uint8_t get_exti_in_1(void)
  38. {
  39. return gpio_input_bit_get(GPIOB,INPUT_PIN_1);
  40. }
  41. uint8_t get_exti_in_2(void)
  42. {
  43. return gpio_input_bit_get(GPIOB,INPUT_PIN_2);
  44. }
  45. static void read_input_level(uint8_t channel)
  46. {
  47. sts_data_t * data = get_sts();
  48. switch(channel)
  49. {
  50. case INPUT_CHANNEL_1:
  51. {
  52. data->m_data.input_status.input_status[INPUT_CHANNEL_1] = get_exti_in_1();
  53. }
  54. break;
  55. case INPUT_CHANNEL_2:
  56. {
  57. data->m_data.input_status.input_status[INPUT_CHANNEL_2] = get_exti_in_2();
  58. }
  59. break;
  60. default:
  61. break;
  62. }
  63. }
  64. uint8_t get_exti_switch(void)
  65. {
  66. return gpio_input_bit_get(GPIOB,SWTICH_PIN);
  67. }
  68. static void read_switch_level()
  69. {
  70. sts_data_t * data = get_sts();
  71. data->switch_status = get_exti_switch();
  72. }
  73. void EXTI4_15_IRQHandler(void)
  74. {
  75. sts_data_t * data = get_sts();
  76. if(RESET != exti_interrupt_flag_get(INPUT_EXIT_1))
  77. {
  78. if(get_exti_in_1() == SET) //rising
  79. {
  80. data->m_data.input_status.input_status[INPUT_CHANNEL_1] = 1;
  81. }else //falling
  82. {
  83. data->m_data.input_status.input_status[INPUT_CHANNEL_1] = 0;
  84. if(data->m_data.input_status.input_status[INPUT_CHANNEL_2])
  85. {
  86. data->choise_input(INPUT_CHANNEL_2);
  87. }
  88. }
  89. exti_interrupt_flag_clear(INPUT_EXIT_1);
  90. }
  91. if(RESET != exti_interrupt_flag_get(INPUT_EXIT_2))
  92. {
  93. if(get_exti_in_2() == SET) //rising
  94. {
  95. data->m_data.input_status.input_status[INPUT_CHANNEL_2] = 1;
  96. }else //falling
  97. {
  98. data->m_data.input_status.input_status[INPUT_CHANNEL_2] = 0;
  99. if(data->m_data.input_status.input_status[INPUT_CHANNEL_1])
  100. {
  101. data->choise_input(INPUT_CHANNEL_1);
  102. }
  103. }
  104. exti_interrupt_flag_clear(INPUT_EXIT_2);
  105. }
  106. if(RESET != exti_interrupt_flag_get(SWITCH_EXTI))
  107. {
  108. if(get_exti_switch() == SET) //rising
  109. {
  110. if(data->m_data.input_status.input_status[INPUT_CHANNEL_1])
  111. {
  112. data->choise_input(INPUT_CHANNEL_1);
  113. }
  114. }else //falling
  115. {
  116. if(data->m_data.input_status.input_status[INPUT_CHANNEL_2])
  117. {
  118. data->choise_input(INPUT_CHANNEL_2);
  119. }
  120. }
  121. exti_interrupt_flag_clear(SWITCH_EXTI);
  122. }
  123. }