aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32-examples/src/bin/usart.rs8
-rw-r--r--embassy-stm32/src/usart/usart_v1.rs28
2 files changed, 34 insertions, 2 deletions
diff --git a/embassy-stm32-examples/src/bin/usart.rs b/embassy-stm32-examples/src/bin/usart.rs
index e3d323da7..d35fbf9f0 100644
--- a/embassy-stm32-examples/src/bin/usart.rs
+++ b/embassy-stm32-examples/src/bin/usart.rs
@@ -25,9 +25,13 @@ async fn main_task() {
25 let config = Config::default(); 25 let config = Config::default();
26 let mut usart = Uart::new(p.USART3, p.PD9, p.PD8, config, 16_000_000); 26 let mut usart = Uart::new(p.USART3, p.PD9, p.PD8, config, 16_000_000);
27 27
28 usart.bwrite_all(b"Hello Embassy World!\r\n").unwrap();
29 info!("wrote Hello, starting echo");
30
31 let mut buf = [0u8; 1];
28 loop { 32 loop {
29 info!("wrote"); 33 usart.read(&mut buf).unwrap();
30 usart.bwrite_all(b"Hello Embassy World!\r\n").unwrap(); 34 usart.bwrite_all(&buf).unwrap();
31 } 35 }
32} 36}
33 37
diff --git a/embassy-stm32/src/usart/usart_v1.rs b/embassy-stm32/src/usart/usart_v1.rs
index d8b6cabe8..baaf4fa30 100644
--- a/embassy-stm32/src/usart/usart_v1.rs
+++ b/embassy-stm32/src/usart/usart_v1.rs
@@ -102,6 +102,34 @@ impl<'d, T: Instance> Uart<'d, T> {
102 phantom: PhantomData, 102 phantom: PhantomData,
103 } 103 }
104 } 104 }
105
106 pub fn read(&mut self, buffer: &mut [u8]) -> Result<(), Error> {
107 unsafe {
108 let r = self.inner.regs();
109 for b in buffer {
110 loop {
111 let sr = r.sr().read();
112 if sr.pe() {
113 r.dr().read();
114 return Err(Error::Parity);
115 } else if sr.fe() {
116 r.dr().read();
117 return Err(Error::Framing);
118 } else if sr.ne() {
119 r.dr().read();
120 return Err(Error::Noise);
121 } else if sr.ore() {
122 r.dr().read();
123 return Err(Error::Overrun);
124 } else if sr.rxne() {
125 break;
126 }
127 }
128 *b = r.dr().read().0 as u8;
129 }
130 }
131 Ok(())
132 }
105} 133}
106 134
107impl<'d, T: Instance> embedded_hal::blocking::serial::Write<u8> for Uart<'d, T> { 135impl<'d, T: Instance> embedded_hal::blocking::serial::Write<u8> for Uart<'d, T> {