diff --git a/src/hal/STM32/hal_STM32_cpp.h b/src/hal/STM32/hal_STM32_cpp.h index a1bd539..75bebcb 100644 --- a/src/hal/STM32/hal_STM32_cpp.h +++ b/src/hal/STM32/hal_STM32_cpp.h @@ -200,6 +200,30 @@ void hal_print_pin_name(int pinnum) { } } +IRQn_Type hal_get_irqn_from_pin(int pin) { + // converts an arduino pin number to a STM32 HAL interrupt id + // taken from https://github.com/stm32duino/Arduino_Core_STM32/blob/main/libraries/SrcWrapper/src/stm32/interrupt.cpp#L158 + PinName pinName = digitalPinToPinName(pin); + uint16_t gpioPin = STM_GPIO_PIN(pinName); + uint8_t id = 0; + + while (gpioPin != 0x0001) { + gpioPin = gpioPin >> 1; + id++; + } + + switch (id) { + case 0: return EXTI0_IRQn; + case 1: return EXTI1_IRQn; + case 2: return EXTI2_IRQn; + case 3: return EXTI3_IRQn; + case 4: return EXTI4_IRQn; + case 5: case 6: case 7: case 8: case 9: + return EXTI9_5_IRQn; + default: + return EXTI15_10_IRQn; + } +} MF_Serial* hal_get_ser_bus(int bus_id, int baud, MF_SerialMode mode, bool invert) { if(bus_id < 0 || bus_id >= HAL_SER_NUM) return nullptr; diff --git a/src/imu/imu_cpp.h b/src/imu/imu_cpp.h index 02477ff..d776ac4 100644 --- a/src/imu/imu_cpp.h +++ b/src/imu/imu_cpp.h @@ -389,6 +389,10 @@ void _imu_ll_interrupt_handler(); void _imu_ll_interrupt_setup(int interrupt_pin) { Serial.println(MF_MOD ": IMU_EXEC_IRQ"); attachInterrupt(digitalPinToInterrupt(interrupt_pin), _imu_ll_interrupt_handler, RISING); + #ifdef ARDUINO_ARCH_STM32 + // (#79) on stm32, set the interrupt to the highest priority, otherwise it does not get called + HAL_NVIC_SetPriority(hal_get_irqn_from_pin(interrupt_pin), 0, 0); + #endif } inline void _imu_ll_interrupt_handler2() {