@@ -245,25 +245,34 @@ macro_rules! hal {
245
245
usart. cr2. reset( ) ;
246
246
usart. cr3. reset( ) ;
247
247
248
- // Configure baud rate
249
- match config. oversampling {
250
- Oversampling :: Over8 => {
251
- let uartdiv = 2 * clocks. $pclkX( ) . 0 / config. baudrate. 0 ;
252
- assert!( uartdiv >= 16 , "impossible baud rate" ) ;
248
+ potentially_uncompilable!( $is_full_uart, {
249
+ // Configure baud rate
250
+ match config. oversampling {
251
+ Oversampling :: Over8 => {
252
+ let uartdiv = 2 * clocks. $pclkX( ) . 0 / config. baudrate. 0 ;
253
+ assert!( uartdiv >= 16 , "impossible baud rate" ) ;
253
254
254
- let lower = ( uartdiv & 0xf ) >> 1 ;
255
- let brr = ( uartdiv & !0xf ) | lower;
255
+ let lower = ( uartdiv & 0xf ) >> 1 ;
256
+ let brr = ( uartdiv & !0xf ) | lower;
256
257
257
- potentially_uncompilable! ( $is_full_uart , { usart. cr1. modify( |_, w| w. over8( ) . set_bit( ) ) ; } ) ;
258
- usart. brr. write( |w| unsafe { w. bits( brr) } ) ;
259
- }
260
- Oversampling :: Over16 => {
261
- let brr = clocks. $pclkX( ) . 0 / config. baudrate. 0 ;
262
- assert!( brr >= 16 , "impossible baud rate" ) ;
258
+ usart. cr1. modify( |_, w| w. over8( ) . set_bit( ) ) ;
259
+ usart. brr. write( |w| unsafe { w. bits( brr) } ) ;
260
+ }
261
+ Oversampling :: Over16 => {
262
+ let brr = clocks. $pclkX( ) . 0 / config. baudrate. 0 ;
263
+ assert!( brr >= 16 , "impossible baud rate" ) ;
263
264
264
- usart. brr. write( |w| unsafe { w. bits( brr) } ) ;
265
+ usart. brr. write( |w| unsafe { w. bits( brr) } ) ;
266
+ }
265
267
}
266
- }
268
+ } ,
269
+ {
270
+ let fck = clocks. $pclkX( ) . 0 ;
271
+ assert!( ( fck >= 3 * config. baudrate. 0 ) && ( fck <= 4096 * config. baudrate. 0 ) , "impossible baud rate" ) ;
272
+ let brr = 256u64 * ( fck as u64 ) / config. baudrate. 0 as u64 ;
273
+ let brr = brr as u32 ;
274
+ usart. brr. write( |w| unsafe { w. bits( brr) } ) ;
275
+ } ) ;
267
276
268
277
potentially_uncompilable!( $is_full_uart, {
269
278
if let Some ( val) = config. receiver_timeout {
0 commit comments