aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/src/usart/buffered.rs8
-rw-r--r--embassy-stm32/src/usart/mod.rs38
-rw-r--r--examples/stm32g0/src/bin/onewire_ds18b20.rs13
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;
13use super::DePin; 13use super::DePin;
14use super::{ 14use 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};
19use crate::gpio::{AfType, AnyPin, Pull, SealedPin as _}; 19use 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;
14use futures_util::future::{select, Either}; 14use futures_util::future::{select, Either};
15 15
16use crate::dma::ChannelAndRequest; 16use crate::dma::ChannelAndRequest;
17use crate::gpio::{self, AfType, AnyPin, OutputType, Pull, SealedPin as _, Speed}; 17use crate::gpio::{AfType, AnyPin, OutputType, Pull, SealedPin as _, Speed};
18use crate::interrupt::typelevel::Interrupt as _; 18use crate::interrupt::typelevel::Interrupt as _;
19use crate::interrupt::{self, Interrupt, InterruptExt}; 19use crate::interrupt::{self, Interrupt, InterruptExt};
20use crate::mode::{Async, Blocking, Mode}; 20use 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
309pub 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
319impl 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::*;
8use embassy_executor::Spawner; 8use embassy_executor::Spawner;
9use embassy_stm32::mode::Async; 9use embassy_stm32::mode::Async;
10use embassy_stm32::usart::{ 10use embassy_stm32::usart::{
11 BufferedUartRx, BufferedUartTx, Config, ConfigError, HalfDuplexConfig, RingBufferedUartRx, UartTx, 11 BufferedUartRx, BufferedUartTx, Config, ConfigError, OutputConfig, RingBufferedUartRx, UartTx,
12}; 12};
13use embassy_stm32::{bind_interrupts, peripherals, usart}; 13use embassy_stm32::{bind_interrupts, peripherals, usart};
14use embassy_time::{Duration, Timer}; 14use 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();