aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/src/usart/v1.rs30
-rw-r--r--embassy-stm32/src/usart/v2.rs30
-rw-r--r--examples/stm32f4/src/bin/usart.rs2
-rw-r--r--examples/stm32h7/src/bin/usart.rs2
-rw-r--r--examples/stm32l0/src/bin/usart_dma.rs42
-rw-r--r--examples/stm32l4/src/bin/usart.rs2
6 files changed, 103 insertions, 5 deletions
diff --git a/embassy-stm32/src/usart/v1.rs b/embassy-stm32/src/usart/v1.rs
index d68215fea..9e9b49306 100644
--- a/embassy-stm32/src/usart/v1.rs
+++ b/embassy-stm32/src/usart/v1.rs
@@ -80,7 +80,23 @@ impl<'d, T: Instance, TxDma, RxDma> Uart<'d, T, TxDma, RxDma> {
80 Ok(()) 80 Ok(())
81 } 81 }
82 82
83 pub fn read(&mut self, buffer: &mut [u8]) -> Result<(), Error> { 83 async fn read_dma(&mut self, buffer: &mut [u8]) -> Result<(), Error>
84 where
85 RxDma: crate::usart::RxDma<T>,
86 {
87 let ch = &mut self.rx_dma;
88 unsafe {
89 self.inner.regs().cr3().modify(|reg| {
90 reg.set_dmar(true);
91 });
92 }
93 let r = self.inner.regs();
94 let src = r.dr().ptr() as *mut u8;
95 ch.read(ch.request(), src, buffer).await;
96 Ok(())
97 }
98
99 pub fn read_blocking(&mut self, buffer: &mut [u8]) -> Result<(), Error> {
84 unsafe { 100 unsafe {
85 let r = self.inner.regs(); 101 let r = self.inner.regs();
86 for b in buffer { 102 for b in buffer {
@@ -143,3 +159,15 @@ impl<'d, T: Instance, TxDma, RxDma> embassy_traits::uart::Write for Uart<'d, T,
143 self.write_dma(buf).map_err(|_| embassy_traits::uart::Error::Other) 159 self.write_dma(buf).map_err(|_| embassy_traits::uart::Error::Other)
144 } 160 }
145} 161}
162
163// rustfmt::skip because intellij removes the 'where' claus on the associated type.
164#[rustfmt::skip]
165impl<'d, T: Instance, TxDma, RxDma> embassy_traits::uart::Read for Uart<'d, T, TxDma, RxDma>
166 where RxDma: crate::usart::RxDma<T>
167{
168 type ReadFuture<'a> where Self: 'a = impl Future<Output = Result<(), embassy_traits::uart::Error>>;
169
170 fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Self::ReadFuture<'a> {
171 self.read_dma(buf).map_err(|_| embassy_traits::uart::Error::Other)
172 }
173}
diff --git a/embassy-stm32/src/usart/v2.rs b/embassy-stm32/src/usart/v2.rs
index 6ce3a338e..694b16185 100644
--- a/embassy-stm32/src/usart/v2.rs
+++ b/embassy-stm32/src/usart/v2.rs
@@ -84,7 +84,23 @@ impl<'d, T: Instance, TxDma, RxDma> Uart<'d, T, TxDma, RxDma> {
84 Ok(()) 84 Ok(())
85 } 85 }
86 86
87 pub fn read(&mut self, buffer: &mut [u8]) -> Result<(), Error> { 87 async fn read_dma(&mut self, buffer: &mut [u8]) -> Result<(), Error>
88 where
89 RxDma: crate::usart::RxDma<T>,
90 {
91 let ch = &mut self.rx_dma;
92 unsafe {
93 self.inner.regs().cr3().modify(|reg| {
94 reg.set_dmar(true);
95 });
96 }
97 let r = self.inner.regs();
98 let src = r.rdr().ptr() as *mut u8;
99 ch.read(ch.request(), src, buffer).await;
100 Ok(())
101 }
102
103 pub fn read_blocking(&mut self, buffer: &mut [u8]) -> Result<(), Error> {
88 unsafe { 104 unsafe {
89 let r = self.inner.regs(); 105 let r = self.inner.regs();
90 for b in buffer { 106 for b in buffer {
@@ -147,3 +163,15 @@ impl<'d, T: Instance, TxDma, RxDma> embassy_traits::uart::Write for Uart<'d, T,
147 self.write_dma(buf).map_err(|_| embassy_traits::uart::Error::Other) 163 self.write_dma(buf).map_err(|_| embassy_traits::uart::Error::Other)
148 } 164 }
149} 165}
166
167// rustfmt::skip because intellij removes the 'where' claus on the associated type.
168#[rustfmt::skip]
169impl<'d, T: Instance, TxDma, RxDma> embassy_traits::uart::Read for Uart<'d, T, TxDma, RxDma>
170 where RxDma: crate::usart::RxDma<T>
171{
172 type ReadFuture<'a> where Self: 'a = impl Future<Output = Result<(), embassy_traits::uart::Error>>;
173
174 fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Self::ReadFuture<'a> {
175 self.read_dma(buf).map_err(|_| embassy_traits::uart::Error::Other)
176 }
177}
diff --git a/examples/stm32f4/src/bin/usart.rs b/examples/stm32f4/src/bin/usart.rs
index 8f0e04e57..a068df520 100644
--- a/examples/stm32f4/src/bin/usart.rs
+++ b/examples/stm32f4/src/bin/usart.rs
@@ -33,7 +33,7 @@ fn main() -> ! {
33 33
34 let mut buf = [0u8; 1]; 34 let mut buf = [0u8; 1];
35 loop { 35 loop {
36 usart.read(&mut buf).unwrap(); 36 usart.read_blocking(&mut buf).unwrap();
37 usart.bwrite_all(&buf).unwrap(); 37 usart.bwrite_all(&buf).unwrap();
38 } 38 }
39} 39}
diff --git a/examples/stm32h7/src/bin/usart.rs b/examples/stm32h7/src/bin/usart.rs
index ce33f201a..3e3e5b169 100644
--- a/examples/stm32h7/src/bin/usart.rs
+++ b/examples/stm32h7/src/bin/usart.rs
@@ -31,7 +31,7 @@ async fn main_task() {
31 31
32 let mut buf = [0u8; 1]; 32 let mut buf = [0u8; 1];
33 loop { 33 loop {
34 usart.read(&mut buf).unwrap(); 34 usart.read_blocking(&mut buf).unwrap();
35 usart.bwrite_all(&buf).unwrap(); 35 usart.bwrite_all(&buf).unwrap();
36 } 36 }
37} 37}
diff --git a/examples/stm32l0/src/bin/usart_dma.rs b/examples/stm32l0/src/bin/usart_dma.rs
new file mode 100644
index 000000000..0a5859b75
--- /dev/null
+++ b/examples/stm32l0/src/bin/usart_dma.rs
@@ -0,0 +1,42 @@
1#![no_std]
2#![no_main]
3#![feature(trait_alias)]
4#![feature(min_type_alias_impl_trait)]
5#![feature(impl_trait_in_bindings)]
6#![feature(type_alias_impl_trait)]
7#![allow(incomplete_features)]
8
9#[path = "../example_common.rs"]
10mod example_common;
11
12use example_common::*;
13
14use defmt::panic;
15use embassy::executor::Spawner;
16use embassy_stm32::usart::{Config, Uart};
17use embassy_stm32::{rcc, Peripherals};
18use embassy_traits::uart::{Read, Write};
19
20#[embassy::main]
21async fn main(_spawner: Spawner, mut p: Peripherals) {
22 let mut rcc = rcc::Rcc::new(p.RCC);
23 rcc.enable_debug_wfe(&mut p.DBGMCU, true);
24
25 let mut usart = Uart::new(
26 p.USART1,
27 p.PB7,
28 p.PB6,
29 p.DMA1_CH2,
30 p.DMA1_CH3,
31 Config::default(),
32 );
33
34 usart.write(b"Hello Embassy World!\r\n").await.unwrap();
35 info!("wrote Hello, starting echo");
36
37 let mut buf = [0; 1];
38 loop {
39 usart.read(&mut buf[..]).await.unwrap();
40 usart.write(&buf[..]).await.unwrap();
41 }
42}
diff --git a/examples/stm32l4/src/bin/usart.rs b/examples/stm32l4/src/bin/usart.rs
index 06abd41a2..ebe06dc26 100644
--- a/examples/stm32l4/src/bin/usart.rs
+++ b/examples/stm32l4/src/bin/usart.rs
@@ -33,7 +33,7 @@ fn main() -> ! {
33 33
34 let mut buf = [0u8; 1]; 34 let mut buf = [0u8; 1];
35 loop { 35 loop {
36 usart.read(&mut buf).unwrap(); 36 usart.read_blocking(&mut buf).unwrap();
37 usart.bwrite_all(&buf).unwrap(); 37 usart.bwrite_all(&buf).unwrap();
38 } 38 }
39} 39}