@@ -634,7 +634,11 @@ impl CFGR {
634
634
self . pll_config
635
635
} ;
636
636
637
- let sysclk = self . sysclk . unwrap_or ( HSI ) ;
637
+ let sysclk = match ( self . sysclk , self . msi ) {
638
+ ( Some ( sysclk) , _) => sysclk,
639
+ ( None , Some ( msi) ) => msi. to_hertz ( ) . 0 ,
640
+ ( None , None ) => MsiFreq :: RANGE4M . to_hertz ( ) . 0 ,
641
+ } ;
638
642
639
643
assert ! ( sysclk <= 80_000_000 ) ;
640
644
@@ -711,6 +715,7 @@ impl CFGR {
711
715
}
712
716
713
717
let sysclk_src_bits;
718
+ let mut msi = self . msi ;
714
719
if let Some ( pllconf) = pllconf {
715
720
// Sanity-checks per RM0394, 6.4.4 PLL configuration register (RCC_PLLCFGR)
716
721
let r = pllconf. r . to_division_factor ( ) ;
@@ -763,13 +768,13 @@ impl CFGR {
763
768
. bits ( sysclk_src_bits)
764
769
} ) ;
765
770
} else {
766
- // use HSI as source
767
- sysclk_src_bits = 0b01 ;
768
-
769
- rcc . cr . write ( |w| w . hsion ( ) . set_bit ( ) ) ;
770
- while rcc . cr . read ( ) . hsirdy ( ) . bit_is_clear ( ) { }
771
+ // use MSI as fallback source for sysclk
772
+ sysclk_src_bits = 0b00 ;
773
+ if msi . is_none ( ) {
774
+ msi = Some ( MsiFreq :: RANGE4M ) ;
775
+ }
771
776
772
- // SW: HSI selected as system clock
777
+ // SW: MSI selected as system clock
773
778
rcc. cfgr . write ( |w| unsafe {
774
779
w. ppre2 ( )
775
780
. bits ( ppre2_bits)
@@ -789,7 +794,7 @@ impl CFGR {
789
794
//
790
795
791
796
// MSI always starts on reset
792
- if self . msi . is_none ( ) {
797
+ if msi. is_none ( ) {
793
798
rcc. cr
794
799
. modify ( |_, w| w. msion ( ) . clear_bit ( ) . msipllen ( ) . clear_bit ( ) )
795
800
}
@@ -802,7 +807,7 @@ impl CFGR {
802
807
hclk : Hertz ( hclk) ,
803
808
lsi : lsi_used,
804
809
lse : self . lse . is_some ( ) ,
805
- msi : self . msi ,
810
+ msi,
806
811
hsi48 : self . hsi48 ,
807
812
pclk1 : Hertz ( pclk1) ,
808
813
pclk2 : Hertz ( pclk2) ,
0 commit comments