aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/build.rs69
-rw-r--r--embassy-stm32/src/rcc/f013.rs221
-rw-r--r--examples/stm32f3/src/bin/usart_dma.rs4
3 files changed, 78 insertions, 216 deletions
diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs
index ee88d4541..f45a571f2 100644
--- a/embassy-stm32/build.rs
+++ b/embassy-stm32/build.rs
@@ -430,6 +430,8 @@ fn main() {
430 430
431 let mut clock_names = BTreeSet::new(); 431 let mut clock_names = BTreeSet::new();
432 432
433 let mut rcc_cfgr_regs = BTreeMap::new();
434
433 for p in METADATA.peripherals { 435 for p in METADATA.peripherals {
434 if !singletons.contains(&p.name.to_string()) { 436 if !singletons.contains(&p.name.to_string()) {
435 continue; 437 continue;
@@ -508,6 +510,16 @@ fn main() {
508 let field_name = format_ident!("{}", field_name); 510 let field_name = format_ident!("{}", field_name);
509 let enum_name = format_ident!("{}", enum_name); 511 let enum_name = format_ident!("{}", enum_name);
510 512
513 if !rcc_cfgr_regs.contains_key(mux.register) {
514 rcc_cfgr_regs.insert(mux.register, Vec::new());
515 }
516
517 rcc_cfgr_regs.get_mut(mux.register).unwrap().push((
518 fieldset_name.clone(),
519 field_name.clone(),
520 enum_name.clone(),
521 ));
522
511 let match_arms: TokenStream = enumm 523 let match_arms: TokenStream = enumm
512 .variants 524 .variants
513 .iter() 525 .iter()
@@ -590,6 +602,63 @@ fn main() {
590 } 602 }
591 } 603 }
592 604
605 for (rcc_cfgr_reg, fields) in rcc_cfgr_regs {
606 println!("cargo:rustc-cfg={}", rcc_cfgr_reg.to_ascii_lowercase());
607
608 let struct_fields: Vec<_> = fields
609 .iter()
610 .map(|(_fieldset, fieldname, enum_name)| {
611 quote! {
612 pub #fieldname: Option<crate::pac::rcc::vals::#enum_name>
613 }
614 })
615 .collect();
616
617 let field_names: Vec<_> = fields
618 .iter()
619 .map(|(_fieldset, fieldname, _enum_name)| fieldname)
620 .collect();
621
622 let inits: Vec<_> = fields
623 .iter()
624 .map(|(fieldset, fieldname, _enum_name)| {
625 let setter = format_ident!("set_{}", fieldname);
626 quote! {
627 match self.#fieldname {
628 None => {}
629 Some(val) => {
630 crate::pac::RCC.#fieldset()
631 .modify(|w| w.#setter(val));
632 }
633 };
634 }
635 })
636 .collect();
637
638 let cfgr_reg = format_ident!("{}", rcc_cfgr_reg);
639
640 g.extend(quote! {
641 #[derive(Clone, Copy)]
642 pub struct #cfgr_reg {
643 #( #struct_fields, )*
644 }
645
646 impl Default for #cfgr_reg {
647 fn default() -> Self {
648 Self {
649 #( #field_names: None, )*
650 }
651 }
652 }
653
654 impl #cfgr_reg {
655 pub fn init(self) {
656 #( #inits )*
657 }
658 }
659 });
660 }
661
593 // Generate RCC 662 // Generate RCC
594 clock_names.insert("sys".to_string()); 663 clock_names.insert("sys".to_string());
595 clock_names.insert("rtc".to_string()); 664 clock_names.insert("rtc".to_string());
diff --git a/embassy-stm32/src/rcc/f013.rs b/embassy-stm32/src/rcc/f013.rs
index 02c3425d1..a61aae0e8 100644
--- a/embassy-stm32/src/rcc/f013.rs
+++ b/embassy-stm32/src/rcc/f013.rs
@@ -74,116 +74,6 @@ 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 stm32f398
92 ))]
93 pub tim2: TimClockSource,
94 #[cfg(any(
95 all(stm32f303, any(package_D, package_E)),
96 all(stm32f302, any(package_D, package_E)),
97 stm32f398
98 ))]
99 pub tim34: TimClockSource,
100 #[cfg(any(
101 all(stm32f303, any(package_B, package_C, package_D, package_E)),
102 stm32f358,
103 stm32f398
104 ))]
105 pub tim8: TimClockSource,
106 #[cfg(any(
107 all(stm32f303, any(package_D, package_E)),
108 stm32f301,
109 stm32f318,
110 all(stm32f302, any(package_6, package_8)),
111 stm32f398
112 ))]
113 pub tim15: TimClockSource,
114 #[cfg(any(
115 all(stm32f303, any(package_D, package_E)),
116 stm32f301,
117 stm32f318,
118 all(stm32f302, any(package_6, package_8)),
119 stm32f398
120 ))]
121 pub tim16: TimClockSource,
122 #[cfg(any(
123 all(stm32f303, any(package_D, package_E)),
124 stm32f301,
125 stm32f318,
126 all(stm32f302, any(package_6, package_8)),
127 stm32f398
128 ))]
129 pub tim17: TimClockSource,
130 #[cfg(any(all(stm32f303, any(package_D, package_E))))]
131 pub tim20: TimClockSource,
132}
133
134#[cfg(all(stm32f3, not(rcc_f37)))]
135impl Default for TimClockSources {
136 fn default() -> Self {
137 Self {
138 tim1: TimClockSource::PClk2,
139 #[cfg(any(
140 all(stm32f303, any(package_D, package_E)),
141 all(stm32f302, any(package_D, package_E)),
142 stm32f398
143 ))]
144 tim2: TimClockSource::PClk2,
145 #[cfg(any(
146 all(stm32f303, any(package_D, package_E)),
147 all(stm32f302, any(package_D, package_E)),
148 stm32f398
149 ))]
150 tim34: TimClockSource::PClk2,
151 #[cfg(any(
152 all(stm32f303, any(package_B, package_C, package_D, package_E)),
153 stm32f358,
154 stm32f398
155 ))]
156 tim8: TimClockSource::PClk2,
157 #[cfg(any(
158 all(stm32f303, any(package_D, package_E)),
159 stm32f301,
160 stm32f318,
161 all(stm32f302, any(package_6, package_8)),
162 stm32f398
163 ))]
164 tim15: TimClockSource::PClk2,
165 #[cfg(any(
166 all(stm32f303, any(package_D, package_E)),
167 stm32f301,
168 stm32f318,
169 all(stm32f302, any(package_6, package_8)),
170 stm32f398
171 ))]
172 tim16: TimClockSource::PClk2,
173 #[cfg(any(
174 all(stm32f303, any(package_D, package_E)),
175 stm32f301,
176 stm32f318,
177 all(stm32f302, any(package_6, package_8)),
178 stm32f398
179 ))]
180 tim17: TimClockSource::PClk2,
181 #[cfg(any(all(stm32f303, any(package_D, package_E))))]
182 tim20: TimClockSource::PClk2,
183 }
184 }
185}
186
187/// Clocks configutation 77/// Clocks configutation
188#[non_exhaustive] 78#[non_exhaustive]
189pub struct Config { 79pub struct Config {
@@ -209,8 +99,8 @@ pub struct Config {
209 pub adc34: AdcClockSource, 99 pub adc34: AdcClockSource,
210 #[cfg(stm32f334)] 100 #[cfg(stm32f334)]
211 pub hrtim: HrtimClockSource, 101 pub hrtim: HrtimClockSource,
212 #[cfg(all(stm32f3, not(rcc_f37)))] 102 #[cfg(cfgr3)]
213 pub tim: TimClockSources, 103 pub cfgr3: crate::_generated::CFGR3,
214 104
215 pub ls: super::LsConfig, 105 pub ls: super::LsConfig,
216} 106}
@@ -240,8 +130,8 @@ impl Default for Config {
240 adc34: AdcClockSource::Hclk(AdcHclkPrescaler::Div1), 130 adc34: AdcClockSource::Hclk(AdcHclkPrescaler::Div1),
241 #[cfg(stm32f334)] 131 #[cfg(stm32f334)]
242 hrtim: HrtimClockSource::BusClk, 132 hrtim: HrtimClockSource::BusClk,
243 #[cfg(all(stm32f3, not(rcc_f37)))] 133 #[cfg(cfgr3)]
244 tim: Default::default(), 134 cfgr3: Default::default(),
245 } 135 }
246 } 136 }
247} 137}
@@ -477,107 +367,8 @@ pub(crate) unsafe fn init(config: Config) {
477 } 367 }
478 }; 368 };
479 369
480 #[cfg(all(stm32f3, not(rcc_f37)))] 370 #[cfg(cfgr3)]
481 match config.tim.tim1 { 371 config.cfgr3.init();
482 TimClockSource::PClk2 => {}
483 TimClockSource::PllClk => {
484 RCC.cfgr3()
485 .modify(|w| w.set_tim1sw(crate::pac::rcc::vals::Timsw::PLL1_P));
486 }
487 };
488
489 #[cfg(any(
490 all(stm32f303, any(package_D, package_E)),
491 all(stm32f302, any(package_D, package_E)),
492 stm32f398
493 ))]
494 match config.tim.tim2 {
495 TimClockSource::PClk2 => {}
496 TimClockSource::PllClk => {
497 RCC.cfgr3()
498 .modify(|w| w.set_tim2sw(crate::pac::rcc::vals::Tim2sw::PLL1_P));
499 }
500 };
501
502 #[cfg(any(
503 all(stm32f303, any(package_D, package_E)),
504 all(stm32f302, any(package_D, package_E)),
505 stm32f398
506 ))]
507 match config.tim.tim34 {
508 TimClockSource::PClk2 => {}
509 TimClockSource::PllClk => {
510 RCC.cfgr3()
511 .modify(|w| w.set_tim34sw(crate::pac::rcc::vals::Timsw::PLL1_P));
512 }
513 };
514
515 #[cfg(any(
516 all(stm32f303, any(package_B, package_C, package_D, package_E)),
517 stm32f358,
518 stm32f398
519 ))]
520 match config.tim.tim8 {
521 TimClockSource::PClk2 => {}
522 TimClockSource::PllClk => {
523 RCC.cfgr3()
524 .modify(|w| w.set_tim8sw(crate::pac::rcc::vals::Timsw::PLL1_P));
525 }
526 };
527
528 #[cfg(any(
529 all(stm32f303, any(package_D, package_E)),
530 stm32f301,
531 stm32f318,
532 all(stm32f302, any(package_6, package_8)),
533 stm32f398
534 ))]
535 match config.tim.tim15 {
536 TimClockSource::PClk2 => {}
537 TimClockSource::PllClk => {
538 RCC.cfgr3()
539 .modify(|w| w.set_tim15sw(crate::pac::rcc::vals::Timsw::PLL1_P));
540 }
541 };
542
543 #[cfg(any(
544 all(stm32f303, any(package_D, package_E)),
545 stm32f301,
546 stm32f318,
547 all(stm32f302, any(package_6, package_8)),
548 stm32f398
549 ))]
550 match config.tim.tim16 {
551 TimClockSource::PClk2 => {}
552 TimClockSource::PllClk => {
553 RCC.cfgr3()
554 .modify(|w| w.set_tim16sw(crate::pac::rcc::vals::Timsw::PLL1_P));
555 }
556 };
557
558 #[cfg(any(
559 all(stm32f303, any(package_D, package_E)),
560 stm32f301,
561 stm32f318,
562 all(stm32f302, any(package_6, package_8)),
563 stm32f398
564 ))]
565 match config.tim.tim17 {
566 TimClockSource::PClk2 => {}
567 TimClockSource::PllClk => {
568 RCC.cfgr3()
569 .modify(|w| w.set_tim17sw(crate::pac::rcc::vals::Timsw::PLL1_P));
570 }
571 }
572
573 #[cfg(any(all(stm32f303, any(package_D, package_E))))]
574 match config.tim.tim20 {
575 TimClockSource::PClk2 => {}
576 TimClockSource::PllClk => {
577 RCC.cfgr3()
578 .modify(|w| w.set_tim20sw(crate::pac::rcc::vals::Timsw::PLL1_P));
579 }
580 }
581 372
582 set_clocks!( 373 set_clocks!(
583 hsi: hsi, 374 hsi: hsi,
diff --git a/examples/stm32f3/src/bin/usart_dma.rs b/examples/stm32f3/src/bin/usart_dma.rs
index 5234e53b9..7dc905adc 100644
--- a/examples/stm32f3/src/bin/usart_dma.rs
+++ b/examples/stm32f3/src/bin/usart_dma.rs
@@ -17,7 +17,9 @@ bind_interrupts!(struct Irqs {
17 17
18#[embassy_executor::main] 18#[embassy_executor::main]
19async fn main(_spawner: Spawner) { 19async fn main(_spawner: Spawner) {
20 let p = embassy_stm32::init(Default::default()); 20 let mut init_config = embassy_stm32::Config::default();
21 init_config.rcc.cfgr3.usart1sw = Some(embassy_stm32::pac::rcc::vals::Usart1sw::HSI);
22 let p = embassy_stm32::init(init_config);
21 info!("Hello World!"); 23 info!("Hello World!");
22 24
23 let config = Config::default(); 25 let config = Config::default();