#include "bsp/mc_hall_gpio.h" static void _gpio_irq_enable(void); void mc_hall_init(void){ rcu_periph_clock_enable(HALL_GPOI_CLK); gpio_init(HALL_1_GROUP, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, HALL_1_PIN); gpio_init(HALL_2_GROUP, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, HALL_2_PIN); gpio_init(HALL_3_GROUP, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, HALL_3_PIN); _gpio_irq_enable(); } int get_hall_stat(int samples) { samples = 1 + 2 * samples; int h1 = 0, h2 = 0, h3 = 0; int tres = samples / 2; while (samples--) { h1 += READ_HALL1(); h2 += READ_HALL2(); h3 += READ_HALL3(); } return (h1 > tres) | ((h2 > tres) << 1) | ((h3 > tres) << 2); } static void _gpio_irq_enable(void){ gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_6); exti_init(EXTI_6, EXTI_INTERRUPT, EXTI_TRIG_BOTH); exti_interrupt_flag_clear(EXTI_6); exti_interrupt_enable(EXTI_6); gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_7); exti_init(EXTI_7, EXTI_INTERRUPT, EXTI_TRIG_BOTH); exti_interrupt_flag_clear(EXTI_7); exti_interrupt_enable(EXTI_7); gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_8); exti_init(EXTI_8, EXTI_INTERRUPT, EXTI_TRIG_BOTH); exti_interrupt_flag_clear(EXTI_8); exti_interrupt_enable(EXTI_8); nvic_irq_enable(EXTI5_9_IRQn, 3U, 0U); }