diff options
| -rw-r--r-- | embassy-stm32/src/usart/buffered.rs | 8 | ||||
| -rw-r--r-- | embassy-stm32/src/usart/mod.rs | 38 | ||||
| -rw-r--r-- | examples/stm32g0/src/bin/onewire_ds18b20.rs | 13 |
3 files changed, 16 insertions, 43 deletions
diff --git a/embassy-stm32/src/usart/buffered.rs b/embassy-stm32/src/usart/buffered.rs index 2dfb99dbc..57551ff56 100644 --- a/embassy-stm32/src/usart/buffered.rs +++ b/embassy-stm32/src/usart/buffered.rs | |||
| @@ -13,7 +13,7 @@ use embassy_sync::waitqueue::AtomicWaker; | |||
| 13 | use super::DePin; | 13 | use super::DePin; |
| 14 | use super::{ | 14 | use super::{ |
| 15 | clear_interrupt_flags, configure, half_duplex_set_rx_tx_before_write, rdr, reconfigure, send_break, set_baudrate, | 15 | clear_interrupt_flags, configure, half_duplex_set_rx_tx_before_write, rdr, reconfigure, send_break, set_baudrate, |
| 16 | sr, tdr, Config, ConfigError, CtsPin, Duplex, Error, HalfDuplexConfig, HalfDuplexReadback, Info, Instance, Regs, | 16 | sr, tdr, Config, ConfigError, CtsPin, Duplex, Error, HalfDuplexReadback, Info, Instance, Regs, |
| 17 | RtsPin, RxPin, TxPin, | 17 | RtsPin, RxPin, TxPin, |
| 18 | }; | 18 | }; |
| 19 | use crate::gpio::{AfType, AnyPin, Pull, SealedPin as _}; | 19 | use crate::gpio::{AfType, AnyPin, Pull, SealedPin as _}; |
| @@ -346,7 +346,6 @@ impl<'d> BufferedUart<'d> { | |||
| 346 | rx_buffer: &'d mut [u8], | 346 | rx_buffer: &'d mut [u8], |
| 347 | mut config: Config, | 347 | mut config: Config, |
| 348 | readback: HalfDuplexReadback, | 348 | readback: HalfDuplexReadback, |
| 349 | half_duplex: HalfDuplexConfig, | ||
| 350 | ) -> Result<Self, ConfigError> { | 349 | ) -> Result<Self, ConfigError> { |
| 351 | #[cfg(not(any(usart_v1, usart_v2)))] | 350 | #[cfg(not(any(usart_v1, usart_v2)))] |
| 352 | { | 351 | { |
| @@ -357,7 +356,7 @@ impl<'d> BufferedUart<'d> { | |||
| 357 | Self::new_inner( | 356 | Self::new_inner( |
| 358 | peri, | 357 | peri, |
| 359 | None, | 358 | None, |
| 360 | new_pin!(tx, half_duplex.af_type()), | 359 | new_pin!(tx, config.tx_af()), |
| 361 | None, | 360 | None, |
| 362 | None, | 361 | None, |
| 363 | None, | 362 | None, |
| @@ -386,14 +385,13 @@ impl<'d> BufferedUart<'d> { | |||
| 386 | rx_buffer: &'d mut [u8], | 385 | rx_buffer: &'d mut [u8], |
| 387 | mut config: Config, | 386 | mut config: Config, |
| 388 | readback: HalfDuplexReadback, | 387 | readback: HalfDuplexReadback, |
| 389 | half_duplex: HalfDuplexConfig, | ||
| 390 | ) -> Result<Self, ConfigError> { | 388 | ) -> Result<Self, ConfigError> { |
| 391 | config.swap_rx_tx = true; | 389 | config.swap_rx_tx = true; |
| 392 | config.duplex = Duplex::Half(readback); | 390 | config.duplex = Duplex::Half(readback); |
| 393 | 391 | ||
| 394 | Self::new_inner( | 392 | Self::new_inner( |
| 395 | peri, | 393 | peri, |
| 396 | new_pin!(rx, half_duplex.af_type()), | 394 | new_pin!(rx, config.rx_af()), |
| 397 | None, | 395 | None, |
| 398 | None, | 396 | None, |
| 399 | None, | 397 | None, |
diff --git a/embassy-stm32/src/usart/mod.rs b/embassy-stm32/src/usart/mod.rs index 80a391d41..a6bafc5a7 100644 --- a/embassy-stm32/src/usart/mod.rs +++ b/embassy-stm32/src/usart/mod.rs | |||
| @@ -14,7 +14,7 @@ use embassy_sync::waitqueue::AtomicWaker; | |||
| 14 | use futures_util::future::{select, Either}; | 14 | use futures_util::future::{select, Either}; |
| 15 | 15 | ||
| 16 | use crate::dma::ChannelAndRequest; | 16 | use crate::dma::ChannelAndRequest; |
| 17 | use crate::gpio::{self, AfType, AnyPin, OutputType, Pull, SealedPin as _, Speed}; | 17 | use crate::gpio::{AfType, AnyPin, OutputType, Pull, SealedPin as _, Speed}; |
| 18 | use crate::interrupt::typelevel::Interrupt as _; | 18 | use crate::interrupt::typelevel::Interrupt as _; |
| 19 | use crate::interrupt::{self, Interrupt, InterruptExt}; | 19 | use crate::interrupt::{self, Interrupt, InterruptExt}; |
| 20 | use crate::mode::{Async, Blocking, Mode}; | 20 | use crate::mode::{Async, Blocking, Mode}; |
| @@ -303,30 +303,6 @@ impl Default for Config { | |||
| 303 | } | 303 | } |
| 304 | } | 304 | } |
| 305 | 305 | ||
| 306 | #[derive(Clone, Copy, PartialEq, Eq, Debug)] | ||
| 307 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | ||
| 308 | /// Half duplex IO mode | ||
| 309 | pub enum HalfDuplexConfig { | ||
| 310 | /// Push pull allows for faster baudrates, may require series resistor | ||
| 311 | PushPull, | ||
| 312 | /// Open drain output using external pull up resistor | ||
| 313 | OpenDrainExternal, | ||
| 314 | #[cfg(not(gpio_v1))] | ||
| 315 | /// Open drain output using internal pull up resistor | ||
| 316 | OpenDrainInternal, | ||
| 317 | } | ||
| 318 | |||
| 319 | impl HalfDuplexConfig { | ||
| 320 | fn af_type(self) -> gpio::AfType { | ||
| 321 | match self { | ||
| 322 | HalfDuplexConfig::PushPull => AfType::output(OutputType::PushPull, Speed::Medium), | ||
| 323 | HalfDuplexConfig::OpenDrainExternal => AfType::output(OutputType::OpenDrain, Speed::Medium), | ||
| 324 | #[cfg(not(gpio_v1))] | ||
| 325 | HalfDuplexConfig::OpenDrainInternal => AfType::output_pull(OutputType::OpenDrain, Speed::Medium, Pull::Up), | ||
| 326 | } | ||
| 327 | } | ||
| 328 | } | ||
| 329 | |||
| 330 | /// Serial error | 306 | /// Serial error |
| 331 | #[derive(Debug, Eq, PartialEq, Copy, Clone)] | 307 | #[derive(Debug, Eq, PartialEq, Copy, Clone)] |
| 332 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 308 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| @@ -1245,7 +1221,6 @@ impl<'d> Uart<'d, Async> { | |||
| 1245 | rx_dma: Peri<'d, impl RxDma<T>>, | 1221 | rx_dma: Peri<'d, impl RxDma<T>>, |
| 1246 | mut config: Config, | 1222 | mut config: Config, |
| 1247 | readback: HalfDuplexReadback, | 1223 | readback: HalfDuplexReadback, |
| 1248 | half_duplex: HalfDuplexConfig, | ||
| 1249 | ) -> Result<Self, ConfigError> { | 1224 | ) -> Result<Self, ConfigError> { |
| 1250 | #[cfg(not(any(usart_v1, usart_v2)))] | 1225 | #[cfg(not(any(usart_v1, usart_v2)))] |
| 1251 | { | 1226 | { |
| @@ -1256,7 +1231,7 @@ impl<'d> Uart<'d, Async> { | |||
| 1256 | Self::new_inner( | 1231 | Self::new_inner( |
| 1257 | peri, | 1232 | peri, |
| 1258 | None, | 1233 | None, |
| 1259 | new_pin!(tx, half_duplex.af_type()), | 1234 | new_pin!(tx, config.tx_af()), |
| 1260 | None, | 1235 | None, |
| 1261 | None, | 1236 | None, |
| 1262 | None, | 1237 | None, |
| @@ -1285,7 +1260,6 @@ impl<'d> Uart<'d, Async> { | |||
| 1285 | rx_dma: Peri<'d, impl RxDma<T>>, | 1260 | rx_dma: Peri<'d, impl RxDma<T>>, |
| 1286 | mut config: Config, | 1261 | mut config: Config, |
| 1287 | readback: HalfDuplexReadback, | 1262 | readback: HalfDuplexReadback, |
| 1288 | half_duplex: HalfDuplexConfig, | ||
| 1289 | ) -> Result<Self, ConfigError> { | 1263 | ) -> Result<Self, ConfigError> { |
| 1290 | config.swap_rx_tx = true; | 1264 | config.swap_rx_tx = true; |
| 1291 | config.duplex = Duplex::Half(readback); | 1265 | config.duplex = Duplex::Half(readback); |
| @@ -1294,7 +1268,7 @@ impl<'d> Uart<'d, Async> { | |||
| 1294 | peri, | 1268 | peri, |
| 1295 | None, | 1269 | None, |
| 1296 | None, | 1270 | None, |
| 1297 | new_pin!(rx, half_duplex.af_type()), | 1271 | new_pin!(rx, config.rx_af()), |
| 1298 | None, | 1272 | None, |
| 1299 | None, | 1273 | None, |
| 1300 | new_dma!(tx_dma), | 1274 | new_dma!(tx_dma), |
| @@ -1405,7 +1379,6 @@ impl<'d> Uart<'d, Blocking> { | |||
| 1405 | tx: Peri<'d, impl TxPin<T>>, | 1379 | tx: Peri<'d, impl TxPin<T>>, |
| 1406 | mut config: Config, | 1380 | mut config: Config, |
| 1407 | readback: HalfDuplexReadback, | 1381 | readback: HalfDuplexReadback, |
| 1408 | half_duplex: HalfDuplexConfig, | ||
| 1409 | ) -> Result<Self, ConfigError> { | 1382 | ) -> Result<Self, ConfigError> { |
| 1410 | #[cfg(not(any(usart_v1, usart_v2)))] | 1383 | #[cfg(not(any(usart_v1, usart_v2)))] |
| 1411 | { | 1384 | { |
| @@ -1416,7 +1389,7 @@ impl<'d> Uart<'d, Blocking> { | |||
| 1416 | Self::new_inner( | 1389 | Self::new_inner( |
| 1417 | peri, | 1390 | peri, |
| 1418 | None, | 1391 | None, |
| 1419 | new_pin!(tx, half_duplex.af_type()), | 1392 | new_pin!(tx, config.tx_af()), |
| 1420 | None, | 1393 | None, |
| 1421 | None, | 1394 | None, |
| 1422 | None, | 1395 | None, |
| @@ -1442,7 +1415,6 @@ impl<'d> Uart<'d, Blocking> { | |||
| 1442 | rx: Peri<'d, impl RxPin<T>>, | 1415 | rx: Peri<'d, impl RxPin<T>>, |
| 1443 | mut config: Config, | 1416 | mut config: Config, |
| 1444 | readback: HalfDuplexReadback, | 1417 | readback: HalfDuplexReadback, |
| 1445 | half_duplex: HalfDuplexConfig, | ||
| 1446 | ) -> Result<Self, ConfigError> { | 1418 | ) -> Result<Self, ConfigError> { |
| 1447 | config.swap_rx_tx = true; | 1419 | config.swap_rx_tx = true; |
| 1448 | config.duplex = Duplex::Half(readback); | 1420 | config.duplex = Duplex::Half(readback); |
| @@ -1451,7 +1423,7 @@ impl<'d> Uart<'d, Blocking> { | |||
| 1451 | peri, | 1423 | peri, |
| 1452 | None, | 1424 | None, |
| 1453 | None, | 1425 | None, |
| 1454 | new_pin!(rx, half_duplex.af_type()), | 1426 | new_pin!(rx, config.rx_af()), |
| 1455 | None, | 1427 | None, |
| 1456 | None, | 1428 | None, |
| 1457 | None, | 1429 | None, |
diff --git a/examples/stm32g0/src/bin/onewire_ds18b20.rs b/examples/stm32g0/src/bin/onewire_ds18b20.rs index f85cc4ff8..75519bbf2 100644 --- a/examples/stm32g0/src/bin/onewire_ds18b20.rs +++ b/examples/stm32g0/src/bin/onewire_ds18b20.rs | |||
| @@ -8,7 +8,7 @@ use defmt::*; | |||
| 8 | use embassy_executor::Spawner; | 8 | use embassy_executor::Spawner; |
| 9 | use embassy_stm32::mode::Async; | 9 | use embassy_stm32::mode::Async; |
| 10 | use embassy_stm32::usart::{ | 10 | use embassy_stm32::usart::{ |
| 11 | BufferedUartRx, BufferedUartTx, Config, ConfigError, HalfDuplexConfig, RingBufferedUartRx, UartTx, | 11 | BufferedUartRx, BufferedUartTx, Config, ConfigError, OutputConfig, RingBufferedUartRx, UartTx, |
| 12 | }; | 12 | }; |
| 13 | use embassy_stm32::{bind_interrupts, peripherals, usart}; | 13 | use embassy_stm32::{bind_interrupts, peripherals, usart}; |
| 14 | use embassy_time::{Duration, Timer}; | 14 | use embassy_time::{Duration, Timer}; |
| @@ -21,16 +21,18 @@ fn create_onewire(p: embassy_stm32::Peripherals) -> OneWire<UartTx<'static, Asyn | |||
| 21 | USART1 => usart::InterruptHandler<peripherals::USART1>; | 21 | USART1 => usart::InterruptHandler<peripherals::USART1>; |
| 22 | }); | 22 | }); |
| 23 | 23 | ||
| 24 | let mut config = Config::default(); | ||
| 25 | config.tx_config = OutputConfig::OpenDrainExternal; | ||
| 26 | |||
| 24 | let usart = Uart::new_half_duplex( | 27 | let usart = Uart::new_half_duplex( |
| 25 | p.USART1, | 28 | p.USART1, |
| 26 | p.PA9, | 29 | p.PA9, |
| 27 | Irqs, | 30 | Irqs, |
| 28 | p.DMA1_CH1, | 31 | p.DMA1_CH1, |
| 29 | p.DMA1_CH2, | 32 | p.DMA1_CH2, |
| 30 | Config::default(), | 33 | config, |
| 31 | // Enable readback so we can read sensor pulling data low while transmission is in progress | 34 | // Enable readback so we can read sensor pulling data low while transmission is in progress |
| 32 | usart::HalfDuplexReadback::Readback, | 35 | usart::HalfDuplexReadback::Readback, |
| 33 | HalfDuplexConfig::OpenDrainExternal, | ||
| 34 | ) | 36 | ) |
| 35 | .unwrap(); | 37 | .unwrap(); |
| 36 | 38 | ||
| @@ -50,6 +52,8 @@ fn create_onewire(p: embassy_stm32::Peripherals) -> OneWire<BufferedUartTx<'stat | |||
| 50 | }); | 52 | }); |
| 51 | 53 | ||
| 52 | const BUFFER_SIZE: usize = 16; | 54 | const BUFFER_SIZE: usize = 16; |
| 55 | let mut config = Confi::default(); | ||
| 56 | config.tx_config = OutputConfig::OpenDrainExternal; | ||
| 53 | let tx_buf: &mut [u8; BUFFER_SIZE] = singleton!(TX_BUF: [u8; BUFFER_SIZE] = [0; BUFFER_SIZE]).unwrap(); | 57 | let tx_buf: &mut [u8; BUFFER_SIZE] = singleton!(TX_BUF: [u8; BUFFER_SIZE] = [0; BUFFER_SIZE]).unwrap(); |
| 54 | let rx_buf: &mut [u8; BUFFER_SIZE] = singleton!(RX_BUF: [u8; BUFFER_SIZE] = [0; BUFFER_SIZE]).unwrap(); | 58 | let rx_buf: &mut [u8; BUFFER_SIZE] = singleton!(RX_BUF: [u8; BUFFER_SIZE] = [0; BUFFER_SIZE]).unwrap(); |
| 55 | let usart = BufferedUart::new_half_duplex( | 59 | let usart = BufferedUart::new_half_duplex( |
| @@ -58,10 +62,9 @@ fn create_onewire(p: embassy_stm32::Peripherals) -> OneWire<BufferedUartTx<'stat | |||
| 58 | Irqs, | 62 | Irqs, |
| 59 | tx_buf, | 63 | tx_buf, |
| 60 | rx_buf, | 64 | rx_buf, |
| 61 | Config::default(), | 65 | config, |
| 62 | // Enable readback so we can read sensor pulling data low while transmission is in progress | 66 | // Enable readback so we can read sensor pulling data low while transmission is in progress |
| 63 | usart::HalfDuplexReadback::Readback, | 67 | usart::HalfDuplexReadback::Readback, |
| 64 | HalfDuplexConfig::OpenDrainExternal, | ||
| 65 | ) | 68 | ) |
| 66 | .unwrap(); | 69 | .unwrap(); |
| 67 | let (tx, rx) = usart.split(); | 70 | let (tx, rx) = usart.split(); |
