diff options
| author | Martin Algesten <[email protected]> | 2025-01-24 10:06:32 +0100 |
|---|---|---|
| committer | Martin Algesten <[email protected]> | 2025-01-24 10:06:32 +0100 |
| commit | 4743501172dadc405f71dec34b0b9fa933c916b8 (patch) | |
| tree | 47fa72b9b28a42ee6aeac43a3e10abf5d6081762 | |
| parent | 3ba94c0ab3fcb859619fa70fcf37a3505392f05c (diff) | |
Move PLL2/3 config to before PLL
| -rw-r--r-- | embassy-stm32/src/rcc/f013.rs | 60 |
1 files changed, 31 insertions, 29 deletions
diff --git a/embassy-stm32/src/rcc/f013.rs b/embassy-stm32/src/rcc/f013.rs index 8d86629b5..13b0ae38e 100644 --- a/embassy-stm32/src/rcc/f013.rs +++ b/embassy-stm32/src/rcc/f013.rs | |||
| @@ -209,6 +209,28 @@ pub(crate) unsafe fn init(config: Config) { | |||
| 209 | #[cfg(not(crs))] | 209 | #[cfg(not(crs))] |
| 210 | let hsi48: Option<Hertz> = None; | 210 | let hsi48: Option<Hertz> = None; |
| 211 | 211 | ||
| 212 | // PLL2 and PLL3 | ||
| 213 | // Configure this before PLL since PLL2 can be the source for PLL. | ||
| 214 | #[cfg(stm32f107)] | ||
| 215 | { | ||
| 216 | // Common prediv for PLL2 and PLL3 | ||
| 217 | RCC.cfgr2().modify(|w| w.set_prediv2(config.prediv2)); | ||
| 218 | |||
| 219 | // Configure PLL2 | ||
| 220 | if let Some(pll2) = config.pll2 { | ||
| 221 | RCC.cfgr2().modify(|w| w.set_pll2mul(pll2.mul)); | ||
| 222 | RCC.cr().modify(|w| w.set_pll2on(true)); | ||
| 223 | while !RCC.cr().read().pll2rdy() {} | ||
| 224 | } | ||
| 225 | |||
| 226 | // Configure PLL3 | ||
| 227 | if let Some(pll3) = config.pll3 { | ||
| 228 | RCC.cfgr2().modify(|w| w.set_pll3mul(pll3.mul)); | ||
| 229 | RCC.cr().modify(|w| w.set_pll3on(true)); | ||
| 230 | while !RCC.cr().read().pll3rdy() {} | ||
| 231 | } | ||
| 232 | } | ||
| 233 | |||
| 212 | // Enable PLL | 234 | // Enable PLL |
| 213 | let pll = config.pll.map(|pll| { | 235 | let pll = config.pll.map(|pll| { |
| 214 | let (src_val, src_freq) = match pll.src { | 236 | let (src_val, src_freq) = match pll.src { |
| @@ -221,7 +243,12 @@ pub(crate) unsafe fn init(config: Config) { | |||
| 221 | } | 243 | } |
| 222 | (Pllsrc::HSI_DIV2, unwrap!(hsi)) | 244 | (Pllsrc::HSI_DIV2, unwrap!(hsi)) |
| 223 | } | 245 | } |
| 224 | PllSource::HSE => (Pllsrc::HSE_DIV_PREDIV, unwrap!(hse)), | 246 | PllSource::HSE => { |
| 247 | #[cfg(stm32f107)] | ||
| 248 | RCC.cfgr2().modify(|w| w.set_prediv1src(Prediv1src::HSE)); | ||
| 249 | |||
| 250 | (Pllsrc::HSE_DIV_PREDIV, unwrap!(hse)) | ||
| 251 | } | ||
| 225 | #[cfg(rcc_f0v4)] | 252 | #[cfg(rcc_f0v4)] |
| 226 | PllSource::HSI48 => (Pllsrc::HSI48_DIV_PREDIV, unwrap!(hsi48)), | 253 | PllSource::HSI48 => (Pllsrc::HSI48_DIV_PREDIV, unwrap!(hsi48)), |
| 227 | #[cfg(stm32f107)] | 254 | #[cfg(stm32f107)] |
| @@ -229,9 +256,12 @@ pub(crate) unsafe fn init(config: Config) { | |||
| 229 | if config.pll2.is_none() { | 256 | if config.pll2.is_none() { |
| 230 | panic!("if PLL source is PLL2, Config::pll2 must also be set."); | 257 | panic!("if PLL source is PLL2, Config::pll2 must also be set."); |
| 231 | } | 258 | } |
| 259 | RCC.cfgr2().modify(|w| w.set_prediv1src(Prediv1src::PLL2)); | ||
| 260 | |||
| 232 | let pll2 = unwrap!(config.pll2); | 261 | let pll2 = unwrap!(config.pll2); |
| 233 | let in_freq = hse.unwrap() / config.prediv2; | 262 | let in_freq = hse.unwrap() / config.prediv2; |
| 234 | let pll2freq = in_freq * pll2.mul; | 263 | let pll2freq = in_freq * pll2.mul; |
| 264 | |||
| 235 | (Pllsrc::HSE_DIV_PREDIV, pll2freq) | 265 | (Pllsrc::HSE_DIV_PREDIV, pll2freq) |
| 236 | } | 266 | } |
| 237 | }; | 267 | }; |
| @@ -259,34 +289,6 @@ pub(crate) unsafe fn init(config: Config) { | |||
| 259 | out_freq | 289 | out_freq |
| 260 | }); | 290 | }); |
| 261 | 291 | ||
| 262 | #[cfg(stm32f107)] | ||
| 263 | match config.pll.map(|pll| pll.src) { | ||
| 264 | Some(PllSource::HSE) => RCC.cfgr2().modify(|w| w.set_prediv1src(Prediv1src::HSE)), | ||
| 265 | Some(PllSource::PLL2) => RCC.cfgr2().modify(|w| w.set_prediv1src(Prediv1src::PLL2)), | ||
| 266 | _ => {} | ||
| 267 | } | ||
| 268 | |||
| 269 | // pll2 and pll3 | ||
| 270 | #[cfg(stm32f107)] | ||
| 271 | { | ||
| 272 | // Common prediv for PLL2 and PLL3 | ||
| 273 | RCC.cfgr2().modify(|w| w.set_prediv2(config.prediv2)); | ||
| 274 | |||
| 275 | // Configure PLL2 | ||
| 276 | if let Some(pll2) = config.pll2 { | ||
| 277 | RCC.cfgr2().modify(|w| w.set_pll2mul(pll2.mul)); | ||
| 278 | RCC.cr().modify(|w| w.set_pll2on(true)); | ||
| 279 | while !RCC.cr().read().pll2rdy() {} | ||
| 280 | } | ||
| 281 | |||
| 282 | // Configure PLL3 | ||
| 283 | if let Some(pll3) = config.pll3 { | ||
| 284 | RCC.cfgr2().modify(|w| w.set_pll3mul(pll3.mul)); | ||
| 285 | RCC.cr().modify(|w| w.set_pll3on(true)); | ||
| 286 | while !RCC.cr().read().pll3rdy() {} | ||
| 287 | } | ||
| 288 | } | ||
| 289 | |||
| 290 | #[cfg(stm32f3)] | 292 | #[cfg(stm32f3)] |
| 291 | let pll_mul_2 = pll.map(|pll| pll * 2u32); | 293 | let pll_mul_2 = pll.map(|pll| pll * 2u32); |
| 292 | 294 | ||
