diff options
| author | Jan Špaček <[email protected]> | 2024-05-26 16:21:11 +0200 |
|---|---|---|
| committer | Jan Špaček <[email protected]> | 2024-06-01 19:46:39 +0200 |
| commit | ade27b7f212f9548816e5ae21826a230c2345574 (patch) | |
| tree | 177efd1346ae09ae71d357ec64824ebd53c06e4e | |
| parent | 41711195e305e45caec3ff8316688a6b6d6af955 (diff) | |
stm32/usart: disconnect pins of RingBufferedUartRx on drop
| -rw-r--r-- | embassy-stm32/src/usart/ringbuffered.rs | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/embassy-stm32/src/usart/ringbuffered.rs b/embassy-stm32/src/usart/ringbuffered.rs index f3a88b93f..8cf75933a 100644 --- a/embassy-stm32/src/usart/ringbuffered.rs +++ b/embassy-stm32/src/usart/ringbuffered.rs | |||
| @@ -4,10 +4,12 @@ use core::sync::atomic::{compiler_fence, Ordering}; | |||
| 4 | use core::task::Poll; | 4 | use core::task::Poll; |
| 5 | 5 | ||
| 6 | use embassy_embedded_hal::SetConfig; | 6 | use embassy_embedded_hal::SetConfig; |
| 7 | use embassy_hal_internal::PeripheralRef; | ||
| 7 | use futures_util::future::{select, Either}; | 8 | use futures_util::future::{select, Either}; |
| 8 | 9 | ||
| 9 | use super::{clear_interrupt_flags, rdr, reconfigure, sr, Config, ConfigError, Error, Info, State, UartRx}; | 10 | use super::{clear_interrupt_flags, rdr, reconfigure, sr, Config, ConfigError, Error, Info, State, UartRx}; |
| 10 | use crate::dma::ReadableRingBuffer; | 11 | use crate::dma::ReadableRingBuffer; |
| 12 | use crate::gpio::{AnyPin, SealedPin as _}; | ||
| 11 | use crate::mode::Async; | 13 | use crate::mode::Async; |
| 12 | use crate::time::Hertz; | 14 | use crate::time::Hertz; |
| 13 | use crate::usart::{Regs, Sr}; | 15 | use crate::usart::{Regs, Sr}; |
| @@ -19,6 +21,8 @@ pub struct RingBufferedUartRx<'d> { | |||
| 19 | info: &'static Info, | 21 | info: &'static Info, |
| 20 | state: &'static State, | 22 | state: &'static State, |
| 21 | kernel_clock: Hertz, | 23 | kernel_clock: Hertz, |
| 24 | rx: Option<PeripheralRef<'d, AnyPin>>, | ||
| 25 | rts: Option<PeripheralRef<'d, AnyPin>>, | ||
| 22 | ring_buf: ReadableRingBuffer<'d, u8>, | 26 | ring_buf: ReadableRingBuffer<'d, u8>, |
| 23 | } | 27 | } |
| 24 | 28 | ||
| @@ -49,6 +53,8 @@ impl<'d> UartRx<'d, Async> { | |||
| 49 | let state = self.state; | 53 | let state = self.state; |
| 50 | let kernel_clock = self.kernel_clock; | 54 | let kernel_clock = self.kernel_clock; |
| 51 | let ring_buf = unsafe { ReadableRingBuffer::new(rx_dma, request, rdr(info.regs), dma_buf, opts) }; | 55 | let ring_buf = unsafe { ReadableRingBuffer::new(rx_dma, request, rdr(info.regs), dma_buf, opts) }; |
| 56 | let rx = unsafe { self.rx.as_ref().map(|x| x.clone_unchecked()) }; | ||
| 57 | let rts = unsafe { self.rts.as_ref().map(|x| x.clone_unchecked()) }; | ||
| 52 | 58 | ||
| 53 | // Don't disable the clock | 59 | // Don't disable the clock |
| 54 | mem::forget(self); | 60 | mem::forget(self); |
| @@ -57,6 +63,8 @@ impl<'d> UartRx<'d, Async> { | |||
| 57 | info, | 63 | info, |
| 58 | state, | 64 | state, |
| 59 | kernel_clock, | 65 | kernel_clock, |
| 66 | rx, | ||
| 67 | rts, | ||
| 60 | ring_buf, | 68 | ring_buf, |
| 61 | } | 69 | } |
| 62 | } | 70 | } |
| @@ -221,6 +229,8 @@ impl<'d> RingBufferedUartRx<'d> { | |||
| 221 | impl Drop for RingBufferedUartRx<'_> { | 229 | impl Drop for RingBufferedUartRx<'_> { |
| 222 | fn drop(&mut self) { | 230 | fn drop(&mut self) { |
| 223 | self.teardown_uart(); | 231 | self.teardown_uart(); |
| 232 | self.rx.as_ref().map(|x| x.set_as_disconnected()); | ||
| 233 | self.rts.as_ref().map(|x| x.set_as_disconnected()); | ||
| 224 | super::drop_tx_rx(self.info, self.state); | 234 | super::drop_tx_rx(self.info, self.state); |
| 225 | } | 235 | } |
| 226 | } | 236 | } |
