aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Trnka <[email protected]>2024-08-28 21:35:31 +0200
committerDaniel Trnka <[email protected]>2024-08-28 21:55:08 +0200
commit22f4459ae28fe7e299f775f95952132d3c3dffa2 (patch)
tree63c68663765966cd1b02fcac33894298f2b18f1a
parentbea1f34440eff7842c0c04e8b7381cdb429f5005 (diff)
stm32/usart: sending break character in buffered usart
-rw-r--r--embassy-stm32/src/usart/buffered.rs14
-rw-r--r--embassy-stm32/src/usart/mod.rs27
2 files changed, 28 insertions, 13 deletions
diff --git a/embassy-stm32/src/usart/buffered.rs b/embassy-stm32/src/usart/buffered.rs
index 06cc0e41d..86f56eb7c 100644
--- a/embassy-stm32/src/usart/buffered.rs
+++ b/embassy-stm32/src/usart/buffered.rs
@@ -12,8 +12,8 @@ use embassy_sync::waitqueue::AtomicWaker;
12#[cfg(not(any(usart_v1, usart_v2)))] 12#[cfg(not(any(usart_v1, usart_v2)))]
13use super::DePin; 13use super::DePin;
14use super::{ 14use super::{
15 clear_interrupt_flags, configure, rdr, reconfigure, sr, tdr, Config, ConfigError, CtsPin, Error, Info, Instance, 15 clear_interrupt_flags, configure, rdr, reconfigure, send_break, sr, tdr, Config, ConfigError, CtsPin, Error, Info,
16 Regs, RtsPin, RxPin, TxPin, 16 Instance, Regs, RtsPin, RxPin, TxPin,
17}; 17};
18use crate::gpio::{AfType, AnyPin, OutputType, Pull, SealedPin as _, Speed}; 18use crate::gpio::{AfType, AnyPin, OutputType, Pull, SealedPin as _, Speed};
19use crate::interrupt::{self, InterruptExt}; 19use crate::interrupt::{self, InterruptExt};
@@ -359,6 +359,11 @@ impl<'d> BufferedUart<'d> {
359 359
360 Ok(()) 360 Ok(())
361 } 361 }
362
363 /// Send break character
364 pub fn send_break(&self) {
365 self.tx.send_break()
366 }
362} 367}
363 368
364impl<'d> BufferedUartRx<'d> { 369impl<'d> BufferedUartRx<'d> {
@@ -538,6 +543,11 @@ impl<'d> BufferedUartTx<'d> {
538 543
539 Ok(()) 544 Ok(())
540 } 545 }
546
547 /// Send break character
548 pub fn send_break(&self) {
549 send_break(&self.info.regs);
550 }
541} 551}
542 552
543impl<'d> Drop for BufferedUartRx<'d> { 553impl<'d> Drop for BufferedUartRx<'d> {
diff --git a/embassy-stm32/src/usart/mod.rs b/embassy-stm32/src/usart/mod.rs
index cbd4ac3bc..e7f2f890a 100644
--- a/embassy-stm32/src/usart/mod.rs
+++ b/embassy-stm32/src/usart/mod.rs
@@ -523,17 +523,7 @@ impl<'d, M: Mode> UartTx<'d, M> {
523 523
524 /// Send break character 524 /// Send break character
525 pub fn send_break(&self) { 525 pub fn send_break(&self) {
526 // Busy wait until previous break has been sent 526 send_break(&self.info.regs);
527 #[cfg(any(usart_v1, usart_v2))]
528 while self.info.regs.cr1().read().sbk() {}
529 #[cfg(any(usart_v3, usart_v4))]
530 while self.info.regs.isr().read().sbkf() {}
531
532 // Send break right after completing the current character transmission
533 #[cfg(any(usart_v1, usart_v2))]
534 self.info.regs.cr1().modify(|w| w.set_sbk(true));
535 #[cfg(any(usart_v3, usart_v4))]
536 self.info.regs.rqr().write(|w| w.set_sbkrq(true));
537 } 527 }
538} 528}
539 529
@@ -549,6 +539,21 @@ fn blocking_flush(info: &Info) -> Result<(), Error> {
549 Ok(()) 539 Ok(())
550} 540}
551 541
542/// Send break character
543pub fn send_break(regs: &Regs) {
544 // Busy wait until previous break has been sent
545 #[cfg(any(usart_v1, usart_v2))]
546 while regs.cr1().read().sbk() {}
547 #[cfg(any(usart_v3, usart_v4))]
548 while regs.isr().read().sbkf() {}
549
550 // Send break right after completing the current character transmission
551 #[cfg(any(usart_v1, usart_v2))]
552 regs.cr1().modify(|w| w.set_sbk(true));
553 #[cfg(any(usart_v3, usart_v4))]
554 regs.rqr().write(|w| w.set_sbkrq(true));
555}
556
552impl<'d> UartRx<'d, Async> { 557impl<'d> UartRx<'d, Async> {
553 /// Create a new rx-only UART with no hardware flow control. 558 /// Create a new rx-only UART with no hardware flow control.
554 /// 559 ///