diff options
| -rw-r--r-- | embassy-nrf/src/buffered_uarte.rs | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/embassy-nrf/src/buffered_uarte.rs b/embassy-nrf/src/buffered_uarte.rs index c3cba2470..84ef86c96 100644 --- a/embassy-nrf/src/buffered_uarte.rs +++ b/embassy-nrf/src/buffered_uarte.rs | |||
| @@ -27,7 +27,7 @@ use futures::future::poll_fn; | |||
| 27 | // Re-export SVD variants to allow user to directly set values | 27 | // Re-export SVD variants to allow user to directly set values |
| 28 | pub use pac::uarte0::{baudrate::BAUDRATE_A as Baudrate, config::PARITY_A as Parity}; | 28 | pub use pac::uarte0::{baudrate::BAUDRATE_A as Baudrate, config::PARITY_A as Parity}; |
| 29 | 29 | ||
| 30 | use crate::gpio::Pin as GpioPin; | 30 | use crate::gpio::{self, Pin as GpioPin}; |
| 31 | use crate::interrupt::InterruptExt; | 31 | use crate::interrupt::InterruptExt; |
| 32 | use crate::ppi::{AnyConfigurableChannel, ConfigurableChannel, Event, Ppi, Task}; | 32 | use crate::ppi::{AnyConfigurableChannel, ConfigurableChannel, Event, Ppi, Task}; |
| 33 | use crate::timer::{Frequency, Instance as TimerInstance, Timer}; | 33 | use crate::timer::{Frequency, Instance as TimerInstance, Timer}; |
| @@ -427,23 +427,26 @@ impl<'u, 'd: 'u, U: UarteInstance, T: TimerInstance> embedded_io::asynch::Write | |||
| 427 | 427 | ||
| 428 | impl<'a, U: UarteInstance, T: TimerInstance> Drop for StateInner<'a, U, T> { | 428 | impl<'a, U: UarteInstance, T: TimerInstance> Drop for StateInner<'a, U, T> { |
| 429 | fn drop(&mut self) { | 429 | fn drop(&mut self) { |
| 430 | debug!("oh no, dropping uarte"); | ||
| 430 | let r = U::regs(); | 431 | let r = U::regs(); |
| 431 | 432 | ||
| 432 | // TODO this probably deadlocks. do like Uarte instead. | 433 | // TODO this probably deadlocks. do like Uarte instead. |
| 434 | r.inten.reset(); | ||
| 435 | r.events_rxto.reset(); | ||
| 436 | r.tasks_stoprx.write(|w| w.tasks_stoprx().set_bit()); | ||
| 433 | 437 | ||
| 434 | self.timer.stop(); | 438 | r.events_txstopped.reset(); |
| 435 | if let RxState::Receiving = self.rx_state { | 439 | r.tasks_stoptx.write(|w| w.tasks_stoptx().set_bit()); |
| 436 | r.tasks_stoprx.write(|w| unsafe { w.bits(1) }); | 440 | while !r.events_txstopped.read().events_txstopped().bit_is_set() {} |
| 437 | } | 441 | |
| 438 | if let TxState::Transmitting(_) = self.tx_state { | 442 | while !r.events_rxto.read().events_rxto().bit_is_set() {} |
| 439 | r.tasks_stoptx.write(|w| unsafe { w.bits(1) }); | 443 | |
| 440 | } | 444 | r.enable.write(|w| w.enable().disabled()); |
| 441 | if let RxState::Receiving = self.rx_state { | 445 | |
| 442 | low_power_wait_until(|| r.events_endrx.read().bits() == 1); | 446 | gpio::deconfigure_pin(r.psel.rxd.read().bits()); |
| 443 | } | 447 | gpio::deconfigure_pin(r.psel.txd.read().bits()); |
| 444 | if let TxState::Transmitting(_) = self.tx_state { | 448 | gpio::deconfigure_pin(r.psel.rts.read().bits()); |
| 445 | low_power_wait_until(|| r.events_endtx.read().bits() == 1); | 449 | gpio::deconfigure_pin(r.psel.cts.read().bits()); |
| 446 | } | ||
| 447 | } | 450 | } |
| 448 | } | 451 | } |
| 449 | 452 | ||
