key_io.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "key_io.h"
  2. #include "gd32e23x_libopt.h"
  3. #include "board_cfg.h"
  4. #define KEY_IO_TEST_RCU RCU_GPIOB
  5. #define KEY_IO_RST_RCU RCU_GPIOC
  6. #define KEY_IO_DETECTION_RCU RCU_GPIOA
  7. #if SUPPORT_DOUBLE_FIRE
  8. #define KEY_IO_DETECTION_2_RCU RCU_GPIOB
  9. #define KEY_IO_DETECTION_2 GPIOB
  10. #define KEY_DETECTION_2 GPIO_PIN_3
  11. uint8_t key_detection_2 = 0;
  12. extern uint16_t detection_count_2;
  13. #endif
  14. #define KEY_IO_RST GPIOC
  15. #define KEY_IO_TEST GPIOB
  16. #define KEY_IO_DETECTION GPIOA
  17. #define KEY_RST GPIO_PIN_14
  18. #define KEY_TEST GPIO_PIN_2
  19. #define KEY_DETECTION GPIO_PIN_11
  20. #define DERECTION_EXIT_RCU EXTI_SOURCE_GPIOA
  21. #define DERECTION_EXIT_PIN KEY_DETECTION
  22. #define DERECTION_EXIT_SOURCE EXTI_SOURCE_PIN11
  23. #define DERECTION_EXIT_EXIT EXTI_11
  24. #if SUPPORT_DOUBLE_FIRE
  25. #define DERECTION_EXIT_RCU_2 EXTI_SOURCE_GPIOB
  26. #define DERECTION_EXIT_PIN_2 KEY_DETECTION_2
  27. #define DERECTION_EXIT_SOURCE_2 EXTI_SOURCE_PIN3
  28. #define DERECTION_EXIT_EXIT_2 EXTI_3
  29. #endif
  30. extern uint16_t detection_count;
  31. uint8_t key_detection = 0;
  32. static void ConfigDetection(void);
  33. void key_io_init(void * value)
  34. {
  35. (void)(value);
  36. rcu_periph_clock_enable(KEY_IO_TEST_RCU);
  37. rcu_periph_clock_enable(KEY_IO_RST_RCU);
  38. gpio_mode_set(KEY_IO_RST, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_RST);
  39. gpio_mode_set(KEY_IO_TEST, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST);
  40. ConfigDetection();
  41. }
  42. static void ConfigDetection(void)
  43. {
  44. rcu_periph_clock_enable(RCU_CFGCMP);
  45. rcu_periph_clock_enable(KEY_IO_DETECTION_RCU);
  46. gpio_mode_set(KEY_IO_DETECTION, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_DETECTION);
  47. nvic_irq_enable(EXTI4_15_IRQn,3);
  48. syscfg_exti_line_config(DERECTION_EXIT_RCU,DERECTION_EXIT_SOURCE);
  49. exti_init(DERECTION_EXIT_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  50. exti_interrupt_flag_clear(DERECTION_EXIT_EXIT);
  51. #if SUPPORT_DOUBLE_FIRE
  52. rcu_periph_clock_enable(KEY_IO_DETECTION_2_RCU);
  53. gpio_mode_set(KEY_IO_DETECTION_2, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_DETECTION_2);
  54. nvic_irq_enable(EXTI2_3_IRQn,3);
  55. syscfg_exti_line_config(DERECTION_EXIT_RCU_2,DERECTION_EXIT_SOURCE_2);
  56. exti_init(DERECTION_EXIT_EXIT_2,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  57. exti_interrupt_flag_clear(DERECTION_EXIT_EXIT_2);
  58. #endif
  59. }
  60. void EXTI4_15_IRQHandler(void){
  61. if(RESET != exti_interrupt_flag_get(DERECTION_EXIT_EXIT))
  62. {
  63. key_detection = 1;
  64. detection_count = 0;
  65. exti_interrupt_flag_clear(DERECTION_EXIT_EXIT);
  66. }
  67. }
  68. #if SUPPORT_DOUBLE_FIRE
  69. void EXTI2_3_IRQHandler(void){
  70. if(RESET != exti_interrupt_flag_get(DERECTION_EXIT_EXIT_2))
  71. {
  72. key_detection_2 = 1;
  73. detection_count_2 = 0;
  74. exti_interrupt_flag_clear(DERECTION_EXIT_EXIT_2);
  75. }
  76. }
  77. #endif
  78. bool get_rst()
  79. {
  80. FlagStatus status = SET;
  81. bool ret = false;
  82. uint32_t count = 100;
  83. if((status = gpio_input_bit_get(KEY_IO_RST,KEY_RST)) == RESET)
  84. {
  85. while(count--);
  86. if((status = gpio_input_bit_get(KEY_IO_RST,KEY_RST)) == RESET)
  87. {
  88. ret = true;
  89. }
  90. }
  91. return ret;
  92. }
  93. bool get_test()
  94. {
  95. FlagStatus status = SET;
  96. bool ret = false;
  97. uint32_t count = 100;
  98. if((status = gpio_input_bit_get(KEY_IO_TEST,KEY_TEST)) == RESET)
  99. {
  100. while(count--);
  101. if((status = gpio_input_bit_get(KEY_IO_TEST,KEY_TEST)) == RESET)
  102. {
  103. ret = true;
  104. }
  105. }
  106. return ret;
  107. }
  108. uint8_t get_detection()
  109. {
  110. // FlagStatus status = SET;
  111. // bool ret = false;
  112. // if((status = gpio_input_bit_get(KEY_IO_IO,KEY_DETECTION)) == RESET)
  113. // ret = true;
  114. uint8_t value = 0;
  115. #if SUPPORT_DOUBLE_FIRE
  116. value |= (key_detection_2 ? (1<<1):(0<<1));
  117. #endif
  118. value |= (key_detection ? (1<<0):(0<<0));
  119. return value;
  120. }