diff options
| -rw-r--r-- | embassy-stm32/build.rs | 69 | ||||
| -rw-r--r-- | embassy-stm32/src/rcc/f013.rs | 221 | ||||
| -rw-r--r-- | examples/stm32f3/src/bin/usart_dma.rs | 4 |
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)] | ||
| 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 | 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)))] | ||
| 135 | impl 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] |
| 189 | pub struct Config { | 79 | pub 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] |
| 19 | async fn main(_spawner: Spawner) { | 19 | async 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(); |
