mc_hall_gpio.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "bsp/mc_hall_gpio.h"
  2. #include "bsp/delay.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_IPU, GPIO_OSPEED_50MHZ, HALL_1_PIN);
  8. gpio_init(HALL_2_GROUP, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, HALL_2_PIN);
  9. gpio_init(HALL_3_GROUP, GPIO_MODE_IPU, 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 1
  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. task_udelay(5);
  23. }
  24. #if HALL_PLACE==DEGREES_60
  25. return (((h2>tres)^1) << 2) | ((h3 > tres) << 1) | (h2 > tres);
  26. #else
  27. return (h1 > tres) | ((h2 > tres) << 1) | ((h3 > tres) << 2);
  28. #endif
  29. }
  30. #else
  31. int get_hall_stat(int samples) {
  32. #if HALL_PLACE==DEGREES_60
  33. return (((READ_HALL2())^1) << 2) | ((READ_HALL3()) << 1) | (READ_HALL1());
  34. #else
  35. return (READ_HALL1()) | ((READ_HALL2()) << 1) | ((READ_HALL3()) << 2);
  36. #endif
  37. }
  38. #endif
  39. u32 hall_get_hwcount(u8 *hall) {
  40. hall[0] = 1;//READ_HALL1();
  41. hall[1] = 0;//READ_HALL2();
  42. hall[2] = 1;//READ_HALL3();
  43. if (g_hall.is_edged) {
  44. g_hall.is_edged = 0;
  45. return g_hall.hall_time;
  46. }
  47. return task_get_usecond();
  48. }
  49. void hall_sensor_handler(void){
  50. }
  51. #ifdef GD32_FOC_DEMO
  52. static void _gpio_irq_enable(void){
  53. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_6);
  54. exti_init(EXTI_6, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  55. exti_interrupt_flag_clear(EXTI_6);
  56. exti_interrupt_enable(EXTI_6);
  57. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_7);
  58. exti_init(EXTI_7, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  59. exti_interrupt_flag_clear(EXTI_7);
  60. exti_interrupt_enable(EXTI_7);
  61. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_0);
  62. exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  63. exti_interrupt_flag_clear(EXTI_0);
  64. exti_interrupt_enable(EXTI_0);
  65. nvic_irq_enable(EXTI5_9_IRQn, HALL_IRQ_PRIORITY, 0U);
  66. nvic_irq_enable(EXTI0_IRQn, HALL_IRQ_PRIORITY, 0U);
  67. }
  68. #else
  69. static void _gpio_irq_enable(void){
  70. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_6);
  71. exti_init(EXTI_6, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  72. exti_interrupt_flag_clear(EXTI_6);
  73. exti_interrupt_enable(EXTI_6);
  74. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_7);
  75. exti_init(EXTI_7, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  76. exti_interrupt_flag_clear(EXTI_7);
  77. exti_interrupt_enable(EXTI_7);
  78. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_8);
  79. exti_init(EXTI_8, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  80. exti_interrupt_flag_clear(EXTI_8);
  81. exti_interrupt_enable(EXTI_8);
  82. nvic_irq_enable(EXTI5_9_IRQn, HALL_IRQ_PRIORITY, 0U);
  83. }
  84. #endif