diff options
| author | Dario Nieuwenhuis <[email protected]> | 2021-05-15 04:25:44 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2021-05-17 01:04:51 +0200 |
| commit | befc052cba945b4026979665faab504420c01ee7 (patch) | |
| tree | aa4f70b3e53fa15ca530e82140d7c6f878bb2f08 | |
| parent | 852ca5a1c5c551551265f78107994ba7c156c126 (diff) | |
stm32/usart_v1: add read
| -rw-r--r-- | embassy-stm32-examples/src/bin/usart.rs | 8 | ||||
| -rw-r--r-- | embassy-stm32/src/usart/usart_v1.rs | 28 |
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 | ||
| 107 | impl<'d, T: Instance> embedded_hal::blocking::serial::Write<u8> for Uart<'d, T> { | 135 | impl<'d, T: Instance> embedded_hal::blocking::serial::Write<u8> for Uart<'d, T> { |
