76
76
//! let received: u8 = block!(rx.read()).unwrap();
77
77
//! ```
78
78
79
+ use core:: convert:: Infallible ;
79
80
use core:: marker:: PhantomData ;
80
81
use core:: ops:: Deref ;
81
82
use core:: sync:: atomic:: { self , Ordering } ;
82
-
83
- use crate :: pac:: { RCC , USART1 , USART2 , USART3 } ;
84
- use core:: convert:: Infallible ;
85
83
use embedded_dma:: { StaticReadBuffer , StaticWriteBuffer } ;
86
84
use embedded_hal:: serial:: Write ;
87
85
@@ -92,6 +90,7 @@ use crate::gpio::gpiob::{PB10, PB11, PB6, PB7};
92
90
use crate :: gpio:: gpioc:: { PC10 , PC11 } ;
93
91
use crate :: gpio:: gpiod:: { PD5 , PD6 , PD8 , PD9 } ;
94
92
use crate :: gpio:: { Alternate , Input } ;
93
+ use crate :: pac:: { RCC , USART1 , USART2 , USART3 } ;
95
94
use crate :: rcc:: { BusClock , Clocks , Enable , Reset } ;
96
95
use crate :: time:: { Bps , U32Ext } ;
97
96
@@ -167,13 +166,13 @@ pub enum Parity {
167
166
}
168
167
169
168
pub enum StopBits {
170
- # [ doc = " 1 stop bit" ]
169
+ /// 1 stop bit
171
170
STOP1 ,
172
- # [ doc = " 0.5 stop bits" ]
171
+ /// 0.5 stop bits
173
172
STOP0P5 ,
174
- # [ doc = " 2 stop bits" ]
173
+ /// 2 stop bits
175
174
STOP2 ,
176
- # [ doc = " 1.5 stop bits" ]
175
+ /// 1.5 stop bits
177
176
STOP1P5 ,
178
177
}
179
178
@@ -320,21 +319,19 @@ where
320
319
assert ! ( brr >= 16 , "impossible baud rate" ) ;
321
320
self . usart . brr . write ( |w| unsafe { w. bits ( brr) } ) ;
322
321
323
- let ( parity_control_enable, parity) = match config. parity {
322
+ // Configure word
323
+ let ( parity_is_used, parity_is_odd) = match config. parity {
324
324
Parity :: ParityNone => ( false , false ) ,
325
325
Parity :: ParityEven => ( true , false ) ,
326
326
Parity :: ParityOdd => ( true , true ) ,
327
327
} ;
328
328
self . usart . cr1 . modify ( |_r, w| {
329
- w. m ( )
330
- . bit ( match config. wordlength {
331
- WordLength :: DataBits8 => false ,
332
- WordLength :: DataBits9 => true ,
333
- } )
334
- . ps ( )
335
- . bit ( parity)
336
- . pce ( )
337
- . bit ( parity_control_enable)
329
+ w. m ( ) . bit ( match config. wordlength {
330
+ WordLength :: DataBits8 => false ,
331
+ WordLength :: DataBits9 => true ,
332
+ } ) ;
333
+ w. ps ( ) . bit ( parity_is_odd) ;
334
+ w. pce ( ) . bit ( parity_is_used)
338
335
} ) ;
339
336
340
337
// Configure stop bits
@@ -356,12 +353,11 @@ where
356
353
config : impl Into < Config > ,
357
354
clocks : Clocks ,
358
355
) -> nb:: Result < ( ) , Infallible > {
359
- let sr = self . usart . sr . read ( ) ;
360
356
// if we're currently busy transmitting, we have to wait until that is
361
357
// over -- regarding reception, we assume that the caller -- with
362
358
// exclusive access to the Serial instance due to &mut self -- knows
363
359
// what they're doing.
364
- if sr . tc ( ) . bit_is_clear ( ) {
360
+ if self . usart . sr . read ( ) . tc ( ) . bit_is_clear ( ) {
365
361
return nb:: Result :: Err ( nb:: Error :: WouldBlock ) ;
366
362
}
367
363
self . apply_config ( config. into ( ) , clocks) ;
@@ -372,22 +368,22 @@ where
372
368
/// ready to be read (RXNE)_ interrupt and _Transmit data
373
369
/// register empty (TXE)_ interrupt
374
370
pub fn listen ( & mut self , event : Event ) {
375
- match event {
376
- Event :: Rxne => self . usart . cr1 . modify ( |_ , w| w . rxneie ( ) . set_bit ( ) ) ,
377
- Event :: Txe => self . usart . cr1 . modify ( |_ , w| w . txeie ( ) . set_bit ( ) ) ,
378
- Event :: Idle => self . usart . cr1 . modify ( |_ , w| w . idleie ( ) . set_bit ( ) ) ,
379
- }
371
+ self . usart . cr1 . modify ( |_ , w| match event {
372
+ Event :: Rxne => w . rxneie ( ) . set_bit ( ) ,
373
+ Event :: Txe => w . txeie ( ) . set_bit ( ) ,
374
+ Event :: Idle => w . idleie ( ) . set_bit ( ) ,
375
+ } ) ;
380
376
}
381
377
382
378
/// Stops listening to the USART by disabling the _Received data
383
379
/// ready to be read (RXNE)_ interrupt and _Transmit data
384
380
/// register empty (TXE)_ interrupt
385
381
pub fn unlisten ( & mut self , event : Event ) {
386
- match event {
387
- Event :: Rxne => self . usart . cr1 . modify ( |_ , w| w . rxneie ( ) . clear_bit ( ) ) ,
388
- Event :: Txe => self . usart . cr1 . modify ( |_ , w| w . txeie ( ) . clear_bit ( ) ) ,
389
- Event :: Idle => self . usart . cr1 . modify ( |_ , w| w . idleie ( ) . clear_bit ( ) ) ,
390
- }
382
+ self . usart . cr1 . modify ( |_ , w| match event {
383
+ Event :: Rxne => w . rxneie ( ) . clear_bit ( ) ,
384
+ Event :: Txe => w . txeie ( ) . clear_bit ( ) ,
385
+ Event :: Idle => w . idleie ( ) . clear_bit ( ) ,
386
+ } ) ;
391
387
}
392
388
393
389
/// Returns true if the line idle status is set
@@ -407,10 +403,8 @@ where
407
403
408
404
/// Clear idle line interrupt flag
409
405
pub fn clear_idle_interrupt ( & self ) {
410
- unsafe {
411
- let _ = ( * USART :: ptr ( ) ) . sr . read ( ) ;
412
- let _ = ( * USART :: ptr ( ) ) . dr . read ( ) ;
413
- }
406
+ let _ = self . usart . sr . read ( ) ;
407
+ let _ = self . usart . dr . read ( ) ;
414
408
}
415
409
416
410
/// Returns ownership of the borrowed register handles
@@ -686,17 +680,14 @@ where
686
680
687
681
if let Some ( err) = err {
688
682
// Some error occurred. In order to clear that error flag, you have to
689
- // do a read from the sr register followed by a read from the dr
690
- // register
691
- // NOTE(read_volatile) see `write_volatile` below
683
+ // do a read from the sr register followed by a read from the dr register.
692
684
let _ = usart. sr . read ( ) ;
693
685
let _ = usart. dr . read ( ) ;
694
686
Err ( nb:: Error :: Other ( err) )
695
687
} else {
696
688
// Check if a byte is available
697
689
if sr. rxne ( ) . bit_is_set ( ) {
698
690
// Read the received byte
699
- // NOTE(read_volatile) see `write_volatile` below
700
691
Ok ( usart. dr . read ( ) . dr ( ) . bits ( ) )
701
692
} else {
702
693
Err ( nb:: Error :: WouldBlock )
@@ -727,11 +718,13 @@ where
727
718
{
728
719
type Error = Infallible ;
729
720
721
+ #[ inline( always) ]
730
722
fn write ( & mut self , word : u8 ) -> nb:: Result < ( ) , Self :: Error > {
731
723
// Delegate to u16 version
732
- Tx :: < USART , u16 > :: new ( ) . write ( u16 :: from ( word) )
724
+ Tx :: < USART , u16 > :: new ( ) . write ( word as u16 )
733
725
}
734
726
727
+ #[ inline( always) ]
735
728
fn flush ( & mut self ) -> nb:: Result < ( ) , Self :: Error > {
736
729
// Delegate to u16 version
737
730
Tx :: < USART , u16 > :: new ( ) . flush ( )
@@ -750,9 +743,9 @@ where
750
743
type Error = Infallible ;
751
744
752
745
fn flush ( & mut self ) -> nb:: Result < ( ) , Self :: Error > {
753
- let sr = unsafe { & * USART :: ptr ( ) } . sr . read ( ) ;
746
+ let usart = unsafe { & * USART :: ptr ( ) } ;
754
747
755
- if sr . tc ( ) . bit_is_set ( ) {
748
+ if usart . sr . read ( ) . tc ( ) . bit_is_set ( ) {
756
749
Ok ( ( ) )
757
750
} else {
758
751
Err ( nb:: Error :: WouldBlock )
@@ -761,11 +754,9 @@ where
761
754
762
755
fn write ( & mut self , word : u16 ) -> nb:: Result < ( ) , Self :: Error > {
763
756
let usart = unsafe { & * USART :: ptr ( ) } ;
764
- let sr = usart. sr . read ( ) ;
765
757
766
- if sr. txe ( ) . bit_is_set ( ) {
767
- // NOTE(unsafe) atomic write to stateless register
768
- unsafe { & * USART :: ptr ( ) } . dr . write ( |w| w. dr ( ) . bits ( word) ) ;
758
+ if usart. sr . read ( ) . txe ( ) . bit_is_set ( ) {
759
+ usart. dr . write ( |w| w. dr ( ) . bits ( word) ) ;
769
760
Ok ( ( ) )
770
761
} else {
771
762
Err ( nb:: Error :: WouldBlock )
@@ -780,26 +771,14 @@ where
780
771
type Error = Infallible ;
781
772
782
773
fn bwrite_all ( & mut self , buffer : & [ u16 ] ) -> Result < ( ) , Self :: Error > {
783
- for & b in buffer {
784
- loop {
785
- match self . write ( b) {
786
- Err ( nb:: Error :: WouldBlock ) => continue ,
787
- Err ( nb:: Error :: Other ( err) ) => return Err ( err) ,
788
- Ok ( ( ) ) => break ,
789
- }
790
- }
774
+ for & w in buffer {
775
+ nb:: block!( <Self as crate :: hal:: serial:: Write <u16 >>:: write( self , w) ) ?;
791
776
}
792
777
Ok ( ( ) )
793
778
}
794
779
795
780
fn bflush ( & mut self ) -> Result < ( ) , Self :: Error > {
796
- loop {
797
- match <Self as crate :: hal:: serial:: Write < u16 > >:: flush ( self ) {
798
- Ok ( ( ) ) => return Ok ( ( ) ) ,
799
- Err ( nb:: Error :: WouldBlock ) => continue ,
800
- Err ( nb:: Error :: Other ( err) ) => return Err ( err) ,
801
- }
802
- }
781
+ nb:: block!( <Self as crate :: hal:: serial:: Write <u16 >>:: flush( self ) )
803
782
}
804
783
}
805
784
@@ -809,27 +788,15 @@ where
809
788
{
810
789
type Error = Infallible ;
811
790
812
- fn bwrite_all ( & mut self , bytes : & [ u8 ] ) -> Result < ( ) , Self :: Error > {
813
- for & b in bytes {
814
- loop {
815
- match self . write ( b) {
816
- Err ( nb:: Error :: WouldBlock ) => continue ,
817
- Err ( nb:: Error :: Other ( err) ) => return Err ( err) ,
818
- Ok ( ( ) ) => break ,
819
- }
820
- }
791
+ fn bwrite_all ( & mut self , buffer : & [ u8 ] ) -> Result < ( ) , Self :: Error > {
792
+ for & w in buffer {
793
+ nb:: block!( <Self as crate :: hal:: serial:: Write <u8 >>:: write( self , w) ) ?;
821
794
}
822
795
Ok ( ( ) )
823
796
}
824
797
825
798
fn bflush ( & mut self ) -> Result < ( ) , Self :: Error > {
826
- loop {
827
- match <Self as crate :: hal:: serial:: Write < u8 > >:: flush ( self ) {
828
- Ok ( ( ) ) => return Ok ( ( ) ) ,
829
- Err ( nb:: Error :: WouldBlock ) => continue ,
830
- Err ( nb:: Error :: Other ( err) ) => return Err ( err) ,
831
- }
832
- }
799
+ nb:: block!( <Self as crate :: hal:: serial:: Write <u8 >>:: flush( self ) )
833
800
}
834
801
}
835
802
@@ -839,8 +806,8 @@ where
839
806
{
840
807
type Error = Infallible ;
841
808
842
- fn bwrite_all ( & mut self , bytes : & [ u16 ] ) -> Result < ( ) , Self :: Error > {
843
- self . tx . bwrite_all ( bytes )
809
+ fn bwrite_all ( & mut self , buffer : & [ u16 ] ) -> Result < ( ) , Self :: Error > {
810
+ self . tx . bwrite_all ( buffer )
844
811
}
845
812
846
813
fn bflush ( & mut self ) -> Result < ( ) , Self :: Error > {
@@ -854,8 +821,8 @@ where
854
821
{
855
822
type Error = Infallible ;
856
823
857
- fn bwrite_all ( & mut self , bytes : & [ u8 ] ) -> Result < ( ) , Self :: Error > {
858
- self . tx . bwrite_all ( bytes )
824
+ fn bwrite_all ( & mut self , buffer : & [ u8 ] ) -> Result < ( ) , Self :: Error > {
825
+ self . tx . bwrite_all ( buffer )
859
826
}
860
827
861
828
fn bflush ( & mut self ) -> Result < ( ) , Self :: Error > {
0 commit comments