mc_hall_gpio.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #include "bsp/mc_hall_gpio.h"
  2. static void _gpio_irq_enable(void);
  3. void mc_hall_init(void){
  4. rcu_periph_clock_enable(HALL_GPOI_CLK);
  5. gpio_init(HALL_1_GROUP, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, HALL_1_PIN);
  6. gpio_init(HALL_2_GROUP, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, HALL_2_PIN);
  7. gpio_init(HALL_3_GROUP, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, HALL_3_PIN);
  8. _gpio_irq_enable();
  9. }
  10. int get_hall_stat(int samples) {
  11. samples = 1 + 2 * samples;
  12. int h1 = 0, h2 = 0, h3 = 0;
  13. int tres = samples / 2;
  14. while (samples--) {
  15. h1 += READ_HALL1();
  16. h2 += READ_HALL2();
  17. h3 += READ_HALL3();
  18. }
  19. return (h1 > tres) | ((h2 > tres) << 1) | ((h3 > tres) << 2);
  20. }
  21. static void _gpio_irq_enable(void){
  22. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_6);
  23. exti_init(EXTI_6, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  24. exti_interrupt_flag_clear(EXTI_6);
  25. exti_interrupt_enable(EXTI_6);
  26. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_7);
  27. exti_init(EXTI_7, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  28. exti_interrupt_flag_clear(EXTI_7);
  29. exti_interrupt_enable(EXTI_7);
  30. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_8);
  31. exti_init(EXTI_8, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
  32. exti_interrupt_flag_clear(EXTI_8);
  33. exti_interrupt_enable(EXTI_8);
  34. nvic_irq_enable(EXTI5_9_IRQn, 3U, 0U);
  35. }