2
2
3
3
use core:: cmp;
4
4
5
- use crate :: stm32:: { rcc, RCC } ;
6
- use cast:: u32;
5
+ use crate :: stm32:: {
6
+ rcc:: { self , cfgr} ,
7
+ RCC ,
8
+ } ;
7
9
8
10
use crate :: flash:: ACR ;
9
11
use crate :: time:: Hertz ;
@@ -195,14 +197,14 @@ impl CFGR {
195
197
feature = "stm32f303xe" ,
196
198
feature = "stm32f398"
197
199
) ) ) ]
198
- fn calc_pll ( & self ) -> ( u32 , u32 , rcc :: cfgr:: PLLSRC_A ) {
200
+ fn calc_pll ( & self ) -> ( u32 , u32 , cfgr:: PLLSRC_A ) {
199
201
let pllsrcclk = self . hse . unwrap_or ( HSI / 2 ) ;
200
202
let pllmul = self . sysclk . unwrap_or ( pllsrcclk) / pllsrcclk;
201
203
202
204
let pllsrc = if self . hse . is_some ( ) {
203
- rcc :: cfgr:: PLLSRC_A :: HSE_DIV_PREDIV
205
+ cfgr:: PLLSRC_A :: HSE_DIV_PREDIV
204
206
} else {
205
- rcc :: cfgr:: PLLSRC_A :: HSI_DIV2
207
+ cfgr:: PLLSRC_A :: HSI_DIV2
206
208
} ;
207
209
( pllsrcclk, pllmul, pllsrc)
208
210
}
@@ -214,92 +216,108 @@ impl CFGR {
214
216
feature = "stm32f303xe" ,
215
217
feature = "stm32f398" ,
216
218
) ) ]
217
- fn calc_pll ( & self ) -> ( u32 , u32 , rcc :: cfgr:: PLLSRC_A ) {
219
+ fn calc_pll ( & self ) -> ( u32 , u32 , cfgr:: PLLSRC_A ) {
218
220
let mut pllsrcclk = self . hse . unwrap_or ( HSI / 2 ) ;
219
221
let mut pllmul = self . sysclk . unwrap_or ( pllsrcclk) / pllsrcclk;
220
222
221
223
let pllsrc = if self . hse . is_some ( ) {
222
- rcc :: cfgr:: PLLSRC_A :: HSE_DIV_PREDIV
224
+ cfgr:: PLLSRC_A :: HSE_DIV_PREDIV
223
225
} else if pllmul > 16 {
224
226
pllmul /= 2 ;
225
227
pllsrcclk *= 2 ;
226
- rcc :: cfgr:: PLLSRC_A :: HSI_DIV_PREDIV
228
+ cfgr:: PLLSRC_A :: HSI_DIV_PREDIV
227
229
} else {
228
- rcc :: cfgr:: PLLSRC_A :: HSI_DIV2
230
+ cfgr:: PLLSRC_A :: HSI_DIV2
229
231
} ;
230
232
( pllsrcclk, pllmul, pllsrc)
231
233
}
232
234
233
235
/// Returns a tuple containing the effective sysclk rate and optional pll settings.
234
- fn calc_sysclk ( & self ) -> ( u32 , Option < ( u8 , rcc :: cfgr:: PLLSRC_A ) > ) {
236
+ fn calc_sysclk ( & self ) -> ( u32 , Option < ( cfgr :: PLLMUL_A , cfgr:: PLLSRC_A ) > ) {
235
237
let ( pllsrcclk, pllmul, pllsrc) = self . calc_pll ( ) ;
236
238
if pllmul == 1 {
237
239
return ( pllsrcclk, None ) ;
238
240
}
239
241
240
242
let pllmul = cmp:: min ( cmp:: max ( pllmul, 2 ) , 16 ) ;
241
- let sysclk = pllmul * pllsrcclk ;
243
+ let sysclk = pllsrcclk * pllmul ;
242
244
assert ! ( sysclk <= 72_000_000 ) ;
243
245
244
- let pllmul_bits = pllmul as u8 - 2 ;
245
- ( sysclk, Some ( ( pllmul_bits, pllsrc) ) )
246
+ // NOTE From<u8> for PLLMUL_A is not implemented
247
+ let pllmul_mul = match pllmul as u8 {
248
+ 2 => cfgr:: PLLMUL_A :: MUL2 ,
249
+ 3 => cfgr:: PLLMUL_A :: MUL3 ,
250
+ 4 => cfgr:: PLLMUL_A :: MUL4 ,
251
+ 5 => cfgr:: PLLMUL_A :: MUL5 ,
252
+ 6 => cfgr:: PLLMUL_A :: MUL6 ,
253
+ 7 => cfgr:: PLLMUL_A :: MUL7 ,
254
+ 8 => cfgr:: PLLMUL_A :: MUL8 ,
255
+ 9 => cfgr:: PLLMUL_A :: MUL9 ,
256
+ 10 => cfgr:: PLLMUL_A :: MUL10 ,
257
+ 11 => cfgr:: PLLMUL_A :: MUL11 ,
258
+ 12 => cfgr:: PLLMUL_A :: MUL12 ,
259
+ 13 => cfgr:: PLLMUL_A :: MUL13 ,
260
+ 14 => cfgr:: PLLMUL_A :: MUL14 ,
261
+ 15 => cfgr:: PLLMUL_A :: MUL15 ,
262
+ 16 => cfgr:: PLLMUL_A :: MUL16 ,
263
+ _ => unreachable ! ( ) ,
264
+ } ;
265
+ ( sysclk, Some ( ( pllmul_mul, pllsrc) ) )
246
266
}
247
267
248
268
/// Freezes the clock configuration, making it effective
249
269
pub fn freeze ( self , acr : & mut ACR ) -> Clocks {
250
270
let ( sysclk, pll_options) = self . calc_sysclk ( ) ;
251
271
252
- let hpre_bits = self
272
+ let ( hpre_bits, hpre ) = self
253
273
. hclk
254
274
. map ( |hclk| match sysclk / hclk {
255
275
0 => unreachable ! ( ) ,
256
- 1 => 0b0111 ,
257
- 2 => 0b1000 ,
258
- 3 ..=5 => 0b1001 ,
259
- 6 ..=11 => 0b1010 ,
260
- 12 ..=39 => 0b1011 ,
261
- 40 ..=95 => 0b1100 ,
262
- 96 ..=191 => 0b1101 ,
263
- 192 ..=383 => 0b1110 ,
264
- _ => 0b1111 ,
276
+ 1 => ( cfgr :: HPRE_A :: DIV1 , 1 ) ,
277
+ 2 => ( cfgr :: HPRE_A :: DIV2 , 2 ) ,
278
+ 3 ..=5 => ( cfgr :: HPRE_A :: DIV4 , 4 ) ,
279
+ 6 ..=11 => ( cfgr :: HPRE_A :: DIV8 , 8 ) ,
280
+ 12 ..=39 => ( cfgr :: HPRE_A :: DIV16 , 16 ) ,
281
+ 40 ..=95 => ( cfgr :: HPRE_A :: DIV64 , 64 ) ,
282
+ 96 ..=191 => ( cfgr :: HPRE_A :: DIV128 , 128 ) ,
283
+ 192 ..=383 => ( cfgr :: HPRE_A :: DIV256 , 256 ) ,
284
+ _ => ( cfgr :: HPRE_A :: DIV512 , 512 ) ,
265
285
} )
266
- . unwrap_or ( 0b0111 ) ;
286
+ . unwrap_or ( ( cfgr :: HPRE_A :: DIV1 , 1 ) ) ;
267
287
268
- let hclk = sysclk / ( 1 << ( hpre_bits - 0b0111 ) ) ;
288
+ let hclk: u32 = sysclk / hpre ;
269
289
270
290
assert ! ( hclk <= 72_000_000 ) ;
271
291
272
- let ppre1_bits = self
292
+ let ( ppre1_bits, ppre1 ) = self
273
293
. pclk1
274
294
. map ( |pclk1| match hclk / pclk1 {
275
295
0 => unreachable ! ( ) ,
276
- 1 => 0b011 ,
277
- 2 => 0b100 ,
278
- 3 ..=5 => 0b101 ,
279
- 6 ..=11 => 0b110 ,
280
- _ => 0b111 ,
296
+ 1 => ( cfgr :: PPRE1_A :: DIV1 , 1 ) ,
297
+ 2 => ( cfgr :: PPRE1_A :: DIV2 , 2 ) ,
298
+ 3 ..=5 => ( cfgr :: PPRE1_A :: DIV4 , 4 ) ,
299
+ 6 ..=11 => ( cfgr :: PPRE1_A :: DIV8 , 8 ) ,
300
+ _ => ( cfgr :: PPRE1_A :: DIV16 , 16 ) ,
281
301
} )
282
- . unwrap_or ( 0b011 ) ;
302
+ . unwrap_or ( ( cfgr :: PPRE1_A :: DIV1 , 1 ) ) ;
283
303
284
- let ppre1 = 1 << ( ppre1_bits - 0b011 ) ;
285
- let pclk1 = hclk / u32 ( ppre1) ;
304
+ let pclk1 = hclk / u32:: from ( ppre1) ;
286
305
287
306
assert ! ( pclk1 <= 36_000_000 ) ;
288
307
289
- let ppre2_bits = self
308
+ let ( ppre2_bits, ppre2 ) = self
290
309
. pclk2
291
310
. map ( |pclk2| match hclk / pclk2 {
292
311
0 => unreachable ! ( ) ,
293
- 1 => 0b011 ,
294
- 2 => 0b100 ,
295
- 3 ..=5 => 0b101 ,
296
- 6 ..=11 => 0b110 ,
297
- _ => 0b111 ,
312
+ 1 => ( cfgr :: PPRE2_A :: DIV1 , 1 ) ,
313
+ 2 => ( cfgr :: PPRE2_A :: DIV2 , 2 ) ,
314
+ 3 ..=5 => ( cfgr :: PPRE2_A :: DIV4 , 4 ) ,
315
+ 6 ..=11 => ( cfgr :: PPRE2_A :: DIV8 , 8 ) ,
316
+ _ => ( cfgr :: PPRE2_A :: DIV16 , 16 ) ,
298
317
} )
299
- . unwrap_or ( 0b011 ) ;
318
+ . unwrap_or ( ( cfgr :: PPRE2_A :: DIV1 , 1 ) ) ;
300
319
301
- let ppre2 = 1 << ( ppre2_bits - 0b011 ) ;
302
- let pclk2 = hclk / u32 ( ppre2) ;
320
+ let pclk2 = hclk / u32:: from ( ppre2) ;
303
321
304
322
assert ! ( pclk2 <= 72_000_000 ) ;
305
323
@@ -330,42 +348,39 @@ impl CFGR {
330
348
331
349
if self . hse . is_some ( ) {
332
350
// enable HSE and wait for it to be ready
351
+ rcc. cr . modify ( |_, w| w. hseon ( ) . on ( ) ) ;
333
352
334
- rcc. cr . modify ( |_, w| w. hseon ( ) . set_bit ( ) ) ;
335
-
336
- while rcc. cr . read ( ) . hserdy ( ) . bit_is_clear ( ) { }
353
+ while rcc. cr . read ( ) . hserdy ( ) . is_not_ready ( ) { }
337
354
}
338
355
339
- if let Some ( ( pllmul_bits , pllsrc) ) = pll_options {
356
+ if let Some ( ( pllmul_mul , pllsrc) ) = pll_options {
340
357
// enable PLL and wait for it to be ready
341
358
rcc. cfgr
342
- . modify ( |_, w| w. pllmul ( ) . bits ( pllmul_bits ) . pllsrc ( ) . variant ( pllsrc) ) ;
359
+ . modify ( |_, w| w. pllmul ( ) . variant ( pllmul_mul ) . pllsrc ( ) . variant ( pllsrc) ) ;
343
360
344
- rcc. cr . modify ( |_, w| w. pllon ( ) . set_bit ( ) ) ;
361
+ rcc. cr . modify ( |_, w| w. pllon ( ) . on ( ) ) ;
345
362
346
- while rcc. cr . read ( ) . pllrdy ( ) . bit_is_clear ( ) { }
363
+ while rcc. cr . read ( ) . pllrdy ( ) . is_not_ready ( ) { }
347
364
}
348
365
349
366
// set prescalers and clock source
350
- rcc. cfgr . modify ( |_, w| unsafe {
351
- set_usbpre ( w, usbpre)
352
- . ppre2 ( )
353
- . bits ( ppre2_bits)
367
+ rcc. cfgr . modify ( |_, w| {
368
+ usb_clocking:: set_usbpre ( w, usbpre) ;
369
+
370
+ w. ppre2 ( )
371
+ . variant ( ppre2_bits)
354
372
. ppre1 ( )
355
- . bits ( ppre1_bits)
373
+ . variant ( ppre1_bits)
356
374
. hpre ( )
357
- . bits ( hpre_bits)
358
- . sw ( )
359
- . bits ( if pll_options. is_some ( ) {
360
- // PLL
361
- 0b10
362
- } else if self . hse . is_some ( ) {
363
- // HSE
364
- 0b01
365
- } else {
366
- // HSI
367
- 0b00
368
- } )
375
+ . variant ( hpre_bits) ;
376
+
377
+ if pll_options. is_some ( ) {
378
+ w. sw ( ) . pll ( )
379
+ } else if self . hse . is_some ( ) {
380
+ w. sw ( ) . hse ( )
381
+ } else {
382
+ w. sw ( ) . hsi ( )
383
+ }
369
384
} ) ;
370
385
371
386
Clocks {
0 commit comments