aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/Cargo.toml3
-rw-r--r--embassy-stm32/src/usart/mod.rs104
2 files changed, 84 insertions, 23 deletions
diff --git a/embassy-stm32/Cargo.toml b/embassy-stm32/Cargo.toml
index 9566dbcaf..fbe37fe3d 100644
--- a/embassy-stm32/Cargo.toml
+++ b/embassy-stm32/Cargo.toml
@@ -44,6 +44,7 @@ embassy-usb-driver = {version = "0.1.0", path = "../embassy-usb-driver", optiona
44embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] } 44embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] }
45embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.9", optional = true} 45embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.9", optional = true}
46embedded-hal-async = { version = "=0.1.0-alpha.2", optional = true} 46embedded-hal-async = { version = "=0.1.0-alpha.2", optional = true}
47embedded-hal-nb = { version = "=1.0.0-alpha.1", optional = true}
47 48
48embedded-storage = "0.3.0" 49embedded-storage = "0.3.0"
49embedded-storage-async = { version = "0.3.0", optional = true } 50embedded-storage-async = { version = "0.3.0", optional = true }
@@ -102,7 +103,7 @@ unstable-pac = []
102 103
103# Implement embedded-hal 1.0 alpha traits. 104# Implement embedded-hal 1.0 alpha traits.
104# Implement embedded-hal-async traits if `nightly` is set as well. 105# Implement embedded-hal-async traits if `nightly` is set as well.
105unstable-traits = ["embedded-hal-1"] 106unstable-traits = ["embedded-hal-1", "dep:embedded-hal-nb"]
106 107
107# BEGIN GENERATED FEATURES 108# BEGIN GENERATED FEATURES
108# Generated by stm32-gen-features. DO NOT EDIT. 109# Generated by stm32-gen-features. DO NOT EDIT.
diff --git a/embassy-stm32/src/usart/mod.rs b/embassy-stm32/src/usart/mod.rs
index 6c2668748..a152a0c15 100644
--- a/embassy-stm32/src/usart/mod.rs
+++ b/embassy-stm32/src/usart/mod.rs
@@ -160,6 +160,30 @@ impl<'d, T: BasicInstance, RxDma> UartRx<'d, T, RxDma> {
160 Ok(()) 160 Ok(())
161 } 161 }
162 162
163 pub fn nb_read(&mut self) -> Result<u8, nb::Error<Error>> {
164 let r = T::regs();
165 unsafe {
166 let sr = sr(r).read();
167 if sr.pe() {
168 rdr(r).read_volatile();
169 Err(nb::Error::Other(Error::Parity))
170 } else if sr.fe() {
171 rdr(r).read_volatile();
172 Err(nb::Error::Other(Error::Framing))
173 } else if sr.ne() {
174 rdr(r).read_volatile();
175 Err(nb::Error::Other(Error::Noise))
176 } else if sr.ore() {
177 rdr(r).read_volatile();
178 Err(nb::Error::Other(Error::Overrun))
179 } else if sr.rxne() {
180 Ok(rdr(r).read_volatile())
181 } else {
182 Err(nb::Error::WouldBlock)
183 }
184 }
185 }
186
163 pub fn blocking_read(&mut self, buffer: &mut [u8]) -> Result<(), Error> { 187 pub fn blocking_read(&mut self, buffer: &mut [u8]) -> Result<(), Error> {
164 unsafe { 188 unsafe {
165 let r = T::regs(); 189 let r = T::regs();
@@ -263,6 +287,10 @@ impl<'d, T: BasicInstance, TxDma, RxDma> Uart<'d, T, TxDma, RxDma> {
263 self.rx.read(buffer).await 287 self.rx.read(buffer).await
264 } 288 }
265 289
290 pub fn nb_read(&mut self) -> Result<u8, nb::Error<Error>> {
291 self.rx.nb_read()
292 }
293
266 pub fn blocking_read(&mut self, buffer: &mut [u8]) -> Result<(), Error> { 294 pub fn blocking_read(&mut self, buffer: &mut [u8]) -> Result<(), Error> {
267 self.rx.blocking_read(buffer) 295 self.rx.blocking_read(buffer)
268 } 296 }
@@ -281,27 +309,7 @@ mod eh02 {
281 impl<'d, T: BasicInstance, RxDma> embedded_hal_02::serial::Read<u8> for UartRx<'d, T, RxDma> { 309 impl<'d, T: BasicInstance, RxDma> embedded_hal_02::serial::Read<u8> for UartRx<'d, T, RxDma> {
282 type Error = Error; 310 type Error = Error;
283 fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> { 311 fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> {
284 let r = T::regs(); 312 self.nb_read()
285 unsafe {
286 let sr = sr(r).read();
287 if sr.pe() {
288 rdr(r).read_volatile();
289 Err(nb::Error::Other(Error::Parity))
290 } else if sr.fe() {
291 rdr(r).read_volatile();
292 Err(nb::Error::Other(Error::Framing))
293 } else if sr.ne() {
294 rdr(r).read_volatile();
295 Err(nb::Error::Other(Error::Noise))
296 } else if sr.ore() {
297 rdr(r).read_volatile();
298 Err(nb::Error::Other(Error::Overrun))
299 } else if sr.rxne() {
300 Ok(rdr(r).read_volatile())
301 } else {
302 Err(nb::Error::WouldBlock)
303 }
304 }
305 } 313 }
306 } 314 }
307 315
@@ -318,7 +326,7 @@ mod eh02 {
318 impl<'d, T: BasicInstance, TxDma, RxDma> embedded_hal_02::serial::Read<u8> for Uart<'d, T, TxDma, RxDma> { 326 impl<'d, T: BasicInstance, TxDma, RxDma> embedded_hal_02::serial::Read<u8> for Uart<'d, T, TxDma, RxDma> {
319 type Error = Error; 327 type Error = Error;
320 fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> { 328 fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> {
321 embedded_hal_02::serial::Read::read(&mut self.rx) 329 self.nb_read()
322 } 330 }
323 } 331 }
324 332
@@ -359,6 +367,58 @@ mod eh1 {
359 impl<'d, T: BasicInstance, RxDma> embedded_hal_1::serial::ErrorType for UartRx<'d, T, RxDma> { 367 impl<'d, T: BasicInstance, RxDma> embedded_hal_1::serial::ErrorType for UartRx<'d, T, RxDma> {
360 type Error = Error; 368 type Error = Error;
361 } 369 }
370
371 impl<'d, T: BasicInstance, RxDma> embedded_hal_nb::serial::Read for UartRx<'d, T, RxDma> {
372 fn read(&mut self) -> nb::Result<u8, Self::Error> {
373 self.nb_read()
374 }
375 }
376
377 impl<'d, T: BasicInstance, TxDma> embedded_hal_1::serial::Write for UartTx<'d, T, TxDma> {
378 fn write(&mut self, buffer: &[u8]) -> Result<(), Self::Error> {
379 self.blocking_write(buffer)
380 }
381
382 fn flush(&mut self) -> Result<(), Self::Error> {
383 self.blocking_flush()
384 }
385 }
386
387 impl<'d, T: BasicInstance, TxDma> embedded_hal_nb::serial::Write for UartTx<'d, T, TxDma> {
388 fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> {
389 self.blocking_write(&[char]).map_err(nb::Error::Other)
390 }
391
392 fn flush(&mut self) -> nb::Result<(), Self::Error> {
393 self.blocking_flush().map_err(nb::Error::Other)
394 }
395 }
396
397 impl<'d, T: BasicInstance, TxDma, RxDma> embedded_hal_nb::serial::Read for Uart<'d, T, TxDma, RxDma> {
398 fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> {
399 self.nb_read()
400 }
401 }
402
403 impl<'d, T: BasicInstance, TxDma, RxDma> embedded_hal_1::serial::Write for Uart<'d, T, TxDma, RxDma> {
404 fn write(&mut self, buffer: &[u8]) -> Result<(), Self::Error> {
405 self.blocking_write(buffer)
406 }
407
408 fn flush(&mut self) -> Result<(), Self::Error> {
409 self.blocking_flush()
410 }
411 }
412
413 impl<'d, T: BasicInstance, TxDma, RxDma> embedded_hal_nb::serial::Write for Uart<'d, T, TxDma, RxDma> {
414 fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> {
415 self.blocking_write(&[char]).map_err(nb::Error::Other)
416 }
417
418 fn flush(&mut self) -> nb::Result<(), Self::Error> {
419 self.blocking_flush().map_err(nb::Error::Other)
420 }
421 }
362} 422}
363 423
364#[cfg(all( 424#[cfg(all(