ensure DR is read to clear idle/overflow interrupt when they occur independently of the rxne

This commit is contained in:
Peter Gibson 2023-06-14 11:56:44 +10:00
parent 64e3310e64
commit 837950cd74

View file

@ -21,27 +21,32 @@ impl<T: BasicInstance> interrupt::typelevel::Handler<T::Interrupt> for Interrupt
// RX
unsafe {
let sr = sr(r).read();
// Reading DR clears the rxne, error and idle interrupt flags on v1.
let dr = if sr.ore() || sr.idle() || sr.rxne() {
Some(rdr(r).read_volatile())
}
else {
None
};
clear_interrupt_flags(r, sr);
if sr.pe() {
warn!("Parity error");
}
if sr.fe() {
warn!("Framing error");
}
if sr.ne() {
warn!("Noise error");
}
if sr.ore() {
warn!("Overrun error");
}
if sr.rxne() {
if sr.pe() {
warn!("Parity error");
}
if sr.fe() {
warn!("Framing error");
}
if sr.ne() {
warn!("Noise error");
}
if sr.ore() {
warn!("Overrun error");
}
let mut rx_writer = state.rx_buf.writer();
let buf = rx_writer.push_slice();
if !buf.is_empty() {
// This read also clears the error and idle interrupt flags on v1.
buf[0] = rdr(r).read_volatile();
buf[0] = dr.unwrap();
rx_writer.push_done(1);
} else {
// FIXME: Should we disable any further RX interrupts when the buffer becomes full.
@ -54,7 +59,7 @@ impl<T: BasicInstance> interrupt::typelevel::Handler<T::Interrupt> for Interrupt
if sr.idle() {
state.rx_waker.wake();
};
}
}
// TX