Skip to content

Commit 5c58afe

Browse files
committed
Implement unsafe overlocking safety overrides
1 parent 757e9c7 commit 5c58afe

File tree

1 file changed

+26
-3
lines changed

1 file changed

+26
-3
lines changed

src/rcc.rs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ impl RccExt for RCC {
1919
pclk2: None,
2020
sysclk: None,
2121
pll48clk: false,
22+
pclk1_overclock: false,
23+
pclk2_overclock: false,
24+
sysclk_overclock: false,
2225
},
2326
}
2427
}
@@ -124,6 +127,9 @@ pub struct CFGR {
124127
pclk2: Option<u32>,
125128
sysclk: Option<u32>,
126129
pll48clk: bool,
130+
pclk1_overclock: bool,
131+
pclk2_overclock: bool,
132+
sysclk_overclock: bool,
127133
}
128134

129135
impl CFGR {
@@ -174,6 +180,21 @@ impl CFGR {
174180
self
175181
}
176182

183+
pub unsafe fn pclk1_allow_overclock(mut self) -> Self {
184+
self.pclk1_overclock = true;
185+
self
186+
}
187+
188+
pub unsafe fn pclk2_allow_overclock(mut self) -> Self {
189+
self.pclk2_overclock = true;
190+
self
191+
}
192+
193+
pub unsafe fn sysclk_allow_overclock(mut self) -> Self {
194+
self.sysclk_overclock = true;
195+
self
196+
}
197+
177198
#[inline(always)]
178199
fn pll_setup(&self) -> (bool, bool, u32, Option<Hertz>) {
179200
let pllsrcclk = self.hse.unwrap_or(HSI);
@@ -290,7 +311,9 @@ impl CFGR {
290311

291312
let (use_pll, sysclk_on_pll, sysclk, pll48clk) = self.pll_setup();
292313

293-
assert!(!sysclk_on_pll || sysclk <= SYSCLK_MAX && sysclk >= SYSCLK_MIN);
314+
assert!(
315+
self.sysclk_overclock || !sysclk_on_pll || sysclk <= SYSCLK_MAX && sysclk >= SYSCLK_MIN
316+
);
294317

295318
let hclk = self.hclk.unwrap_or(sysclk);
296319
let (hpre_bits, hpre_div) = match (sysclk + hclk - 1) / hclk {
@@ -324,7 +347,7 @@ impl CFGR {
324347
// Calculate real APB1 clock
325348
let pclk1 = hclk / u32::from(ppre1);
326349

327-
assert!(pclk1 <= PCLK1_MAX);
350+
assert!(self.pclk1_overclock || pclk1 <= PCLK1_MAX);
328351

329352
let pclk2 = self
330353
.pclk2
@@ -341,7 +364,7 @@ impl CFGR {
341364
// Calculate real APB2 clock
342365
let pclk2 = hclk / u32::from(ppre2);
343366

344-
assert!(pclk2 <= PCLK2_MAX);
367+
assert!(self.pclk2_overclock || pclk2 <= PCLK2_MAX);
345368

346369
Self::flash_setup(sysclk);
347370

0 commit comments

Comments
 (0)