diff --git a/radio/src/targets/common/arm/stm32/extmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/extmodule_serial_driver.cpp index 8453aba48..6329eedac 100644 --- a/radio/src/targets/common/arm/stm32/extmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/extmodule_serial_driver.cpp @@ -67,6 +67,7 @@ static const stm32_usart_t extmoduleUSART = { .GPIOx = EXTMODULE_TX_GPIO, .pinInit = &extmoduleUSART_PinDef, .IRQn = EXTMODULE_USART_IRQn, + .IRQ_Prio = EXTMODULE_USART_IRQ_PRIORITY, .DMAx = EXTMODULE_USART_TX_DMA, .DMA_Stream = EXTMODULE_USART_TX_DMA_STREAM_LL, .DMA_Channel = EXTMODULE_USART_TX_DMA_CHANNEL, diff --git a/radio/src/targets/common/arm/stm32/extmodule_serial_driver.h b/radio/src/targets/common/arm/stm32/extmodule_serial_driver.h index fc470cf46..c12246b1f 100644 --- a/radio/src/targets/common/arm/stm32/extmodule_serial_driver.h +++ b/radio/src/targets/common/arm/stm32/extmodule_serial_driver.h @@ -24,6 +24,8 @@ #include #include "hal/serial_driver.h" +#define EXTMODULE_USART_IRQ_PRIORITY 6 + // Callbacks using intmoduleFifo void extmoduleFifoReceive(uint8_t data); void extmoduleFifoError(); diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index ca4373bc9..4c91af469 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -78,6 +78,7 @@ static const stm32_usart_t intmoduleUSART = { .GPIOx = INTMODULE_GPIO, .pinInit = &intmoduleUSART_PinDef, .IRQn = INTMODULE_USART_IRQn, + .IRQ_Prio = INTMODULE_USART_IRQ_PRIORITY, .DMAx = INTMODULE_DMA, .DMA_Stream = INTMODULE_DMA_STREAM_LL, .DMA_Channel = INTMODULE_DMA_CHANNEL, diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.h b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.h index b07ec6a63..4ae11f99a 100644 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.h +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.h @@ -24,6 +24,8 @@ #include #include "hal/serial_driver.h" +#define INTMODULE_USART_IRQ_PRIORITY 6 + // Callbacks using intmoduleFifo void intmoduleFifoReceive(uint8_t data); void intmoduleFifoError(); diff --git a/radio/src/targets/common/arm/stm32/stm32_usart_driver.cpp b/radio/src/targets/common/arm/stm32/stm32_usart_driver.cpp index 9f8809a9b..43a5c592c 100644 --- a/radio/src/targets/common/arm/stm32/stm32_usart_driver.cpp +++ b/radio/src/targets/common/arm/stm32/stm32_usart_driver.cpp @@ -82,7 +82,7 @@ void stm32_usart_init(const stm32_usart_t* usart, const etx_serial_init* params) if (!usart->DMAx || params->rx_enable) { // TODO: configurable priority ??? - NVIC_SetPriority(usart->IRQn, 6); + NVIC_SetPriority(usart->IRQn, usart->IRQ_Prio); NVIC_EnableIRQ(usart->IRQn); } } @@ -107,6 +107,7 @@ void stm32_usart_deinit(const stm32_usart_t* usart) void stm32_usart_send_byte(const stm32_usart_t* usart, uint8_t byte) { + // TODO: split into 2 steps to avoid blocking on send while (!LL_USART_IsActiveFlag_TXE(usart->USARTx)); LL_USART_TransmitData8(usart->USARTx, byte); } @@ -177,18 +178,7 @@ void stm32_usart_isr(const stm32_usart_t* usart, etx_serial_callbacks_t* cb) { uint32_t status = LL_USART_ReadReg(usart->USARTx, SR); - // IRQ based send: TXE IRQ is enabled only during transfer - if (LL_USART_IsEnabledIT_TXE(usart->USARTx) && (status & LL_USART_SR_TXE)) { - - uint8_t data; - if (cb->on_send && cb->on_send(data)) { - LL_USART_TransmitData8(usart->USARTx, data); - } else { - LL_USART_DisableIT_TXE(usart->USARTx); - } - } - - // Receive + // Receive: do it first as it is more time critical if (LL_USART_IsEnabledIT_TXE(usart->USARTx)) { // Drain RX @@ -209,4 +199,15 @@ void stm32_usart_isr(const stm32_usart_t* usart, etx_serial_callbacks_t* cb) status = LL_USART_ReadReg(usart->USARTx, SR); } } + + // IRQ based send: TXE IRQ is enabled only during transfer + if (LL_USART_IsEnabledIT_TXE(usart->USARTx) && (status & LL_USART_SR_TXE)) { + + uint8_t data; + if (cb->on_send && cb->on_send(data)) { + LL_USART_TransmitData8(usart->USARTx, data); + } else { + LL_USART_DisableIT_TXE(usart->USARTx); + } + } } diff --git a/radio/src/targets/common/arm/stm32/stm32_usart_driver.h b/radio/src/targets/common/arm/stm32/stm32_usart_driver.h index 58b6a5d7d..a662f388a 100644 --- a/radio/src/targets/common/arm/stm32/stm32_usart_driver.h +++ b/radio/src/targets/common/arm/stm32/stm32_usart_driver.h @@ -31,7 +31,10 @@ struct stm32_usart_t { USART_TypeDef* USARTx; GPIO_TypeDef* GPIOx; const LL_GPIO_InitTypeDef* pinInit; + + // USART IRQ IRQn_Type IRQn; + uint8_t IRQ_Prio; // TX DMA defs DMA_TypeDef* DMAx;