diff --git a/radio/src/targets/common/arm/stm32/heartbeat_driver.cpp b/radio/src/targets/common/arm/stm32/heartbeat_driver.cpp index 898814a8b..4968bd5b3 100644 --- a/radio/src/targets/common/arm/stm32/heartbeat_driver.cpp +++ b/radio/src/targets/common/arm/stm32/heartbeat_driver.cpp @@ -53,9 +53,7 @@ void stop_intmodule_heartbeat() { heartbeatCapture.valid = false; -#if !defined(INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER) - NVIC_DisableIRQ(INTMODULE_HEARTBEAT_EXTI_IRQn); -#endif + // Never disable EXTI_IRQ, just remove INTMODULE_HEARTBEAT_EXTI_LINE from configuration as EXTI can be reused EXTI_InitTypeDef EXTI_InitStructure; EXTI_StructInit(&EXTI_InitStructure); @@ -89,9 +87,11 @@ void check_intmodule_heartbeat() #if defined(INTMODULE_HEARTBEAT) && !defined(INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER) extern "C" void INTMODULE_HEARTBEAT_EXTI_IRQHandler() { + // Check as first because it is the most critical one +#if defined(TELEMETRY_EXTI_REUSE_INTERRUPT_INTMODULE_HEARTBEAT) + check_telemetry_exti(); +#endif + check_intmodule_heartbeat(); - #if defined(TELEMETRY_EXTI_REUSE_INTERRUPT_INTMODULE_HEARTBEAT) - check_telemetry_exti(); - #endif } #endif diff --git a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp index 570e134b1..503b84943 100644 --- a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp +++ b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp @@ -118,6 +118,11 @@ void rotaryEncoderStartDelay() extern "C" void ROTARY_ENCODER_EXTI_IRQHandler1(void) { + // Check as first because it is the most critical one +#if !defined(BOOT) && defined(TELEMETRY_EXTI_REUSE_INTERRUPT_ROTARY_ENCODER) + check_telemetry_exti(); +#endif + if (EXTI_GetITStatus(ROTARY_ENCODER_EXTI_LINE1) != RESET) { rotaryEncoderStartDelay(); EXTI_ClearITPendingBit(ROTARY_ENCODER_EXTI_LINE1); @@ -133,10 +138,6 @@ extern "C" void ROTARY_ENCODER_EXTI_IRQHandler1(void) #if !defined(BOOT) && defined(INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER) check_intmodule_heartbeat(); #endif - -#if !defined(BOOT) && defined(TELEMETRY_EXTI_REUSE_INTERRUPT_ROTARY_ENCODER) - check_telemetry_exti(); -#endif } #if defined(ROTARY_ENCODER_EXTI_IRQn2) diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index c16d6feca..bb5618d23 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -166,13 +166,15 @@ void telemetryPortInvertedInit(uint32_t baudrate) //TODO: // - handle conflict with HEARTBEAT disabled for trainer input... // - probably need to stop trainer input/output and restore after this is closed -#if !defined(TELEMETRY_EXTI_REUSE_INTERRUPT_ROTARY_ENCODER) && !defined(TELEMETRY_EXTI_REUSE_INTERRUPT_INTMODULE_HEARTBEAT) NVIC_SetPriority(TELEMETRY_EXTI_IRQn, 0); - NVIC_EnableIRQ(TELEMETRY_EXTI_IRQn); -#endif + + // In case shared IRQ is not enabled + if ((NVIC->ISER[(uint32_t)((int32_t)TELEMETRY_EXTI_IRQn) >> 5] & (uint32_t)(1 << ((uint32_t)((int32_t)TELEMETRY_EXTI_IRQn) & (uint32_t)0x1F))) == 0) { + NVIC_EnableIRQ(TELEMETRY_EXTI_IRQn); + } } -void telemetryPortInvertedRxBit() +inline void telemetryPortInvertedRxBit() { if (rxBitCount < 8) { if (rxBitCount == 0) { @@ -189,15 +191,14 @@ void telemetryPortInvertedRxBit() ++rxBitCount; } else if (rxBitCount == 8) { + // disable timer + TELEMETRY_TIMER->CR1 &= ~TIM_CR1_CEN; telemetryFifo.push(rxByte); rxBitCount = 0; - // disable timer - TELEMETRY_TIMER->CR1 &= ~TIM_CR1_CEN; - // re-enable start bit interrupt - EXTI->IMR |= EXTI_IMR_MR6; + EXTI->IMR |= TELEMETRY_EXTI_LINE; } } @@ -361,7 +362,7 @@ void check_telemetry_exti() TELEMETRY_TIMER->CR1 |= TIM_CR1_CEN; // disable start bit interrupt - EXTI->IMR &= ~EXTI_IMR_MR6; + EXTI->IMR &= ~TELEMETRY_EXTI_LINE; } EXTI_ClearITPendingBit(TELEMETRY_EXTI_LINE);