gpio.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. #include "bsp/bsp_driver.h"
  2. #include "libs/utils.h"
  3. #ifdef GD32_FOC_DEMO
  4. #define IR2136S_Enable_pin 0
  5. #define LED1_Enable_pin 1
  6. #define LED2_Enable_pin 2
  7. #define LED3_Enable_pin 3
  8. #define KEY_Start_pin 4
  9. #define KEY_Stop_pin 5
  10. #define KEY_Func_pin 6
  11. #endif
  12. /*
  13. * gpio.c
  14. * all pins used as gpio(in/out/irq) must be init&accessed here
  15. */
  16. const static gpio_pin_config_t _pins[] = {
  17. #ifdef GD32_FOC_DEMO
  18. [IR2136S_Enable_pin] = {GPIOA, GPIO_PIN_12, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, 0},
  19. [LED1_Enable_pin] = {GPIOD, GPIO_PIN_2, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, 0},
  20. [LED2_Enable_pin] = {0, GPIO_PIN_9, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, 0},
  21. [LED3_Enable_pin] = {GPIOC, GPIO_PIN_5, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, 0},
  22. [KEY_Start_pin] = {GPIOB, GPIO_PIN_5, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, 0},
  23. [KEY_Stop_pin] = {GPIOB, GPIO_PIN_11, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, 0},
  24. #endif
  25. };
  26. void gpio_pin_init(void){
  27. rcu_periph_clock_enable(RCU_GPIOA);
  28. rcu_periph_clock_enable(RCU_GPIOB);
  29. rcu_periph_clock_enable(RCU_GPIOC);
  30. rcu_periph_clock_enable(RCU_GPIOD);
  31. rcu_periph_clock_enable(RCU_GPIOF);
  32. rcu_periph_clock_enable(RCU_AF);
  33. for (int i = 0; i < ARRAY_SIZE(_pins); i++){
  34. if (_pins[i].init_value != -1){
  35. gpio_bit_write(_pins[i].group, _pins[i].pin, (bit_status)_pins[i].init_value);
  36. }
  37. if (_pins[i].group != 0) {
  38. gpio_init(_pins[i].group, _pins[i].mode, _pins[i].speed, _pins[i].pin);
  39. }
  40. }
  41. #ifdef CONFIG_BEEP
  42. gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
  43. gpio_beep(50);
  44. #endif
  45. }
  46. void gpio_beep(u32 ms) {
  47. #ifdef CONFIG_BEEP
  48. gpio_bit_write(GPIOB, GPIO_PIN_2, SET);
  49. delay_ms(ms);
  50. gpio_bit_write(GPIOB, GPIO_PIN_2, RESET);
  51. #endif
  52. }
  53. void gpio_mc_brk_init(void) {
  54. #ifdef GPIO_BRAKE_IN_GROUP
  55. rcu_periph_clock_enable(GPIO_BRAKE_IN_RCU);
  56. #ifdef GPIO_BRAKE_PIN_REMAP
  57. gpio_pin_remap_config(GPIO_BRAKE_PIN_REMAP, ENABLE);
  58. #endif
  59. gpio_init(GPIO_BRAKE_IN_GROUP, GPIO_BRAKE_IN_MODE, GPIO_OSPEED_50MHZ, GPIO_BRAKE_IN_PIN);
  60. gpio_exti_source_select(GPIO_BRAKE_EXIT_SRC_GROUP, GPIO_BRAKE_EXIT_SRC_PIN);
  61. exti_init(GPIO_BRAKE_EXTI, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  62. nvic_irq_enable(GPIO_BRAKE_IRQ, EBREAK_IRQ_PRIORITY, 0U);
  63. exti_interrupt_flag_clear(GPIO_BRAKE_EXTI);
  64. exti_interrupt_enable(GPIO_BRAKE_EXTI);
  65. #endif
  66. #ifdef GPIO_BRAKE1_IN_GROUP
  67. rcu_periph_clock_enable(GPIO_BRAKE1_IN_RCU);
  68. gpio_init(GPIO_BRAKE1_IN_GROUP, GPIO_BRAKE1_IN_MODE, GPIO_OSPEED_50MHZ, GPIO_BRAKE1_IN_PIN);
  69. gpio_exti_source_select(GPIO_BRAKE1_EXIT_SRC_GROUP, GPIO_BRAKE1_EXIT_SRC_PIN);
  70. exti_init(GPIO_BRAKE1_EXTI, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  71. nvic_irq_enable(GPIO_BRAKE1_IRQ, EBREAK_IRQ_PRIORITY, 0U);
  72. exti_interrupt_flag_clear(GPIO_BRAKE1_EXTI);
  73. exti_interrupt_enable(GPIO_BRAKE1_EXTI);
  74. #endif
  75. }
  76. void gpio_mlock_init(void) {
  77. #ifdef GPIO_MLOCK_IN_GROUP
  78. rcu_periph_clock_enable(GPIO_MLOCK_IN_RCU);
  79. gpio_init(GPIO_MLOCK_IN_GROUP, GPIO_MLOCK_IN_MODE, GPIO_OSPEED_50MHZ, GPIO_MLOCK_IN_PIN);
  80. #endif
  81. }
  82. void gpio_fan_det_init(void) {
  83. #ifdef GPIO_FAN1_IN_GROUP
  84. rcu_periph_clock_enable(GPIO_FAN1_IN_RCU);
  85. gpio_init(GPIO_FAN1_IN_GROUP, GPIO_FAN1_IN_MODE, GPIO_OSPEED_50MHZ, GPIO_FAN1_IN_PIN);
  86. gpio_exti_source_select(GPIO_FAN1_EXIT_SRC_GROUP, GPIO_FAN1_EXIT_SRC_PIN);
  87. exti_init(GPIO_FAN1_EXTI, EXTI_INTERRUPT, EXTI_TRIG_RISING);
  88. nvic_irq_enable(GPIO_FAN1_IRQ, ENC_OTHER_IRQ_PRIORITY, 0U);
  89. exti_interrupt_flag_clear(GPIO_FAN1_EXTI);
  90. exti_interrupt_enable(GPIO_FAN1_EXTI);
  91. #endif
  92. #ifdef GPIO_FAN2_IN_GROUP
  93. rcu_periph_clock_enable(GPIO_FAN2_IN_RCU);
  94. gpio_init(GPIO_FAN2_IN_GROUP, GPIO_FAN2_IN_MODE, GPIO_OSPEED_50MHZ, GPIO_FAN2_IN_PIN);
  95. gpio_exti_source_select(GPIO_FAN2_EXIT_SRC_GROUP, GPIO_FAN2_EXIT_SRC_PIN);
  96. exti_init(GPIO_FAN2_EXTI, EXTI_INTERRUPT, EXTI_TRIG_RISING);
  97. nvic_irq_enable(GPIO_FAN2_IRQ, ENC_OTHER_IRQ_PRIORITY, 0U);
  98. exti_interrupt_flag_clear(GPIO_FAN2_EXTI);
  99. exti_interrupt_enable(GPIO_FAN2_EXTI);
  100. #endif
  101. }
  102. void gpio_phase_u_detect(bool enable) {
  103. #ifdef GPIO_UDEC_OUT_GROUP
  104. if (enable) {
  105. gpio_init(GPIO_UDEC_OUT_GROUP, GPIO_UDEC_OUT_MODE, GPIO_OSPEED_50MHZ, GPIO_UDEC_OUT_PIN);
  106. #ifdef GPIO_UDEC_OUT_REMAP_DISABLE
  107. gpio_pin_remap_config(GPIO_UDEC_OUT_REMAP_DISABLE, ENABLE);
  108. #endif
  109. gpio_bit_write(GPIO_UDEC_OUT_GROUP, GPIO_UDEC_OUT_PIN, SET);
  110. }else {
  111. gpio_init(GPIO_UDEC_OUT_GROUP, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_UDEC_OUT_PIN);
  112. #ifdef GPIO_UDEC_OUT_REMAP_ENABLE
  113. gpio_pin_remap_config(GPIO_UDEC_OUT_REMAP_ENABLE, ENABLE);
  114. #endif
  115. }
  116. #endif
  117. }
  118. void gpio_led_init(void) {
  119. #ifdef GPIO_LED_OUT_GROUP
  120. rcu_periph_clock_enable(GPIO_LED_OUT_RCU);
  121. gpio_init(GPIO_LED_OUT_GROUP, GPIO_LED_OUT_MODE, GPIO_OSPEED_50MHZ, GPIO_LED_OUT_PIN);
  122. gpio_bit_reset(GPIO_LED_OUT_GROUP, GPIO_LED_OUT_PIN);
  123. #endif
  124. }
  125. void gpio_brk_light_init(void) {
  126. #ifdef GPIO_BRAKE_LIGHT_OUT_GROUP
  127. rcu_periph_clock_enable(GPIO_BRAKE_LIGHT_OUT_RCU);
  128. gpio_init(GPIO_BRAKE_LIGHT_OUT_GROUP, GPIO_BRAKE_LIGHT_OUT_MODE, GPIO_OSPEED_50MHZ, GPIO_BRAKE_LIGHT_OUT_PIN);
  129. gpio_bit_reset(GPIO_BRAKE_LIGHT_OUT_GROUP, GPIO_BRAKE_LIGHT_OUT_PIN);
  130. #endif
  131. }
  132. void gpio_board_id_init(void) {
  133. #ifdef BOOT_PIN_0_GROUP
  134. gpio_init(BOOT_PIN_0_GROUP, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, BOOT_PIN_0_PIN);
  135. gpio_init(BOOT_PIN_1_GROUP, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, BOOT_PIN_1_PIN);
  136. #endif
  137. }
  138. u8 gpio_hw_board_id(void) {
  139. u8 id = BOARD_105_VERSION_4;
  140. #ifdef BOOT_PIN_0_GROUP
  141. u8 b0 = gpio_input_bit_get(BOOT_PIN_0_GROUP, BOOT_PIN_0_PIN);
  142. u8 b1 = gpio_input_bit_get(BOOT_PIN_1_GROUP, BOOT_PIN_1_PIN);
  143. id = ((b1 << 1) | b0);
  144. #endif
  145. return id;
  146. }
  147. void gpio_repear_key_init(void) {
  148. #ifdef REPEAR_IN_GROUP
  149. gpio_init(REPEAR_IN_GROUP, REPEAR_IN_MODE, GPIO_OSPEED_50MHZ, REPEAR_IN_PIN);
  150. #endif
  151. }
  152. static u8 _board_id = BOARD_105_VERSION_4;
  153. void mc_gpio_init(void) {
  154. gpio_mlock_init();
  155. gpio_mc_brk_init();
  156. gpio_fan_det_init();
  157. gpio_led_init();
  158. gpio_brk_light_init();
  159. gpio_board_id_init();
  160. gpio_repear_key_init();
  161. int count = 10;
  162. do {
  163. delay_ms(5);
  164. _board_id = gpio_hw_board_id();
  165. if (_board_id == BOARD_105_VERSION_3 || _board_id == BOARD_105_VERSION_4) {
  166. break;
  167. }
  168. }while(count-- > 0);
  169. }
  170. bool gpio_is_repear_mode(void) {
  171. #ifndef REPEAR_IN_GROUP
  172. return false;
  173. #else
  174. return gpio_input_bit_get(REPEAR_IN_GROUP, REPEAR_IN_PIN) == RESET;
  175. #endif
  176. }
  177. void gpio_led_enable(bool enable) {
  178. #ifdef GPIO_LED_OUT_GROUP
  179. gpio_bit_write(GPIO_BRAKE_LIGHT_OUT_GROUP, GPIO_BRAKE_LIGHT_OUT_PIN, enable?SET:RESET);
  180. #endif
  181. }
  182. void gpio_brk_light_enable(bool enable) {
  183. #ifdef GPIO_BRAKE_LIGHT_OUT_GROUP
  184. gpio_bit_write(GPIO_BRAKE_LIGHT_OUT_GROUP, GPIO_BRAKE_LIGHT_OUT_PIN, enable?SET:RESET);
  185. #endif
  186. }
  187. u8 gpio_board_id(void) {
  188. return _board_id;
  189. }
  190. bool mc_get_gpio_brake(void) {
  191. return gpio_input_bit_get(GPIO_BRAKE_IN_GROUP, GPIO_BRAKE_IN_PIN) == SET;
  192. }
  193. bool mc_get_gpio_brake1(void) {
  194. #ifdef GPIO_BRAKE1_IN_GROUP
  195. return gpio_input_bit_get(GPIO_BRAKE1_IN_GROUP, GPIO_BRAKE1_IN_PIN) == SET;
  196. #else
  197. return mc_get_gpio_brake();
  198. #endif
  199. }
  200. bool gpio_motor_locked(void) {
  201. #ifdef GPIO_MLOCK_IN_GROUP
  202. return gpio_input_bit_get(GPIO_MLOCK_IN_GROUP, GPIO_MLOCK_IN_PIN) == RESET;
  203. #else
  204. return false;
  205. #endif
  206. }
  207. void gpio_ir2136_enable(bool enable) {
  208. #ifdef GD32_FOC_DEMO
  209. gpio_bit_write(_pins[IR2136S_Enable_pin].group, _pins[IR2136S_Enable_pin].pin, (enable)?SET:RESET);
  210. #endif
  211. }
  212. void gpio_led1_enable(bool enable) {
  213. #ifdef GD32_FOC_DEMO
  214. gpio_bit_write(_pins[LED1_Enable_pin].group, _pins[LED1_Enable_pin].pin, (enable)?SET:RESET);
  215. #endif
  216. }
  217. void gpio_led2_enable(bool enable) {
  218. #ifdef GD32_FOC_DEMO
  219. //gpio_bit_write(_pins[LED2_Enable_pin].group, _pins[LED2_Enable_pin].pin, (enable)?SET:RESET);
  220. #endif
  221. }
  222. void gpio_led3_enable(bool enable) {
  223. #ifdef GD32_FOC_DEMO
  224. gpio_bit_write(_pins[LED3_Enable_pin].group, _pins[LED3_Enable_pin].pin, (enable)?SET:RESET);
  225. #endif
  226. }
  227. int gpio_startkey_value(void) {
  228. #ifdef GD32_FOC_DEMO
  229. return gpio_input_bit_get(_pins[KEY_Start_pin].group, _pins[KEY_Start_pin].pin)==SET?1:0;
  230. #else
  231. return 1;
  232. #endif
  233. }
  234. int gpio_stopkey_value(void) {
  235. #ifdef GD32_FOC_DEMO
  236. return gpio_input_bit_get(_pins[KEY_Stop_pin].group, _pins[KEY_Stop_pin].pin)==SET?1:0;
  237. #else
  238. return 1;
  239. #endif
  240. }
  241. int gpio_funckey_value(void) {
  242. return 0;
  243. }