aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libmaple/usart_private.h17
1 files changed, 12 insertions, 5 deletions
diff --git a/libmaple/usart_private.h b/libmaple/usart_private.h
index 8e8e11b..9bc0527 100644
--- a/libmaple/usart_private.h
+++ b/libmaple/usart_private.h
@@ -38,14 +38,21 @@
#include <libmaple/usart.h>
static __always_inline void usart_irq(ring_buffer *rb, usart_reg_map *regs) {
+ /* We can get RXNE and ORE interrupts here. Only RXNE signifies
+ * availability of a byte in DR.
+ *
+ * See table 198 (sec 27.4, p809) in STM document RM0008 rev 15.
+ * We enable RXNEIE. */
+ if (regs->SR & USART_SR_RXNE) {
#ifdef USART_SAFE_INSERT
- /* If the buffer is full and the user defines USART_SAFE_INSERT,
- * ignore new bytes. */
- rb_safe_insert(rb, (uint8)regs->DR);
+ /* If the buffer is full and the user defines USART_SAFE_INSERT,
+ * ignore new bytes. */
+ rb_safe_insert(rb, (uint8)regs->DR);
#else
- /* By default, push bytes around in the ring buffer. */
- rb_push_insert(rb, (uint8)regs->DR);
+ /* By default, push bytes around in the ring buffer. */
+ rb_push_insert(rb, (uint8)regs->DR);
#endif
+ }
}
uint32 _usart_clock_freq(usart_dev *dev);