@@ -750,16 +750,24 @@ impl CFGR {
750
750
let vco = clock_speed * pllconf. n as u32 ;
751
751
let pllclk = vco / r;
752
752
753
- let q = ( vco + 48_000_000 - 1 ) / 48_000_000 ;
754
- pll48m1clk = Some ( ( vco / q) . Hz ( ) ) ;
755
-
756
- if self . clk48_source == Some ( Clk48Source :: Pll ) {
753
+ let q;
754
+ ( q, pll48m1clk) = if self . clk48_source == Some ( Clk48Source :: Pll ) {
755
+ let q = match ( vco + 48_000_000 - 1 ) / 48_000_000 {
756
+ 0 ..=2 => PllDivider :: Div2 ,
757
+ 3 ..=4 => PllDivider :: Div4 ,
758
+ 5 ..=6 => PllDivider :: Div6 ,
759
+ 7 .. => PllDivider :: Div8 ,
760
+ } ;
761
+
762
+ let pll48m1clk = vco / q. to_division_factor ( ) ;
763
+ // TODO: Assert with tolerance.
757
764
assert_eq ! ( pll48m1clk, 48_000_000 ) ;
758
- }
759
765
760
- assert ! ( r <= 8 ) ; // Allowed max output divider
761
- assert ! ( pllconf. n >= 8 ) ; // Allowed min multiplier
762
- assert ! ( pllconf. n <= 86 ) ; // Allowed max multiplier
766
+ ( Some ( q) , Some ( pll48m1clk. Hz ( ) ) )
767
+ } else {
768
+ ( None , None )
769
+ } ;
770
+
763
771
assert ! ( clock_speed >= 4_000_000 ) ; // VCO input clock min
764
772
assert ! ( clock_speed <= 16_000_000 ) ; // VCO input clock max
765
773
assert ! ( vco >= 64_000_000 ) ; // VCO output min
@@ -783,7 +791,9 @@ impl CFGR {
783
791
. plln ( )
784
792
. bits ( pllconf. n )
785
793
. pllq ( )
786
- . bits ( q as u8 )
794
+ . bits ( q. unwrap_or ( PllDivider :: Div2 ) . to_bits ( ) )
795
+ . pllqen ( )
796
+ . bit ( q. is_some ( ) )
787
797
} ) ;
788
798
789
799
rcc. cr . modify ( |_, w| w. pllon ( ) . set_bit ( ) ) ;
@@ -904,7 +914,8 @@ impl PllConfig {
904
914
///
905
915
/// PLL output = ((SourceClk / input_divider) * multiplier) / output_divider
906
916
pub fn new ( input_divider : u8 , multiplier : u8 , output_divider : PllDivider ) -> Self {
907
- assert ! ( input_divider > 0 ) ;
917
+ assert ! ( input_divider >= 1 && input_divider <= 8 ) ;
918
+ assert ! ( multiplier >= 8 && multiplier <= 86 ) ;
908
919
909
920
PllConfig {
910
921
m : input_divider - 1 ,
0 commit comments