diff options
| -rw-r--r-- | embassy-stm32/Cargo.toml | 3 | ||||
| -rw-r--r-- | embassy-stm32/src/usart/mod.rs | 104 |
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 | |||
| 44 | embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] } | 44 | embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] } |
| 45 | embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.9", optional = true} | 45 | embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.9", optional = true} |
| 46 | embedded-hal-async = { version = "=0.1.0-alpha.2", optional = true} | 46 | embedded-hal-async = { version = "=0.1.0-alpha.2", optional = true} |
| 47 | embedded-hal-nb = { version = "=1.0.0-alpha.1", optional = true} | ||
| 47 | 48 | ||
| 48 | embedded-storage = "0.3.0" | 49 | embedded-storage = "0.3.0" |
| 49 | embedded-storage-async = { version = "0.3.0", optional = true } | 50 | embedded-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. |
| 105 | unstable-traits = ["embedded-hal-1"] | 106 | unstable-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( |
