7676//! let received: u8 = block!(rx.read()).unwrap();
7777//! ```
7878
79+ use core:: convert:: Infallible ;
7980use core:: marker:: PhantomData ;
8081use core:: ops:: Deref ;
8182use core:: sync:: atomic:: { self , Ordering } ;
82-
83- use crate :: pac:: { RCC , USART1 , USART2 , USART3 } ;
84- use core:: convert:: Infallible ;
8583use embedded_dma:: { StaticReadBuffer , StaticWriteBuffer } ;
8684use embedded_hal:: serial:: Write ;
8785
@@ -92,6 +90,7 @@ use crate::gpio::gpiob::{PB10, PB11, PB6, PB7};
9290use crate :: gpio:: gpioc:: { PC10 , PC11 } ;
9391use crate :: gpio:: gpiod:: { PD5 , PD6 , PD8 , PD9 } ;
9492use crate :: gpio:: { Alternate , Input } ;
93+ use crate :: pac:: { RCC , USART1 , USART2 , USART3 } ;
9594use crate :: rcc:: { BusClock , Clocks , Enable , Reset } ;
9695use crate :: time:: { Bps , U32Ext } ;
9796
@@ -167,13 +166,13 @@ pub enum Parity {
167166}
168167
169168pub enum StopBits {
170- # [ doc = " 1 stop bit" ]
169+ /// 1 stop bit
171170 STOP1 ,
172- # [ doc = " 0.5 stop bits" ]
171+ /// 0.5 stop bits
173172 STOP0P5 ,
174- # [ doc = " 2 stop bits" ]
173+ /// 2 stop bits
175174 STOP2 ,
176- # [ doc = " 1.5 stop bits" ]
175+ /// 1.5 stop bits
177176 STOP1P5 ,
178177}
179178
@@ -320,21 +319,19 @@ where
320319 assert ! ( brr >= 16 , "impossible baud rate" ) ;
321320 self . usart . brr . write ( |w| unsafe { w. bits ( brr) } ) ;
322321
323- let ( parity_control_enable, parity) = match config. parity {
322+ // Configure word
323+ let ( parity_is_used, parity_is_odd) = match config. parity {
324324 Parity :: ParityNone => ( false , false ) ,
325325 Parity :: ParityEven => ( true , false ) ,
326326 Parity :: ParityOdd => ( true , true ) ,
327327 } ;
328328 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)
338335 } ) ;
339336
340337 // Configure stop bits
@@ -356,12 +353,11 @@ where
356353 config : impl Into < Config > ,
357354 clocks : Clocks ,
358355 ) -> nb:: Result < ( ) , Infallible > {
359- let sr = self . usart . sr . read ( ) ;
360356 // if we're currently busy transmitting, we have to wait until that is
361357 // over -- regarding reception, we assume that the caller -- with
362358 // exclusive access to the Serial instance due to &mut self -- knows
363359 // what they're doing.
364- if sr . tc ( ) . bit_is_clear ( ) {
360+ if self . usart . sr . read ( ) . tc ( ) . bit_is_clear ( ) {
365361 return nb:: Result :: Err ( nb:: Error :: WouldBlock ) ;
366362 }
367363 self . apply_config ( config. into ( ) , clocks) ;
@@ -372,22 +368,22 @@ where
372368 /// ready to be read (RXNE)_ interrupt and _Transmit data
373369 /// register empty (TXE)_ interrupt
374370 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+ } ) ;
380376 }
381377
382378 /// Stops listening to the USART by disabling the _Received data
383379 /// ready to be read (RXNE)_ interrupt and _Transmit data
384380 /// register empty (TXE)_ interrupt
385381 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+ } ) ;
391387 }
392388
393389 /// Returns true if the line idle status is set
@@ -407,10 +403,8 @@ where
407403
408404 /// Clear idle line interrupt flag
409405 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 ( ) ;
414408 }
415409
416410 /// Returns ownership of the borrowed register handles
@@ -686,17 +680,14 @@ where
686680
687681 if let Some ( err) = err {
688682 // 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.
692684 let _ = usart. sr . read ( ) ;
693685 let _ = usart. dr . read ( ) ;
694686 Err ( nb:: Error :: Other ( err) )
695687 } else {
696688 // Check if a byte is available
697689 if sr. rxne ( ) . bit_is_set ( ) {
698690 // Read the received byte
699- // NOTE(read_volatile) see `write_volatile` below
700691 Ok ( usart. dr . read ( ) . dr ( ) . bits ( ) )
701692 } else {
702693 Err ( nb:: Error :: WouldBlock )
@@ -727,11 +718,13 @@ where
727718{
728719 type Error = Infallible ;
729720
721+ #[ inline( always) ]
730722 fn write ( & mut self , word : u8 ) -> nb:: Result < ( ) , Self :: Error > {
731723 // Delegate to u16 version
732- Tx :: < USART , u16 > :: new ( ) . write ( u16 :: from ( word) )
724+ Tx :: < USART , u16 > :: new ( ) . write ( word as u16 )
733725 }
734726
727+ #[ inline( always) ]
735728 fn flush ( & mut self ) -> nb:: Result < ( ) , Self :: Error > {
736729 // Delegate to u16 version
737730 Tx :: < USART , u16 > :: new ( ) . flush ( )
@@ -750,9 +743,9 @@ where
750743 type Error = Infallible ;
751744
752745 fn flush ( & mut self ) -> nb:: Result < ( ) , Self :: Error > {
753- let sr = unsafe { & * USART :: ptr ( ) } . sr . read ( ) ;
746+ let usart = unsafe { & * USART :: ptr ( ) } ;
754747
755- if sr . tc ( ) . bit_is_set ( ) {
748+ if usart . sr . read ( ) . tc ( ) . bit_is_set ( ) {
756749 Ok ( ( ) )
757750 } else {
758751 Err ( nb:: Error :: WouldBlock )
@@ -761,11 +754,9 @@ where
761754
762755 fn write ( & mut self , word : u16 ) -> nb:: Result < ( ) , Self :: Error > {
763756 let usart = unsafe { & * USART :: ptr ( ) } ;
764- let sr = usart. sr . read ( ) ;
765757
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) ) ;
769760 Ok ( ( ) )
770761 } else {
771762 Err ( nb:: Error :: WouldBlock )
@@ -780,26 +771,14 @@ where
780771 type Error = Infallible ;
781772
782773 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) ) ?;
791776 }
792777 Ok ( ( ) )
793778 }
794779
795780 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 ) )
803782 }
804783}
805784
@@ -809,27 +788,15 @@ where
809788{
810789 type Error = Infallible ;
811790
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) ) ?;
821794 }
822795 Ok ( ( ) )
823796 }
824797
825798 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 ) )
833800 }
834801}
835802
@@ -839,8 +806,8 @@ where
839806{
840807 type Error = Infallible ;
841808
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 )
844811 }
845812
846813 fn bflush ( & mut self ) -> Result < ( ) , Self :: Error > {
@@ -854,8 +821,8 @@ where
854821{
855822 type Error = Infallible ;
856823
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 )
859826 }
860827
861828 fn bflush ( & mut self ) -> Result < ( ) , Self :: Error > {
0 commit comments