summaryrefslogtreecommitdiff
path: root/chip/stm32/usart_rx_interrupt.c
diff options
context:
space:
mode:
Diffstat (limited to 'chip/stm32/usart_rx_interrupt.c')
-rw-r--r--chip/stm32/usart_rx_interrupt.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/chip/stm32/usart_rx_interrupt.c b/chip/stm32/usart_rx_interrupt.c
index ea1b4a4c6a..d4fb48f5a0 100644
--- a/chip/stm32/usart_rx_interrupt.c
+++ b/chip/stm32/usart_rx_interrupt.c
@@ -3,7 +3,7 @@
* found in the LICENSE file.
*/
-/* Interrupt based USART RX driver for STM32 */
+/* Interrupt based USART RX driver for STM32F0 and STM32F3 */
#include "usart.h"
@@ -18,20 +18,20 @@ static void usart_rx_init(struct usart_config const *config)
STM32_USART_CR1(base) |= STM32_USART_CR1_RXNEIE;
STM32_USART_CR1(base) |= STM32_USART_CR1_RE;
+ STM32_USART_CR3(base) |= STM32_USART_CR3_OVRDIS;
}
static void usart_rx_interrupt_handler(struct usart_config const *config)
{
- intptr_t base = config->hw->base;
- uint8_t byte;
-
- if (!(STM32_USART_SR(base) & STM32_USART_SR_RXNE))
- return;
+ intptr_t base = config->hw->base;
+ int32_t status = STM32_USART_SR(base);
- byte = STM32_USART_RDR(base);
+ if (status & STM32_USART_SR_RXNE) {
+ uint8_t byte = STM32_USART_RDR(base);
- if (!queue_add_unit(config->producer.queue, &byte))
- atomic_add(&config->state->rx_dropped, 1);
+ if (!queue_add_unit(config->producer.queue, &byte))
+ atomic_add(&config->state->rx_dropped, 1);
+ }
}
struct usart_rx const usart_rx_interrupt = {