aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoseph Birr-Pixton <jpixton@gmail.com>2015-03-10 19:47:07 +0000
committerbnewbold <bnewbold@robocracy.org>2015-05-27 20:48:37 -0700
commit5ada40e35c157362f4d3e2c59677d6ea9b648069 (patch)
tree23c838da587918c616bd0047e2ec096b1f7fba38
parent277d535af458074a14afa3e902378cd70a2f77f7 (diff)
downloadlibrambutan-5ada40e35c157362f4d3e2c59677d6ea9b648069.tar.gz
librambutan-5ada40e35c157362f4d3e2c59677d6ea9b648069.zip
Fix hang on usart read overrun.
This is improved on the previous patch: if we get an ORE without RXNE when we don't write a junk byte to our buffer. It also avoids the strange-looking blind read. See issue #107 for more info. Signed-off-by: Joseph Birr-Pixton <jpixton@gmail.com>
-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);