diff options
author | Joseph Birr-Pixton <jpixton@gmail.com> | 2015-03-10 19:47:07 +0000 |
---|---|---|
committer | bnewbold <bnewbold@robocracy.org> | 2015-05-27 20:48:37 -0700 |
commit | 5ada40e35c157362f4d3e2c59677d6ea9b648069 (patch) | |
tree | 23c838da587918c616bd0047e2ec096b1f7fba38 | |
parent | 277d535af458074a14afa3e902378cd70a2f77f7 (diff) | |
download | librambutan-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.h | 17 |
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); |