diff options
| author | Eli Orona <[email protected]> | 2024-02-15 19:50:42 -0800 |
|---|---|---|
| committer | Eli Orona <[email protected]> | 2024-02-15 19:50:42 -0800 |
| commit | 169f1ce928177a6ff85ce7e9ff5a995063b6aace (patch) | |
| tree | c54e5098a50e00edeb5aab1815fed34d6bddbe83 | |
| parent | 26fc17e8a7db0957896db28cb2299ab9cf89aea5 (diff) | |
I believe that this enables the PLL clock input to different TIMs for the STM32F3xx Series of chips.
| -rw-r--r-- | embassy-stm32/src/rcc/f013.rs | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/embassy-stm32/src/rcc/f013.rs b/embassy-stm32/src/rcc/f013.rs index c2933186c..0d2877755 100644 --- a/embassy-stm32/src/rcc/f013.rs +++ b/embassy-stm32/src/rcc/f013.rs | |||
| @@ -74,6 +74,107 @@ pub enum HrtimClockSource { | |||
| 74 | PllClk, | 74 | PllClk, |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | #[cfg(all(stm32f3, not(rcc_f37)))] | ||
| 78 | #[derive(Clone, Copy, PartialEq, Eq)] | ||
| 79 | pub enum TimClockSource { | ||
| 80 | PClk2, | ||
| 81 | PllClk, | ||
| 82 | } | ||
| 83 | |||
| 84 | #[cfg(all(stm32f3, not(rcc_f37)))] | ||
| 85 | #[derive(Clone, Copy)] | ||
| 86 | pub struct TimClockSources { | ||
| 87 | pub tim1: TimClockSource, | ||
| 88 | #[cfg(any( | ||
| 89 | all(stm32f303, any(package_D, package_E)), | ||
| 90 | all(stm32f302, any(package_D, package_E)), | ||
| 91 | ))] | ||
| 92 | pub tim2: TimClockSource, | ||
| 93 | #[cfg(any( | ||
| 94 | all(stm32f303, any(package_D, package_E)), | ||
| 95 | all(stm32f302, any(package_D, package_E)), | ||
| 96 | ))] | ||
| 97 | pub tim34: TimClockSource, | ||
| 98 | #[cfg(any( | ||
| 99 | all(stm32f303, any(package_B, package_C, package_D, package_E)), | ||
| 100 | stm32f358, | ||
| 101 | ))] | ||
| 102 | pub tim8: TimClockSource, | ||
| 103 | #[cfg(any( | ||
| 104 | all(stm32f303, any(package_D, package_E)), | ||
| 105 | stm32f301, | ||
| 106 | stm32f318, | ||
| 107 | all(stm32f302, any(package_6, package_8)) | ||
| 108 | ))] | ||
| 109 | pub tim15: TimClockSource, | ||
| 110 | #[cfg(any( | ||
| 111 | all(stm32f303, any(package_D, package_E)), | ||
| 112 | stm32f301, | ||
| 113 | stm32f318, | ||
| 114 | all(stm32f302, any(package_6, package_8)) | ||
| 115 | ))] | ||
| 116 | pub tim16: TimClockSource, | ||
| 117 | #[cfg(any( | ||
| 118 | all(stm32f303, any(package_D, package_E)), | ||
| 119 | stm32f301, | ||
| 120 | stm32f318, | ||
| 121 | all(stm32f302, any(package_6, package_8)) | ||
| 122 | ))] | ||
| 123 | pub tim17: TimClockSource, | ||
| 124 | #[cfg(any( | ||
| 125 | all(stm32f303, any(package_D, package_E)), | ||
| 126 | ))] | ||
| 127 | pub tim20: TimClockSource | ||
| 128 | } | ||
| 129 | |||
| 130 | impl Default for TimClockSources { | ||
| 131 | fn default() -> Self { | ||
| 132 | Self { | ||
| 133 | tim1: TimClockSource::PClk2, | ||
| 134 | #[cfg(any( | ||
| 135 | all(stm32f303, any(package_D, package_E)), | ||
| 136 | all(stm32f302, any(package_D, package_E)), | ||
| 137 | ))] | ||
| 138 | tim2: TimClockSource::PClk2, | ||
| 139 | #[cfg(any( | ||
| 140 | all(stm32f303, any(package_D, package_E)), | ||
| 141 | all(stm32f302, any(package_D, package_E)), | ||
| 142 | ))] | ||
| 143 | tim34: TimClockSource::PClk2, | ||
| 144 | #[cfg(any( | ||
| 145 | all(stm32f303, any(package_B, package_C, package_D, package_E)), | ||
| 146 | stm32f358, | ||
| 147 | ))] | ||
| 148 | tim8: TimClockSource::PClk2, | ||
| 149 | #[cfg(any( | ||
| 150 | all(stm32f303, any(package_D, package_E)), | ||
| 151 | stm32f301, | ||
| 152 | stm32f318, | ||
| 153 | all(stm32f302, any(package_6, package_8)) | ||
| 154 | ))] | ||
| 155 | tim15: TimClockSource::PClk2, | ||
| 156 | #[cfg(any( | ||
| 157 | all(stm32f303, any(package_D, package_E)), | ||
| 158 | stm32f301, | ||
| 159 | stm32f318, | ||
| 160 | all(stm32f302, any(package_6, package_8)) | ||
| 161 | ))] | ||
| 162 | tim16: TimClockSource::PClk2, | ||
| 163 | #[cfg(any( | ||
| 164 | all(stm32f303, any(package_D, package_E)), | ||
| 165 | stm32f301, | ||
| 166 | stm32f318, | ||
| 167 | all(stm32f302, any(package_6, package_8)) | ||
| 168 | ))] | ||
| 169 | tim17: TimClockSource::PClk2, | ||
| 170 | #[cfg(any( | ||
| 171 | all(stm32f303, any(package_D, package_E)), | ||
| 172 | ))] | ||
| 173 | tim20: TimClockSource::PClk2 | ||
| 174 | } | ||
| 175 | } | ||
| 176 | } | ||
| 177 | |||
| 77 | /// Clocks configutation | 178 | /// Clocks configutation |
| 78 | #[non_exhaustive] | 179 | #[non_exhaustive] |
| 79 | pub struct Config { | 180 | pub struct Config { |
| @@ -99,6 +200,8 @@ pub struct Config { | |||
| 99 | pub adc34: AdcClockSource, | 200 | pub adc34: AdcClockSource, |
| 100 | #[cfg(stm32f334)] | 201 | #[cfg(stm32f334)] |
| 101 | pub hrtim: HrtimClockSource, | 202 | pub hrtim: HrtimClockSource, |
| 203 | #[cfg(not(stm32f37))] | ||
| 204 | pub tim: TimClockSources, | ||
| 102 | 205 | ||
| 103 | pub ls: super::LsConfig, | 206 | pub ls: super::LsConfig, |
| 104 | } | 207 | } |
| @@ -129,6 +232,8 @@ impl Default for Config { | |||
| 129 | adc34: AdcClockSource::Hclk(AdcHclkPrescaler::Div1), | 232 | adc34: AdcClockSource::Hclk(AdcHclkPrescaler::Div1), |
| 130 | #[cfg(stm32f334)] | 233 | #[cfg(stm32f334)] |
| 131 | hrtim: HrtimClockSource::BusClk, | 234 | hrtim: HrtimClockSource::BusClk, |
| 235 | #[cfg(not(stm32f37))] | ||
| 236 | tim: Default::default() | ||
| 132 | } | 237 | } |
| 133 | } | 238 | } |
| 134 | } | 239 | } |
| @@ -364,6 +469,126 @@ pub(crate) unsafe fn init(config: Config) { | |||
| 364 | } | 469 | } |
| 365 | }; | 470 | }; |
| 366 | 471 | ||
| 472 | #[cfg(all(stm32f3, not(rcc_f37)))] | ||
| 473 | let tim1 = match config.tim.tim1 { | ||
| 474 | TimClockSource::PClk2 => None, | ||
| 475 | TimClockSource::PllClk => { | ||
| 476 | use crate::pac::rcc::vals::Timsw; | ||
| 477 | |||
| 478 | let pll = unwrap!(pll); | ||
| 479 | assert((pclk2 == pll) || (pclk2 * 2u32 == pll)); | ||
| 480 | |||
| 481 | RCC.cfgr3().modify(|w| w.set_tim1(Timsw::PLL1_P)); | ||
| 482 | |||
| 483 | Some(pll * 2u32) | ||
| 484 | } | ||
| 485 | }; | ||
| 486 | |||
| 487 | #[cfg(any(all(stm32f303, any(package_D, package_E)), all(stm32f302, any(package_D, package_E))))] | ||
| 488 | let tim2 = match config.tim.tim2 { | ||
| 489 | TimClockSource::PClk2 => None, | ||
| 490 | TimClockSource::PllClk => { | ||
| 491 | use crate::pac::rcc::vals::Timsw; | ||
| 492 | |||
| 493 | let pll = unwrap!(pll); | ||
| 494 | assert((pclk2 == pll) || (pclk2 * 2u32 == pll)); | ||
| 495 | |||
| 496 | RCC.cfgr3().modify(|w| w.set_tim2(Timsw::PLL1_P)); | ||
| 497 | |||
| 498 | Some(pll * 2u32) | ||
| 499 | } | ||
| 500 | }; | ||
| 501 | |||
| 502 | #[cfg(any(all(stm32f303, any(package_D, package_E)), all(stm32f302, any(package_D, package_E))))] | ||
| 503 | let tim34 = match config.tim.tim34 { | ||
| 504 | TimClockSource::PClk2 => None, | ||
| 505 | TimClockSource::PllClk => { | ||
| 506 | use crate::pac::rcc::vals::Timsw; | ||
| 507 | |||
| 508 | let pll = unwrap!(pll); | ||
| 509 | assert((pclk2 == pll) || (pclk2 * 2u32 == pll)); | ||
| 510 | |||
| 511 | RCC.cfgr3().modify(|w| w.set_tim34(Timsw::PLL1_P)); | ||
| 512 | |||
| 513 | Some(pll * 2u32) | ||
| 514 | } | ||
| 515 | }; | ||
| 516 | |||
| 517 | #[cfg(any(all(stm32f303, any(package_B, package_C, package_D, package_E)), stm32f358))] | ||
| 518 | let tim8 = match config.tim.tim8 { | ||
| 519 | TimClockSource::PClk2 => None, | ||
| 520 | TimClockSource::PllClk => { | ||
| 521 | use crate::pac::rcc::vals::Timsw; | ||
| 522 | |||
| 523 | let pll = unwrap!(pll); | ||
| 524 | assert((pclk2 == pll) || (pclk2 * 2u32 == pll)); | ||
| 525 | |||
| 526 | RCC.cfgr3().modify(|w| w.set_tim8(Timsw::PLL1_P)); | ||
| 527 | |||
| 528 | Some(pll * 2u32) | ||
| 529 | } | ||
| 530 | }; | ||
| 531 | |||
| 532 | #[cfg(any(all(stm32f303, any(package_D, package_E)), stm32f301, stm32f318, all(stm32f302, any(package_6, package_8))))] | ||
| 533 | let tim15 = match config.tim.tim15 { | ||
| 534 | TimClockSource::PClk2 => None, | ||
| 535 | TimClockSource::PllClk => { | ||
| 536 | use crate::pac::rcc::vals::Timsw; | ||
| 537 | |||
| 538 | let pll = unwrap!(pll); | ||
| 539 | assert((pclk2 == pll) || (pclk2 * 2u32 == pll)); | ||
| 540 | |||
| 541 | RCC.cfgr3().modify(|w| w.set_tim15(Timsw::PLL1_P)); | ||
| 542 | |||
| 543 | Some(pll * 2u32) | ||
| 544 | } | ||
| 545 | }; | ||
| 546 | |||
| 547 | #[cfg(any(all(stm32f303, any(package_D, package_E)), stm32f301, stm32f318, all(stm32f302, any(package_6, package_8))))] | ||
| 548 | let tim16 = match config.tim.tim16 { | ||
| 549 | TimClockSource::PClk2 => None, | ||
| 550 | TimClockSource::PllClk => { | ||
| 551 | use crate::pac::rcc::vals::Timsw; | ||
| 552 | |||
| 553 | let pll = unwrap!(pll); | ||
| 554 | assert((pclk2 == pll) || (pclk2 * 2u32 == pll)); | ||
| 555 | |||
| 556 | RCC.cfgr3().modify(|w| w.set_tim16(Timsw::PLL1_P)); | ||
| 557 | |||
| 558 | Some(pll * 2u32) | ||
| 559 | } | ||
| 560 | }; | ||
| 561 | |||
| 562 | #[cfg(any(all(stm32f303, any(package_D, package_E)), stm32f301, stm32f318, all(stm32f302, any(package_6, package_8))))] | ||
| 563 | let tim17 = match config.tim.tim17 { | ||
| 564 | TimClockSource::PClk2 => None, | ||
| 565 | TimClockSource::PllClk => { | ||
| 566 | use crate::pac::rcc::vals::Timsw; | ||
| 567 | |||
| 568 | let pll = unwrap!(pll); | ||
| 569 | assert((pclk2 == pll) || (pclk2 * 2u32 == pll)); | ||
| 570 | |||
| 571 | RCC.cfgr3().modify(|w| w.set_tim17(Timsw::PLL1_P)); | ||
| 572 | |||
| 573 | Some(pll * 2u32) | ||
| 574 | } | ||
| 575 | }; | ||
| 576 | |||
| 577 | #[cfg(any(all(stm32f303, any(package_D, package_E))))] | ||
| 578 | let tim20 = match config.tim.tim20 { | ||
| 579 | TimClockSource::PClk2 => None, | ||
| 580 | TimClockSource::PllClk => { | ||
| 581 | use crate::pac::rcc::vals::Timsw; | ||
| 582 | |||
| 583 | let pll = unwrap!(pll); | ||
| 584 | assert((pclk2 == pll) || (pclk2 * 2u32 == pll)); | ||
| 585 | |||
| 586 | RCC.cfgr3().modify(|w| w.set_tim20(Timsw::PLL1_P)); | ||
| 587 | |||
| 588 | Some(pll * 2u32) | ||
| 589 | } | ||
| 590 | }; | ||
| 591 | |||
| 367 | set_clocks!( | 592 | set_clocks!( |
| 368 | hsi: hsi, | 593 | hsi: hsi, |
| 369 | hse: hse, | 594 | hse: hse, |
| @@ -380,6 +605,22 @@ pub(crate) unsafe fn init(config: Config) { | |||
| 380 | adc34: Some(adc34), | 605 | adc34: Some(adc34), |
| 381 | #[cfg(stm32f334)] | 606 | #[cfg(stm32f334)] |
| 382 | hrtim: hrtim, | 607 | hrtim: hrtim, |
| 608 | #[cfg(all(stm32f3, not(rcc_f37)))] | ||
| 609 | tim1: tim1, | ||
| 610 | #[cfg(any(all(stm32f303, any(package_D, package_E)), all(stm32f302, any(package_D, package_E))))] | ||
| 611 | tim2: tim2, | ||
| 612 | #[cfg(any(all(stm32f303, any(package_D, package_E)), all(stm32f302, any(package_D, package_E))))] | ||
| 613 | tim34: tim34, | ||
| 614 | #[cfg(any(all(stm32f303, any(package_B, package_C, package_D, package_E)), stm32f358))] | ||
| 615 | tim8: tim8, | ||
| 616 | #[cfg(any(all(stm32f303, any(package_D, package_E)), stm32f301, stm32f318, all(stm32f302, any(package_6, package_8))))] | ||
| 617 | tim15: tim15, | ||
| 618 | #[cfg(any(all(stm32f303, any(package_D, package_E)), stm32f301, stm32f318, all(stm32f302, any(package_6, package_8))))] | ||
| 619 | tim16: tim16, | ||
| 620 | #[cfg(any(all(stm32f303, any(package_D, package_E)), stm32f301, stm32f318, all(stm32f302, any(package_6, package_8))))] | ||
| 621 | tim17: tim17, | ||
| 622 | #[cfg(any(all(stm32f303, any(package_D, package_E))))] | ||
| 623 | tim20: tim20, | ||
| 383 | rtc: rtc, | 624 | rtc: rtc, |
| 384 | hsi48: hsi48, | 625 | hsi48: hsi48, |
| 385 | #[cfg(any(rcc_f1, rcc_f1cl, stm32f3))] | 626 | #[cfg(any(rcc_f1, rcc_f1cl, stm32f3))] |
