mc_hall_gpio.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "bsp/mc_hall_gpio.h"
  2. #include "bsp/timer_count32.h"
  3. #include "os/os_task.h"
  4. static void _gpio_irq_enable(void);
  5. static hall_io_t g_hall;
  6. void mc_hall_init(void){
  7. gpio_init(HALL_1_GROUP, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, HALL_1_PIN);
  8. gpio_init(HALL_2_GROUP, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, HALL_2_PIN);
  9. gpio_init(HALL_3_GROUP, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, HALL_3_PIN);
  10. g_hall.is_edged = 0;
  11. g_hall.hall_time = 0;
  12. _gpio_irq_enable();
  13. }
  14. #if 0
  15. int get_hall_stat(int samples) {
  16. int h1 = 0, h2 = 0, h3 = 0;
  17. int tres = (samples + 1) / 2;
  18. while (samples--) {
  19. h1 += READ_HALL1();
  20. h2 += READ_HALL2();
  21. h3 += READ_HALL3();
  22. }
  23. #if HALL_PLACE==DEGREES_60
  24. return (((h2>tres)^1) << 2) | ((h3 > tres) << 1) | (h2 > tres);
  25. #else
  26. return (h1 > tres) | ((h2 > tres) << 1) | ((h3 > tres) << 2);
  27. #endif
  28. }
  29. #else
  30. int get_hall_stat(int samples) {
  31. #if HALL_PLACE==DEGREES_60
  32. return (((READ_HALL2())^1) << 2) | ((READ_HALL3()) << 1) | (READ_HALL1());
  33. #else
  34. return (READ_HALL1()) | ((READ_HALL2()) << 1) | ((READ_HALL3()) << 2);
  35. #endif
  36. }
  37. #endif
  38. u32 hall_get_hwcount(u8 *hall) {
  39. hall[0] = 1;//READ_HALL1();
  40. hall[1] = 0;//READ_HALL2();
  41. hall[2] = 1;//READ_HALL3();
  42. if (g_hall.is_edged) {
  43. g_hall.is_edged = 0;
  44. return g_hall.hall_time;
  45. }
  46. return timer_count32_get();
  47. }
  48. void hall_sensor_handler(void){
  49. os_disable_irq();
  50. g_hall.is_edged = 1;
  51. g_hall.hall_time = timer_count32_get();
  52. os_enable_irq();
  53. }
  54. #ifdef GD32_FOC_DEMO
  55. static void _gpio_irq_enable(void){
  56. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_6);
  57. exti_init(EXTI_6, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  58. exti_interrupt_flag_clear(EXTI_6);
  59. exti_interrupt_enable(EXTI_6);
  60. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_7);
  61. exti_init(EXTI_7, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  62. exti_interrupt_flag_clear(EXTI_7);
  63. exti_interrupt_enable(EXTI_7);
  64. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_0);
  65. exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  66. exti_interrupt_flag_clear(EXTI_0);
  67. exti_interrupt_enable(EXTI_0);
  68. nvic_irq_enable(EXTI5_9_IRQn, HALL_IRQ_PRIORITY, 0U);
  69. nvic_irq_enable(EXTI0_IRQn, HALL_IRQ_PRIORITY, 0U);
  70. }
  71. #else
  72. static void _gpio_irq_enable(void){
  73. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_6);
  74. exti_init(EXTI_6, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  75. exti_interrupt_flag_clear(EXTI_6);
  76. exti_interrupt_enable(EXTI_6);
  77. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_7);
  78. exti_init(EXTI_7, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  79. exti_interrupt_flag_clear(EXTI_7);
  80. exti_interrupt_enable(EXTI_7);
  81. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_8);
  82. exti_init(EXTI_8, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  83. exti_interrupt_flag_clear(EXTI_8);
  84. exti_interrupt_enable(EXTI_8);
  85. nvic_irq_enable(EXTI5_9_IRQn, HALL_IRQ_PRIORITY, 0U);
  86. }
  87. #endif