diff options
Diffstat (limited to 'chip/stm32/usart_rx_interrupt.c')
-rw-r--r-- | chip/stm32/usart_rx_interrupt.c | 18 |
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 = { |