From 07d0a663680f8f6b37174c1aeddca1e0669c8830 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 27 Sep 2021 08:53:59 +0200 Subject: [PATCH] telemetry driver: clear TC flag before re-enabling TC interrupt This prevents the USART TC IRQ handler to trigger right after the DMA request has completed, and thus turning the output OFF before the last byte has been transmitted. Resolves #801 --- radio/src/targets/horus/telemetry_driver.cpp | 4 ++++ radio/src/targets/nv14/telemetry_driver.cpp | 4 ++++ radio/src/targets/taranis/telemetry_driver.cpp | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/radio/src/targets/horus/telemetry_driver.cpp b/radio/src/targets/horus/telemetry_driver.cpp index baf41346f..eb886246f 100644 --- a/radio/src/targets/horus/telemetry_driver.cpp +++ b/radio/src/targets/horus/telemetry_driver.cpp @@ -343,7 +343,11 @@ extern "C" void TELEMETRY_DMA_TX_IRQHandler(void) DEBUG_INTERRUPT(INT_TELEM_DMA); if (DMA_GetITStatus(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC)) { DMA_ClearITPendingBit(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC); + + // clear TC flag before enabling interrupt + TELEMETRY_USART->SR &= ~USART_SR_TC; TELEMETRY_USART->CR1 |= USART_CR1_TCIE; + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { outputTelemetryBuffer.reset(); } diff --git a/radio/src/targets/nv14/telemetry_driver.cpp b/radio/src/targets/nv14/telemetry_driver.cpp index d2fa496ed..89d3b81d6 100644 --- a/radio/src/targets/nv14/telemetry_driver.cpp +++ b/radio/src/targets/nv14/telemetry_driver.cpp @@ -166,7 +166,11 @@ extern "C" void TELEMETRY_DMA_TX_IRQHandler(void) DEBUG_INTERRUPT(INT_TELEM_DMA); if (DMA_GetITStatus(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC)) { DMA_ClearITPendingBit(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC); + + // clear TC flag before enabling interrupt + TELEMETRY_USART->SR &= ~USART_SR_TC; TELEMETRY_USART->CR1 |= USART_CR1_TCIE; + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { outputTelemetryBuffer.reset(); } diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index c888aa79a..8ffb3c1ce 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -314,7 +314,11 @@ extern "C" void TELEMETRY_DMA_TX_IRQHandler(void) DEBUG_INTERRUPT(INT_TELEM_DMA); if (DMA_GetITStatus(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC)) { DMA_ClearITPendingBit(TELEMETRY_DMA_Stream_TX, TELEMETRY_DMA_TX_FLAG_TC); + + // clear TC flag before enabling interrupt + TELEMETRY_USART->SR &= ~USART_SR_TC; TELEMETRY_USART->CR1 |= USART_CR1_TCIE; + if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { outputTelemetryBuffer.reset(); }