From cf4de96aee8bf0c41ec9ff9ffba19e4598e8dc80 Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Sun, 11 Aug 2019 21:42:44 +0200 Subject: [PATCH] Clear UART errors after we've detected and reported them Signed-off-by: Daniel Egger --- CHANGELOG.md | 4 ++++ src/serial.rs | 22 +++++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f7124f..73bc733 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +### Fixed + +- Clear UART errors in hardware after handling them + ## [v0.15.0] - 2019-08-09 ### Changed diff --git a/src/serial.rs b/src/serial.rs index 504bf6a..3beca39 100644 --- a/src/serial.rs +++ b/src/serial.rs @@ -571,7 +571,7 @@ fn read(usart: *const SerialRegisterBlock) -> nb::Result { // NOTE(unsafe) atomic read with no side effects let isr = unsafe { (*usart).isr.read() }; - Err(if isr.pe().bit_is_set() { + let err = if isr.pe().bit_is_set() { nb::Error::Other(Error::Parity) } else if isr.fe().bit_is_set() { nb::Error::Other(Error::Framing) @@ -583,6 +583,22 @@ fn read(usart: *const SerialRegisterBlock) -> nb::Result { // NOTE(read_volatile) see `write_volatile` below return Ok(unsafe { ptr::read_volatile(&(*usart).rdr as *const _ as *const _) }); } else { - nb::Error::WouldBlock - }) + return Err(nb::Error::WouldBlock); + }; + + // NOTE(unsafe) atomic write with no side effects other than clearing the errors we've just handled + unsafe { + (*usart).icr.write(|w| { + w.pecf() + .set_bit() + .fecf() + .set_bit() + .ncf() + .set_bit() + .orecf() + .set_bit() + }) + }; + + return Err(err); }