diff options
| author | Dario Nieuwenhuis <[email protected]> | 2022-01-04 21:17:17 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2022-01-04 21:17:17 +0100 |
| commit | c3fd9a0f44ae898c5cf1272dab6b8f46e119fab3 (patch) | |
| tree | 9b65351929b3c3ac69a6591d6147075d4180aa98 | |
| parent | b06e705a737a7b1d040ab415b4e7ecc71cd79094 (diff) | |
stm32/rcc: f4/f7 cleanup and make a bit more consistent.
| -rw-r--r-- | embassy-stm32/src/pwr/mod.rs | 1 | ||||
| -rw-r--r-- | embassy-stm32/src/pwr/wb55.rs | 0 | ||||
| -rw-r--r-- | embassy-stm32/src/rcc/f4.rs | 43 | ||||
| -rw-r--r-- | embassy-stm32/src/rcc/f7.rs | 28 | ||||
| -rw-r--r-- | embassy-stm32/src/rcc/mod.rs | 2 | ||||
| m--------- | stm32-data | 0 |
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")] | ||
| 10 | mod _version; | 11 | mod _version; |
| 11 | 12 | ||
| 12 | pub use _version::*; | 13 | pub 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 | ||
| 8 | const HSI: u32 = 16_000_000; | 8 | const 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)] |
| 13 | pub struct Config { | 13 | pub 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 { | |||
| 310 | mod max { | 310 | mod 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 | ||
| 8 | const HSI: u32 = 16_000_000; | 8 | const HSI: u32 = 16_000_000; |
| 9 | 9 | ||
| 10 | /// Clocks configuration | ||
| 10 | #[non_exhaustive] | 11 | #[non_exhaustive] |
| 11 | #[derive(Default)] | 12 | #[derive(Default)] |
| 12 | pub struct Config { | 13 | pub 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 | ||
