@@ -22,10 +22,14 @@ pub struct Clocks {
22
22
pub core_clk : Hertz ,
23
23
/// AHB frequency
24
24
pub ahb_clk : Hertz ,
25
- /// APB frequency
26
- pub apb_clk : Hertz ,
27
- /// APB timers frequency
28
- pub apb_tim_clk : Hertz ,
25
+ /// APB 1 frequency
26
+ pub apb1_clk : Hertz ,
27
+ /// APB 1 timers frequency (Timers 2-7)
28
+ pub apb1_tim_clk : Hertz ,
29
+ /// APB 2 frequency
30
+ pub apb2_clk : Hertz ,
31
+ /// APB 2 timers frequency (Timers 1, 8, 20, 15, 16, 17 and HRTIM1)
32
+ pub apb2_tim_clk : Hertz ,
29
33
/// PLL frequency
30
34
pub pll_clk : PLLClocks ,
31
35
}
@@ -48,8 +52,10 @@ impl Default for Clocks {
48
52
sys_clk : freq,
49
53
ahb_clk : freq,
50
54
core_clk : freq,
51
- apb_clk : freq,
52
- apb_tim_clk : freq,
55
+ apb1_clk : freq,
56
+ apb1_tim_clk : freq,
57
+ apb2_clk : freq,
58
+ apb2_tim_clk : freq,
53
59
pll_clk : PLLClocks {
54
60
r : None ,
55
61
q : None ,
@@ -101,7 +107,14 @@ impl Rcc {
101
107
Prescaler :: Div512 => ( sys_freq / 512 , 0b1111 ) ,
102
108
_ => ( sys_clk. 0 , 0b0000 ) ,
103
109
} ;
104
- let ( apb_freq, apb_psc_bits) = match rcc_cfg. apb_psc {
110
+ let ( apb1_freq, apb1_psc_bits) = match rcc_cfg. apb1_psc {
111
+ Prescaler :: Div2 => ( sys_clk. 0 / 2 , 0b100 ) ,
112
+ Prescaler :: Div4 => ( sys_clk. 0 / 4 , 0b101 ) ,
113
+ Prescaler :: Div8 => ( sys_clk. 0 / 8 , 0b110 ) ,
114
+ Prescaler :: Div16 => ( sys_clk. 0 / 16 , 0b111 ) ,
115
+ _ => ( sys_clk. 0 , 0b000 ) ,
116
+ } ;
117
+ let ( apb2_freq, apb2_psc_bits) = match rcc_cfg. apb2_psc {
105
118
Prescaler :: Div2 => ( sys_clk. 0 / 2 , 0b100 ) ,
106
119
Prescaler :: Div4 => ( sys_clk. 0 / 4 , 0b101 ) ,
107
120
Prescaler :: Div8 => ( sys_clk. 0 / 8 , 0b110 ) ,
@@ -127,24 +140,41 @@ impl Rcc {
127
140
w. hpre ( )
128
141
. bits ( ahb_psc_bits)
129
142
. ppre1 ( )
130
- . bits ( apb_psc_bits )
143
+ . bits ( apb1_psc_bits )
131
144
. ppre2 ( )
132
- . bits ( apb_psc_bits )
145
+ . bits ( apb2_psc_bits )
133
146
. sw ( )
134
147
. bits ( sw_bits)
135
148
} ) ;
136
149
137
150
while self . rb . cfgr . read ( ) . sws ( ) . bits ( ) != sw_bits { }
138
151
152
+ // From RM:
153
+ // The timer clock frequencies are automatically defined by hardware. There are two cases:
154
+ // 1. If the APB prescaler equals 1, the timer clock frequencies are set to the same
155
+ // frequency as that of the APB domain.
156
+ // 2. Otherwise, they are set to twice (×2) the frequency of the APB domain.
157
+ let apb1_tim_clk = match rcc_cfg. apb1_psc {
158
+ Prescaler :: NotDivided => apb1_freq,
159
+ _ => apb1_freq * 2 ,
160
+ } ;
161
+
162
+ let apb2_tim_clk = match rcc_cfg. apb2_psc {
163
+ Prescaler :: NotDivided => apb2_freq,
164
+ _ => apb2_freq * 2 ,
165
+ } ;
166
+
139
167
Rcc {
140
168
rb : self . rb ,
141
169
clocks : Clocks {
142
170
pll_clk,
143
171
sys_clk,
144
172
core_clk : ahb_freq. hz ( ) ,
145
173
ahb_clk : ahb_freq. hz ( ) ,
146
- apb_clk : apb_freq. hz ( ) ,
147
- apb_tim_clk : apb_freq. hz ( ) ,
174
+ apb1_clk : apb1_freq. hz ( ) ,
175
+ apb1_tim_clk : apb1_tim_clk. hz ( ) ,
176
+ apb2_clk : apb2_freq. hz ( ) ,
177
+ apb2_tim_clk : apb2_tim_clk. hz ( ) ,
148
178
} ,
149
179
}
150
180
}
@@ -451,33 +481,27 @@ impl GetBusFreq for AHB3 {
451
481
452
482
impl GetBusFreq for APB1_1 {
453
483
fn get_frequency ( clocks : & Clocks ) -> Hertz {
454
- clocks. apb_clk
484
+ clocks. apb1_clk
455
485
}
456
486
fn get_timer_frequency ( clocks : & Clocks ) -> Hertz {
457
- // let pclk_mul = if clocks.ppre1 == 1 { 1 } else { 2 };
458
- // Hertz(clocks.pclk1.0 * pclk_mul)
459
- clocks. apb_tim_clk
487
+ clocks. apb1_tim_clk
460
488
}
461
489
}
462
490
463
491
impl GetBusFreq for APB1_2 {
464
492
fn get_frequency ( clocks : & Clocks ) -> Hertz {
465
- clocks. apb_clk
493
+ clocks. apb1_clk
466
494
}
467
495
fn get_timer_frequency ( clocks : & Clocks ) -> Hertz {
468
- // let pclk_mul = if clocks.ppre1 == 1 { 1 } else { 2 };
469
- // Hertz(clocks.pclk1.0 * pclk_mul)
470
- clocks. apb_tim_clk
496
+ clocks. apb1_tim_clk
471
497
}
472
498
}
473
499
474
500
impl GetBusFreq for APB2 {
475
501
fn get_frequency ( clocks : & Clocks ) -> Hertz {
476
- clocks. apb_clk
502
+ clocks. apb2_clk
477
503
}
478
504
fn get_timer_frequency ( clocks : & Clocks ) -> Hertz {
479
- // let pclk_mul = if clocks.ppre2 == 1 { 1 } else { 2 };
480
- // Hertz(clocks.pclk2.0 * pclk_mul)
481
- clocks. apb_tim_clk
505
+ clocks. apb2_tim_clk
482
506
}
483
507
}
0 commit comments