aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Orona <[email protected]>2024-02-15 19:50:42 -0800
committerEli Orona <[email protected]>2024-02-15 19:50:42 -0800
commit169f1ce928177a6ff85ce7e9ff5a995063b6aace (patch)
treec54e5098a50e00edeb5aab1815fed34d6bddbe83
parent26fc17e8a7db0957896db28cb2299ab9cf89aea5 (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.rs241
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)]
79pub enum TimClockSource {
80 PClk2,
81 PllClk,
82}
83
84#[cfg(all(stm32f3, not(rcc_f37)))]
85#[derive(Clone, Copy)]
86pub 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
130impl 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]
79pub struct Config { 180pub 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))]