133
133
134
134
use crate :: pwr:: PowerConfiguration ;
135
135
use crate :: pwr:: VoltageScale as Voltage ;
136
+ #[ cfg( feature = "rm0481" ) ]
137
+ use crate :: stm32:: rcc:: pll3cfgr:: PLL3SRC ;
136
138
use crate :: stm32:: rcc:: {
137
139
ccipr5:: CKPERSEL , cfgr1:: SW , cfgr1:: TIMPRE , cfgr2:: HPRE ,
138
140
cfgr2:: PPRE1 as PPRE , pll1cfgr:: PLL1SRC , pll2cfgr:: PLL2SRC ,
139
141
} ;
140
142
use crate :: stm32:: { RCC , SBS } ;
141
143
use crate :: time:: Hertz ;
142
144
145
+ use core_clocks:: PllClocks ;
143
146
#[ cfg( feature = "log" ) ]
144
147
use log:: debug;
145
148
@@ -168,8 +171,6 @@ pub struct Config {
168
171
rcc_pclk1 : Option < u32 > ,
169
172
rcc_pclk2 : Option < u32 > ,
170
173
rcc_pclk3 : Option < u32 > ,
171
- #[ cfg( feature = "rm0481" ) ]
172
- rcc_pclk4 : Option < u32 > ,
173
174
mco1 : MCO1Config ,
174
175
mco2 : MCO2Config ,
175
176
pll1 : PllConfig ,
@@ -199,8 +200,6 @@ impl RccExt for RCC {
199
200
rcc_pclk1 : None ,
200
201
rcc_pclk2 : None ,
201
202
rcc_pclk3 : None ,
202
- #[ cfg( feature = "rm0481" ) ]
203
- rcc_pclk4 : None ,
204
203
mco1 : MCO1Config :: default ( ) ,
205
204
mco2 : MCO2Config :: default ( ) ,
206
205
pll1 : PllConfig :: default ( ) ,
@@ -376,11 +375,6 @@ impl Rcc {
376
375
pclk3: rcc_pclk3,
377
376
}
378
377
379
- #[ cfg( feature = "rm0481" ) ]
380
- pclk_setter ! {
381
- pclk4: rcc_pclk4,
382
- }
383
-
384
378
pll_setter ! {
385
379
pll1: [
386
380
pll1_p_ck: p_ck,
@@ -394,10 +388,24 @@ impl Rcc {
394
388
] ,
395
389
}
396
390
391
+ #[ cfg( feature = "rm0481" ) ]
392
+ pll_setter ! {
393
+ pll3: [
394
+ pll3_p_ck: p_ck,
395
+ pll3_q_ck: q_ck,
396
+ pll3_r_ck: r_ck,
397
+ ] ,
398
+ }
399
+
397
400
pll_strategy_setter ! {
398
401
pll1: pll1_strategy,
399
402
pll2: pll2_strategy,
400
403
}
404
+
405
+ #[ cfg( feature = "rm0481" ) ]
406
+ pll_strategy_setter ! {
407
+ pll3: pll3_strategy,
408
+ }
401
409
}
402
410
403
411
/// Divider calculator for pclk 1 - 4
@@ -574,6 +582,10 @@ impl Rcc {
574
582
let ( pll2_p_ck, pll2_q_ck, pll2_r_ck) =
575
583
self . pll2_setup ( rcc, & self . config . pll2 ) ;
576
584
585
+ #[ cfg( feature = "rm0481" ) ]
586
+ let ( pll3_p_ck, pll3_q_ck, pll3_r_ck) =
587
+ self . pll3_setup ( rcc, & self . config . pll3 ) ;
588
+
577
589
let sys_ck = if sys_use_pll1_p {
578
590
pll1_p_ck. unwrap ( ) // Must have been set by sys_ck_setup
579
591
} else {
@@ -718,6 +730,15 @@ impl Rcc {
718
730
} ;
719
731
rcc. pll1cfgr ( ) . modify ( |_, w| w. pll1src ( ) . variant ( pll1src) ) ;
720
732
rcc. pll2cfgr ( ) . modify ( |_, w| w. pll2src ( ) . variant ( pll2src) ) ;
733
+ #[ cfg( feature = "rm0481" ) ]
734
+ {
735
+ let pll3src = if self . config . hse . is_some ( ) {
736
+ PLL3SRC :: Hse
737
+ } else {
738
+ PLL3SRC :: Hsi
739
+ } ;
740
+ rcc. pll3cfgr ( ) . modify ( |_, w| w. pll3src ( ) . variant ( pll3src) ) ;
741
+ }
721
742
722
743
// PLL1
723
744
if pll1_p_ck. is_some ( ) {
@@ -733,6 +754,14 @@ impl Rcc {
733
754
while rcc. cr ( ) . read ( ) . pll2rdy ( ) . is_not_ready ( ) { }
734
755
}
735
756
757
+ // PLL3
758
+ #[ cfg( feature = "rm0481" ) ]
759
+ if pll3_p_ck. is_some ( ) {
760
+ // Enable PLL and wait for it to stabilise
761
+ rcc. cr ( ) . modify ( |_, w| w. pll3on ( ) . on ( ) ) ;
762
+ while rcc. cr ( ) . read ( ) . pll3rdy ( ) . is_not_ready ( ) { }
763
+ }
764
+
736
765
// Core Prescaler / AHB Prescaler / APBx Prescalers
737
766
rcc. cfgr2 ( ) . modify ( |_, w| {
738
767
w. hpre ( )
@@ -824,19 +853,6 @@ impl Rcc {
824
853
pll1cfgr. pll1ren( ) . variant( ) ,
825
854
) ;
826
855
827
- let pll2cfgr = rcc. pll2cfgr ( ) . read ( ) ;
828
- debug ! (
829
- "PLL2CFGR register: PLL2SRC={:?} PLL2RGE={:?} PLL2FRACEN={:?} PLL2VCOSEL={:?} PLL2M={:#x} PLL2PEN={:?} PLL2QEN={:?} PLL2REN={:?}" ,
830
- pll2cfgr. pll2src( ) . variant( ) ,
831
- pll2cfgr. pll2rge( ) . variant( ) ,
832
- pll2cfgr. pll2fracen( ) . variant( ) ,
833
- pll2cfgr. pll2vcosel( ) . variant( ) ,
834
- pll2cfgr. pll2m( ) . bits( ) ,
835
- pll2cfgr. pll2pen( ) . variant( ) ,
836
- pll2cfgr. pll2qen( ) . variant( ) ,
837
- pll2cfgr. pll2ren( ) . variant( ) ,
838
- ) ;
839
-
840
856
let pll1divr = rcc. pll1divr ( ) . read ( ) ;
841
857
debug ! (
842
858
"PLL1DIVR register: PLL1N={:#x} PLL1P={:#x} PLL1Q={:#x} PLL1R={:#x}" ,
@@ -852,6 +868,19 @@ impl Rcc {
852
868
pll1fracr. pll1fracn( ) . bits( ) ,
853
869
) ;
854
870
871
+ let pll2cfgr = rcc. pll2cfgr ( ) . read ( ) ;
872
+ debug ! (
873
+ "PLL2CFGR register: PLL2SRC={:?} PLL2RGE={:?} PLL2FRACEN={:?} PLL2VCOSEL={:?} PLL2M={:#x} PLL2PEN={:?} PLL2QEN={:?} PLL2REN={:?}" ,
874
+ pll2cfgr. pll2src( ) . variant( ) ,
875
+ pll2cfgr. pll2rge( ) . variant( ) ,
876
+ pll2cfgr. pll2fracen( ) . variant( ) ,
877
+ pll2cfgr. pll2vcosel( ) . variant( ) ,
878
+ pll2cfgr. pll2m( ) . bits( ) ,
879
+ pll2cfgr. pll2pen( ) . variant( ) ,
880
+ pll2cfgr. pll2qen( ) . variant( ) ,
881
+ pll2cfgr. pll2ren( ) . variant( ) ,
882
+ ) ;
883
+
855
884
let pll2divr = rcc. pll2divr ( ) . read ( ) ;
856
885
debug ! (
857
886
"PLL2DIVR register: PLL2N={:#x} PLL2P={:#x} PLL2Q={:#x} PLL2R={:#x}" ,
@@ -866,8 +895,44 @@ impl Rcc {
866
895
"PLL2FRACR register: FRACN2={:#x}" ,
867
896
pll2fracr. pll2fracn( ) . bits( ) ,
868
897
) ;
898
+
899
+ #[ cfg( feature = "rm0481" ) ]
900
+ {
901
+ let pll3cfgr = rcc. pll3cfgr ( ) . read ( ) ;
902
+ debug ! (
903
+ "PLL3CFGR register: PLL3SRC={:?} PLL3RGE={:?} PLL3FRACEN={:?} PLL3VCOSEL={:?} PLL3M={:#x} PLL3PEN={:?} PLL3QEN={:?} PLL3REN={:?}" ,
904
+ pll3cfgr. pll3src( ) . variant( ) ,
905
+ pll3cfgr. pll3rge( ) . variant( ) ,
906
+ pll3cfgr. pll3fracen( ) . variant( ) ,
907
+ pll3cfgr. pll3vcosel( ) . variant( ) ,
908
+ pll3cfgr. pll3m( ) . bits( ) ,
909
+ pll3cfgr. pll3pen( ) . variant( ) ,
910
+ pll3cfgr. pll3qen( ) . variant( ) ,
911
+ pll3cfgr. pll3ren( ) . variant( ) ,
912
+ ) ;
913
+
914
+ let pll3divr = rcc. pll3divr ( ) . read ( ) ;
915
+ debug ! (
916
+ "PLL3DIVR register: PLL3N={:#x} PLL3P={:#x} PLL3Q={:#x} PLL3R={:#x}" ,
917
+ pll3divr. pll3n( ) . bits( ) ,
918
+ pll3divr. pll3p( ) . bits( ) ,
919
+ pll3divr. pll3q( ) . bits( ) ,
920
+ pll3divr. pll3r( ) . bits( ) ,
921
+ ) ;
922
+
923
+ let pll3fracr = rcc. pll3fracr ( ) . read ( ) ;
924
+ debug ! (
925
+ "PLL3FRACR register: FRACN2={:#x}" ,
926
+ pll3fracr. pll3fracn( ) . bits( ) ,
927
+ ) ;
928
+ }
869
929
}
870
930
931
+ let pll1 = PllClocks :: new ( pll1_p_ck, pll1_q_ck, pll1_r_ck) ;
932
+ let pll2 = PllClocks :: new ( pll2_p_ck, pll2_q_ck, pll2_r_ck) ;
933
+ #[ cfg( feature = "rm0481" ) ]
934
+ let pll3 = PllClocks :: new ( pll3_p_ck, pll3_q_ck, pll3_r_ck) ;
935
+
871
936
// Return frozen clock configuration
872
937
Ccdr {
873
938
clocks : CoreClocks {
@@ -888,12 +953,10 @@ impl Rcc {
888
953
audio_ck,
889
954
mco1_ck,
890
955
mco2_ck,
891
- pll1_p_ck,
892
- pll1_q_ck,
893
- pll1_r_ck,
894
- pll2_p_ck,
895
- pll2_q_ck,
896
- pll2_r_ck,
956
+ pll1,
957
+ pll2,
958
+ #[ cfg( feature = "rm0481" ) ]
959
+ pll3,
897
960
timx_ker_ck : Hertz :: from_raw ( rcc_timx_ker_ck) ,
898
961
timy_ker_ck : Hertz :: from_raw ( rcc_timy_ker_ck) ,
899
962
sys_ck,
0 commit comments