aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2022-01-04 21:17:17 +0100
committerDario Nieuwenhuis <[email protected]>2022-01-04 21:17:17 +0100
commitc3fd9a0f44ae898c5cf1272dab6b8f46e119fab3 (patch)
tree9b65351929b3c3ac69a6591d6147075d4180aa98
parentb06e705a737a7b1d040ab415b4e7ecc71cd79094 (diff)
stm32/rcc: f4/f7 cleanup and make a bit more consistent.
-rw-r--r--embassy-stm32/src/pwr/mod.rs1
-rw-r--r--embassy-stm32/src/pwr/wb55.rs0
-rw-r--r--embassy-stm32/src/rcc/f4.rs43
-rw-r--r--embassy-stm32/src/rcc/f7.rs28
-rw-r--r--embassy-stm32/src/rcc/mod.rs2
m---------stm32-data0
6 files changed, 37 insertions, 37 deletions
diff --git a/embassy-stm32/src/pwr/mod.rs b/embassy-stm32/src/pwr/mod.rs
index 18f462bd2..d948c398d 100644
--- a/embassy-stm32/src/pwr/mod.rs
+++ b/embassy-stm32/src/pwr/mod.rs
@@ -7,6 +7,7 @@
7#[cfg_attr(pwr_g4, path = "g4.rs")] 7#[cfg_attr(pwr_g4, path = "g4.rs")]
8#[cfg_attr(pwr_l1, path = "l1.rs")] 8#[cfg_attr(pwr_l1, path = "l1.rs")]
9#[cfg_attr(pwr_u5, path = "u5.rs")] 9#[cfg_attr(pwr_u5, path = "u5.rs")]
10#[cfg_attr(pwr_wb55, path = "wb55.rs")]
10mod _version; 11mod _version;
11 12
12pub use _version::*; 13pub use _version::*;
diff --git a/embassy-stm32/src/pwr/wb55.rs b/embassy-stm32/src/pwr/wb55.rs
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/embassy-stm32/src/pwr/wb55.rs
diff --git a/embassy-stm32/src/rcc/f4.rs b/embassy-stm32/src/rcc/f4.rs
index 08a9bc9b4..58a08adbf 100644
--- a/embassy-stm32/src/rcc/f4.rs
+++ b/embassy-stm32/src/rcc/f4.rs
@@ -7,17 +7,18 @@ use embassy::util::Unborrow;
7 7
8const HSI: u32 = 16_000_000; 8const HSI: u32 = 16_000_000;
9 9
10/// Clocks configutation 10/// Clocks configuration
11#[non_exhaustive] 11#[non_exhaustive]
12#[derive(Default)] 12#[derive(Default)]
13pub struct Config { 13pub struct Config {
14 pub hse: Option<Hertz>, 14 pub hse: Option<Hertz>,
15 pub bypass_hse: bool, 15 pub bypass_hse: bool,
16 pub pll48: bool,
17 pub sys_ck: Option<Hertz>,
18 pub hclk: Option<Hertz>, 16 pub hclk: Option<Hertz>,
17 pub sys_ck: Option<Hertz>,
19 pub pclk1: Option<Hertz>, 18 pub pclk1: Option<Hertz>,
20 pub pclk2: Option<Hertz>, 19 pub pclk2: Option<Hertz>,
20
21 pub pll48: bool,
21} 22}
22 23
23/// RCC peripheral 24/// RCC peripheral
@@ -38,6 +39,8 @@ impl<'d> Rcc<'d> {
38 use super::sealed::RccPeripheral; 39 use super::sealed::RccPeripheral;
39 use crate::pac::rcc::vals::{Hpre, Hsebyp, Ppre, Sw}; 40 use crate::pac::rcc::vals::{Hpre, Hsebyp, Ppre, Sw};
40 41
42 peripherals::PWR::enable();
43
41 let pllsrcclk = self.config.hse.map(|hse| hse.0).unwrap_or(HSI); 44 let pllsrcclk = self.config.hse.map(|hse| hse.0).unwrap_or(HSI);
42 let sysclk = self.config.sys_ck.map(|sys| sys.0).unwrap_or(pllsrcclk); 45 let sysclk = self.config.sys_ck.map(|sys| sys.0).unwrap_or(pllsrcclk);
43 let sysclk_on_pll = sysclk != pllsrcclk; 46 let sysclk_on_pll = sysclk != pllsrcclk;
@@ -50,12 +53,9 @@ impl<'d> Rcc<'d> {
50 ); 53 );
51 54
52 if self.config.pll48 { 55 if self.config.pll48 {
53 assert!( 56 let freq = unwrap!(plls.pll48clk);
54 // USB specification allows +-0.25% 57
55 plls.pll48clk 58 assert!((max::PLL_48_CLK as i32 - freq as i32).abs() <= max::PLL_48_TOLERANCE as i32);
56 .map(|freq| (48_000_000 - freq as i32).abs() <= 120_000)
57 .unwrap_or(false)
58 );
59 } 59 }
60 60
61 let sysclk = if sysclk_on_pll { 61 let sysclk = if sysclk_on_pll {
@@ -64,6 +64,7 @@ impl<'d> Rcc<'d> {
64 sysclk 64 sysclk
65 }; 65 };
66 66
67 // AHB prescaler
67 let hclk = self.config.hclk.map(|h| h.0).unwrap_or(sysclk); 68 let hclk = self.config.hclk.map(|h| h.0).unwrap_or(sysclk);
68 let (hpre_bits, hpre_div) = match (sysclk + hclk - 1) / hclk { 69 let (hpre_bits, hpre_div) = match (sysclk + hclk - 1) / hclk {
69 0 => unreachable!(), 70 0 => unreachable!(),
@@ -86,6 +87,7 @@ impl<'d> Rcc<'d> {
86 .pclk1 87 .pclk1
87 .map(|p| p.0) 88 .map(|p| p.0)
88 .unwrap_or_else(|| core::cmp::min(max::PCLK1_MAX, hclk)); 89 .unwrap_or_else(|| core::cmp::min(max::PCLK1_MAX, hclk));
90
89 let (ppre1_bits, ppre1) = match (hclk + pclk1 - 1) / pclk1 { 91 let (ppre1_bits, ppre1) = match (hclk + pclk1 - 1) / pclk1 {
90 0 => unreachable!(), 92 0 => unreachable!(),
91 1 => (0b000, 1), 93 1 => (0b000, 1),
@@ -136,14 +138,12 @@ impl<'d> Rcc<'d> {
136 unsafe { 138 unsafe {
137 RCC.cr().modify(|w| w.set_pllon(true)); 139 RCC.cr().modify(|w| w.set_pllon(true));
138 140
139 if hclk > 168_000_000 { 141 if hclk > max::HCLK_OVERDRIVE_FREQUENCY {
140 peripherals::PWR::enable(); 142 PWR.cr1().modify(|w| w.set_oden(true));
141 143 while !PWR.csr1().read().odrdy() {}
142 PWR.cr().modify(|w| w.set_oden(true));
143 while !PWR.csr().read().odrdy() {}
144 144
145 PWR.cr().modify(|w| w.set_odswen(true)); 145 PWR.cr1().modify(|w| w.set_odswen(true));
146 while !PWR.csr().read().odswrdy() {} 146 while !PWR.csr1().read().odswrdy() {}
147 } 147 }
148 148
149 while !RCC.cr().read().pllrdy() {} 149 while !RCC.cr().read().pllrdy() {}
@@ -310,23 +310,24 @@ struct PllResults {
310mod max { 310mod max {
311 #[cfg(stm32f401)] 311 #[cfg(stm32f401)]
312 pub(crate) const SYSCLK_MAX: u32 = 84_000_000; 312 pub(crate) const SYSCLK_MAX: u32 = 84_000_000;
313
314 #[cfg(any(stm32f405, stm32f407, stm32f415, stm32f417,))] 313 #[cfg(any(stm32f405, stm32f407, stm32f415, stm32f417,))]
315 pub(crate) const SYSCLK_MAX: u32 = 168_000_000; 314 pub(crate) const SYSCLK_MAX: u32 = 168_000_000;
316
317 #[cfg(any(stm32f410, stm32f411, stm32f412, stm32f413, stm32f423,))] 315 #[cfg(any(stm32f410, stm32f411, stm32f412, stm32f413, stm32f423,))]
318 pub(crate) const SYSCLK_MAX: u32 = 100_000_000; 316 pub(crate) const SYSCLK_MAX: u32 = 100_000_000;
319
320 #[cfg(any( 317 #[cfg(any(
321 stm32f427, stm32f429, stm32f437, stm32f439, stm32f446, stm32f469, stm32f479, 318 stm32f427, stm32f429, stm32f437, stm32f439, stm32f446, stm32f469, stm32f479,
322 ))] 319 ))]
323 pub(crate) const SYSCLK_MAX: u32 = 180_000_000; 320 pub(crate) const SYSCLK_MAX: u32 = 180_000_000;
324 321
322 pub(crate) const HCLK_OVERDRIVE_FREQUENCY: u32 = 168_000_000;
323
324 pub(crate) const PCLK1_MAX: u32 = PCLK2_MAX / 2;
325
325 #[cfg(any(stm32f401, stm32f410, stm32f411, stm32f412, stm32f413, stm32f423,))] 326 #[cfg(any(stm32f401, stm32f410, stm32f411, stm32f412, stm32f413, stm32f423,))]
326 pub(crate) const PCLK2_MAX: u32 = SYSCLK_MAX; 327 pub(crate) const PCLK2_MAX: u32 = SYSCLK_MAX;
327
328 #[cfg(not(any(stm32f401, stm32f410, stm32f411, stm32f412, stm32f413, stm32f423,)))] 328 #[cfg(not(any(stm32f401, stm32f410, stm32f411, stm32f412, stm32f413, stm32f423,)))]
329 pub(crate) const PCLK2_MAX: u32 = SYSCLK_MAX / 2; 329 pub(crate) const PCLK2_MAX: u32 = SYSCLK_MAX / 2;
330 330
331 pub(crate) const PCLK1_MAX: u32 = PCLK2_MAX / 2; 331 pub(crate) const PLL_48_CLK: u32 = 48_000_000;
332 pub(crate) const PLL_48_TOLERANCE: u32 = 120_000;
332} 333}
diff --git a/embassy-stm32/src/rcc/f7.rs b/embassy-stm32/src/rcc/f7.rs
index 25f78c701..d29ba31f0 100644
--- a/embassy-stm32/src/rcc/f7.rs
+++ b/embassy-stm32/src/rcc/f7.rs
@@ -7,6 +7,7 @@ use embassy::util::Unborrow;
7 7
8const HSI: u32 = 16_000_000; 8const HSI: u32 = 16_000_000;
9 9
10/// Clocks configuration
10#[non_exhaustive] 11#[non_exhaustive]
11#[derive(Default)] 12#[derive(Default)]
12pub struct Config { 13pub struct Config {
@@ -46,27 +47,25 @@ impl<'d> Rcc<'d> {
46 use crate::pac::pwr::vals::Vos; 47 use crate::pac::pwr::vals::Vos;
47 use crate::pac::rcc::vals::{Hpre, Hsebyp, Ppre, Sw}; 48 use crate::pac::rcc::vals::{Hpre, Hsebyp, Ppre, Sw};
48 49
49 let base_clock = self.config.hse.map(|hse| hse.0).unwrap_or(HSI); 50 peripherals::PWR::enable();
50 let sysclk = self.config.sys_ck.map(|sys| sys.0).unwrap_or(base_clock); 51
51 let sysclk_on_pll = sysclk != base_clock; 52 let pllsrcclk = self.config.hse.map(|hse| hse.0).unwrap_or(HSI);
53 let sysclk = self.config.sys_ck.map(|sys| sys.0).unwrap_or(pllsrcclk);
54 let sysclk_on_pll = sysclk != pllsrcclk;
52 55
53 assert!((max::SYSCLK_MIN..=max::SYSCLK_MAX).contains(&sysclk)); 56 assert!((max::SYSCLK_MIN..=max::SYSCLK_MAX).contains(&sysclk));
54 57
55 let plls = self.setup_pll( 58 let plls = self.setup_pll(
56 base_clock, 59 pllsrcclk,
57 self.config.hse.is_some(), 60 self.config.hse.is_some(),
58 if sysclk_on_pll { Some(sysclk) } else { None }, 61 if sysclk_on_pll { Some(sysclk) } else { None },
59 self.config.pll48, 62 self.config.pll48,
60 ); 63 );
61 64
62 if self.config.pll48 { 65 if self.config.pll48 {
63 assert!( 66 let freq = unwrap!(plls.pll48clk);
64 // USB specification allows +-0.25% 67
65 plls.pll48clk 68 assert!((max::PLL_48_CLK as i32 - freq as i32).abs() <= max::PLL_48_TOLERANCE as i32);
66 .map(|freq| (max::PLL_48_CLK as i32 - freq as i32).abs()
67 <= max::PLL_48_TOLERANCE as i32)
68 .unwrap_or(false)
69 );
70 } 69 }
71 70
72 let sysclk = if sysclk_on_pll { 71 let sysclk = if sysclk_on_pll {
@@ -173,11 +172,7 @@ impl<'d> Rcc<'d> {
173 172
174 RCC.cr().modify(|w| w.set_pllon(true)); 173 RCC.cr().modify(|w| w.set_pllon(true));
175 174
176 while !RCC.cr().read().pllrdy() {}
177
178 if hclk > max::HCLK_OVERDRIVE_FREQUENCY { 175 if hclk > max::HCLK_OVERDRIVE_FREQUENCY {
179 peripherals::PWR::enable();
180
181 PWR.cr1().modify(|w| w.set_oden(true)); 176 PWR.cr1().modify(|w| w.set_oden(true));
182 while !PWR.csr1().read().odrdy() {} 177 while !PWR.csr1().read().odrdy() {}
183 178
@@ -222,6 +217,8 @@ impl<'d> Rcc<'d> {
222 ahb1: Hertz(hclk), 217 ahb1: Hertz(hclk),
223 ahb2: Hertz(hclk), 218 ahb2: Hertz(hclk),
224 ahb3: Hertz(hclk), 219 ahb3: Hertz(hclk),
220
221 pll48: plls.pll48clk.map(Hertz),
225 } 222 }
226 } 223 }
227 224
@@ -362,6 +359,7 @@ mod max {
362 pub(crate) const PCLK2_MIN: u32 = SYSCLK_MIN; 359 pub(crate) const PCLK2_MIN: u32 = SYSCLK_MIN;
363 pub(crate) const PCLK2_MAX: u32 = SYSCLK_MAX / 2; 360 pub(crate) const PCLK2_MAX: u32 = SYSCLK_MAX / 2;
364 361
362 // USB specification allows +-0.25%
365 pub(crate) const PLL_48_CLK: u32 = 48_000_000; 363 pub(crate) const PLL_48_CLK: u32 = 48_000_000;
366 pub(crate) const PLL_48_TOLERANCE: u32 = 120_000; 364 pub(crate) const PLL_48_TOLERANCE: u32 = 120_000;
367} 365}
diff --git a/embassy-stm32/src/rcc/mod.rs b/embassy-stm32/src/rcc/mod.rs
index bf612464f..d0b6e5a18 100644
--- a/embassy-stm32/src/rcc/mod.rs
+++ b/embassy-stm32/src/rcc/mod.rs
@@ -61,7 +61,7 @@ pub struct Clocks {
61 #[cfg(any(rcc_h7))] 61 #[cfg(any(rcc_h7))]
62 pub apb4: Hertz, 62 pub apb4: Hertz,
63 63
64 #[cfg(rcc_f4)] 64 #[cfg(any(rcc_f4, rcc_f7))]
65 pub pll48: Option<Hertz>, 65 pub pll48: Option<Hertz>,
66 66
67 #[cfg(rcc_f1)] 67 #[cfg(rcc_f1)]
diff --git a/stm32-data b/stm32-data
Subproject 27f9d6dc2c5afaa5003ce9afc06def9b16d30ad Subproject 8530a19ffdcdcbc608a97b40895827d09e670eb