@@ -424,7 +424,7 @@ macro_rules! hal {
424
424
}
425
425
426
426
/// Sets the timer's prescaler and auto reload register so that the timer will reach
427
- /// the ARR after `ticks` amount of timer clock ticks.
427
+ /// the ARR after `ticks - 1 ` amount of timer clock ticks.
428
428
///
429
429
/// ```
430
430
/// // Set auto reload register to 50000 and prescaler to divide by 2.
@@ -567,7 +567,8 @@ fn calculate_timeout_ticks_register_values(ticks: u32) -> (u16, u16) {
567
567
// resulting in a value that always fits in 16 bits.
568
568
let psc = u16 ( ticks / ( 1 << 16 ) ) . unwrap ( ) ;
569
569
// Note (unwrap): Never panics because the divisor is always such that the result fits in 16 bits.
570
- let arr = u16 ( ticks / ( u32 ( psc) + 1 ) ) . unwrap ( ) ;
570
+ // Also note that the timer counts `0..=arr`, so subtract 1 to get the correct period.
571
+ let arr = u16 ( ticks / ( u32 ( psc) + 1 ) ) . unwrap ( ) . saturating_sub ( 1 ) ;
571
572
( psc, arr)
572
573
}
573
574
@@ -929,17 +930,17 @@ mod tests {
929
930
#[ test]
930
931
fn timeout_ticks_register_values ( ) {
931
932
assert_eq ! ( calculate_timeout_ticks_register_values( 0 ) , ( 0 , 0 ) ) ;
932
- assert_eq ! ( calculate_timeout_ticks_register_values( 50000 ) , ( 0 , 50000 ) ) ;
933
- assert_eq ! ( calculate_timeout_ticks_register_values( 100000 ) , ( 1 , 50000 ) ) ;
934
- assert_eq ! ( calculate_timeout_ticks_register_values( 65535 ) , ( 0 , 65535 ) ) ;
935
- assert_eq ! ( calculate_timeout_ticks_register_values( 65536 ) , ( 1 , 32768 ) ) ;
933
+ assert_eq ! ( calculate_timeout_ticks_register_values( 50000 ) , ( 0 , 49999 ) ) ;
934
+ assert_eq ! ( calculate_timeout_ticks_register_values( 100000 ) , ( 1 , 49999 ) ) ;
935
+ assert_eq ! ( calculate_timeout_ticks_register_values( 65535 ) , ( 0 , 65534 ) ) ;
936
+ assert_eq ! ( calculate_timeout_ticks_register_values( 65536 ) , ( 1 , 32767 ) ) ;
936
937
assert_eq ! (
937
938
calculate_timeout_ticks_register_values( 1000000 ) ,
938
- ( 15 , 62500 )
939
+ ( 15 , 62499 )
939
940
) ;
940
941
assert_eq ! (
941
942
calculate_timeout_ticks_register_values( u32 :: MAX ) ,
942
- ( u16 :: MAX , u16 :: MAX )
943
+ ( u16 :: MAX , u16 :: MAX - 1 )
943
944
) ;
944
945
}
945
946
}
0 commit comments