Skip to content

Commit c8334d6

Browse files
authored
Merge pull request #37 from stm32-rs/hclk-pclkc-prescaling
RCC HCLK & PCLK prescaling
2 parents 9b4385d + 4a449c7 commit c8334d6

File tree

3 files changed

+32
-31
lines changed

3 files changed

+32
-31
lines changed

.vscode/launch.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"debugger_args": [
1414
"-nx" // dont use the .gdbinit file
1515
],
16-
"executable": "./target/thumbv7em-none-eabi/debug/examples/rtc",
16+
"executable": "./target/thumbv7em-none-eabi/debug/examples/blinky",
1717
"remote": true,
1818
"target": ":3333",
1919
"cwd": "${workspaceRoot}",
@@ -34,7 +34,7 @@
3434
"debugger_args": [
3535
"-nx" // dont use the .gdbinit file
3636
],
37-
"executable": "./target/thumbv7em-none-eabi/release/examples/timer",
37+
"executable": "./target/thumbv7em-none-eabi/release/examples/blinky",
3838
"remote": true,
3939
"target": ":3333",
4040
"cwd": "${workspaceRoot}",

examples/blinky.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ fn main() -> ! {
3636
let mut rcc = dp.RCC.constrain();
3737

3838
// Try a different clock configuration
39-
let clocks = rcc.cfgr.freeze(&mut flash.acr);
39+
let clocks = rcc.cfgr.hclk(8.mhz()).freeze(&mut flash.acr);
4040
// let clocks = rcc.cfgr
4141
// .sysclk(64.mhz())
4242
// .pclk1(32.mhz())

src/rcc.rs

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -362,53 +362,54 @@ impl CFGR {
362362

363363
assert!(sysclk <= 80_000_000);
364364

365-
let hpre_bits = self.hclk
365+
let (hpre_bits, hpre_div) = self.hclk
366366
.map(|hclk| match sysclk / hclk {
367+
// From p 194 in RM0394
367368
0 => unreachable!(),
368-
1 => 0b0000,
369-
2 => 0b1000,
370-
3...5 => 0b1001,
371-
6...11 => 0b1010,
372-
12...39 => 0b1011,
373-
40...95 => 0b1100,
374-
96...191 => 0b1101,
375-
192...383 => 0b1110,
376-
_ => 0b1111,
369+
1 => (0b0000, 1),
370+
2 => (0b1000, 2),
371+
3...5 => (0b1001, 4),
372+
6...11 => (0b1010, 8),
373+
12...39 => (0b1011, 16),
374+
40...95 => (0b1100, 64),
375+
96...191 => (0b1101, 128),
376+
192...383 => (0b1110, 256),
377+
_ => (0b1111, 512),
377378
})
378-
.unwrap_or(0b0000);
379+
.unwrap_or((0b0000, 1));
379380

380-
let hclk = sysclk / (1 << (hpre_bits));
381+
let hclk = sysclk / hpre_div;
381382

382383
assert!(hclk <= sysclk);
383384

384-
let ppre1_bits = self.pclk1
385+
let (ppre1_bits, ppre1) = self.pclk1
385386
.map(|pclk1| match hclk / pclk1 {
387+
// From p 194 in RM0394
386388
0 => unreachable!(),
387-
1 => 0b000,
388-
2 => 0b100,
389-
3...5 => 0b101,
390-
6...11 => 0b110,
391-
_ => 0b111,
389+
1 => (0b000, 1),
390+
2 => (0b100, 2),
391+
3...5 => (0b101, 4),
392+
6...11 => (0b110, 8),
393+
_ => (0b111, 16)
392394
})
393-
.unwrap_or(0b000);
395+
.unwrap_or((0b000, 1));
394396

395-
let ppre1 = 1 << (ppre1_bits);
396397
let pclk1 = hclk / u32(ppre1);
397398

398399
assert!(pclk1 <= sysclk);
399400

400-
let ppre2_bits = self.pclk2
401+
let (ppre2_bits, ppre2) = self.pclk2
401402
.map(|pclk2| match hclk / pclk2 {
403+
// From p 194 in RM0394
402404
0 => unreachable!(),
403-
1 => 0b000,
404-
2 => 0b100,
405-
3...5 => 0b101,
406-
6...11 => 0b110,
407-
_ => 0b111,
405+
1 => (0b000, 1),
406+
2 => (0b100, 2),
407+
3...5 => (0b101, 4),
408+
6...11 => (0b110, 8),
409+
_ => (0b111, 16)
408410
})
409-
.unwrap_or(0b000);
411+
.unwrap_or((0b000, 1));
410412

411-
let ppre2 = 1 << (ppre2_bits);
412413
let pclk2 = hclk / u32(ppre2);
413414

414415
assert!(pclk2 <= sysclk);

0 commit comments

Comments
 (0)