Skip to content

Commit d983c32

Browse files
bors[bot]rukai
andauthored
Merge #231
231: Implement unsafe overclocking safety overrides r=TeXitoi a=rukai I am porting a C firmware that slightly overclocks the following values on an stm32f439. * SYSCLK 192MHz (max 180MHz) * APB1/PCLK1/PPRE1_register 48Mhz (max 45MHz) * APB2/PCLK2/PPRE2_register 96Mhz (max 90MHz) I need to maintain these clock speeds in the rust port, so my usage will look like this: ```rust let clocks = unsafe { rcc.cfgr .use_hse(4.mhz()) .sysclk(192.mhz()) .hclk(192.mhz()) .pclk1(48.mhz()) .pclk2(96.mhz()) .sysclk_allow_overclock() .pclk1_allow_overclock() .pclk2_allow_overclock() .freeze() }; ``` Would love to hear suggestions for better naming of the builder method names. Co-authored-by: Rukai <rubickent@gmail.com>
2 parents 757e9c7 + 000983e commit d983c32

File tree

1 file changed

+15
-3
lines changed

1 file changed

+15
-3
lines changed

src/rcc.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -285,12 +285,24 @@ impl CFGR {
285285
}
286286
}
287287

288+
/// Initialises the hardware according to CFGR state returning a Clocks instance.
289+
/// Panics if overclocking is attempted.
288290
pub fn freeze(self) -> Clocks {
291+
self.freeze_internal(false)
292+
}
293+
294+
/// Initialises the hardware according to CFGR state returning a Clocks instance.
295+
/// Allows overclocking.
296+
pub unsafe fn freeze_unchecked(self) -> Clocks {
297+
self.freeze_internal(true)
298+
}
299+
300+
pub fn freeze_internal(self, unchecked: bool) -> Clocks {
289301
let rcc = unsafe { &*RCC::ptr() };
290302

291303
let (use_pll, sysclk_on_pll, sysclk, pll48clk) = self.pll_setup();
292304

293-
assert!(!sysclk_on_pll || sysclk <= SYSCLK_MAX && sysclk >= SYSCLK_MIN);
305+
assert!(unchecked || !sysclk_on_pll || sysclk <= SYSCLK_MAX && sysclk >= SYSCLK_MIN);
294306

295307
let hclk = self.hclk.unwrap_or(sysclk);
296308
let (hpre_bits, hpre_div) = match (sysclk + hclk - 1) / hclk {
@@ -324,7 +336,7 @@ impl CFGR {
324336
// Calculate real APB1 clock
325337
let pclk1 = hclk / u32::from(ppre1);
326338

327-
assert!(pclk1 <= PCLK1_MAX);
339+
assert!(unchecked || pclk1 <= PCLK1_MAX);
328340

329341
let pclk2 = self
330342
.pclk2
@@ -341,7 +353,7 @@ impl CFGR {
341353
// Calculate real APB2 clock
342354
let pclk2 = hclk / u32::from(ppre2);
343355

344-
assert!(pclk2 <= PCLK2_MAX);
356+
assert!(unchecked || pclk2 <= PCLK2_MAX);
345357

346358
Self::flash_setup(sysclk);
347359

0 commit comments

Comments
 (0)