aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/build.rs22
1 files changed, 15 insertions, 7 deletions
diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs
index df866b5ff..8457e3a13 100644
--- a/embassy-stm32/build.rs
+++ b/embassy-stm32/build.rs
@@ -475,13 +475,21 @@ fn main() {
475 } 475 }
476 476
477 impl<'a> ClockGen<'a> { 477 impl<'a> ClockGen<'a> {
478 fn gen_clock(&mut self, name: &str) -> TokenStream { 478 fn gen_clock(&mut self, peripheral: &str, name: &str) -> TokenStream {
479 let clock_name = format_ident!("{}", name.to_ascii_lowercase()); 479 let clock_name = format_ident!("{}", name.to_ascii_lowercase());
480 self.clock_names.insert(name.to_ascii_lowercase()); 480 self.clock_names.insert(name.to_ascii_lowercase());
481 quote!( unsafe { crate::rcc::get_freqs().#clock_name.unwrap() } ) 481 quote!(unsafe {
482 unwrap!(
483 crate::rcc::get_freqs().#clock_name,
484 "peripheral '{}' is configured to use the '{}' clock, which is not running. \
485 Either enable it in 'config.rcc' or change 'config.rcc.mux' to use another clock",
486 #peripheral,
487 #name
488 )
489 })
482 } 490 }
483 491
484 fn gen_mux(&mut self, mux: &PeripheralRccRegister) -> TokenStream { 492 fn gen_mux(&mut self, peripheral: &str, mux: &PeripheralRccRegister) -> TokenStream {
485 let ir = &self.rcc_registers.ir; 493 let ir = &self.rcc_registers.ir;
486 let fieldset_name = mux.register.to_ascii_lowercase(); 494 let fieldset_name = mux.register.to_ascii_lowercase();
487 let fieldset = ir 495 let fieldset = ir
@@ -506,9 +514,9 @@ fn main() {
506 for v in enumm.variants.iter().filter(|v| v.name != "DISABLE") { 514 for v in enumm.variants.iter().filter(|v| v.name != "DISABLE") {
507 let variant_name = format_ident!("{}", v.name); 515 let variant_name = format_ident!("{}", v.name);
508 let expr = if let Some(mux) = self.chained_muxes.get(&v.name) { 516 let expr = if let Some(mux) = self.chained_muxes.get(&v.name) {
509 self.gen_mux(mux) 517 self.gen_mux(peripheral, mux)
510 } else { 518 } else {
511 self.gen_clock(v.name) 519 self.gen_clock(peripheral, v.name)
512 }; 520 };
513 match_arms.extend(quote! { 521 match_arms.extend(quote! {
514 crate::pac::rcc::vals::#enum_name::#variant_name => #expr, 522 crate::pac::rcc::vals::#enum_name::#variant_name => #expr,
@@ -586,8 +594,8 @@ fn main() {
586 }; 594 };
587 595
588 let clock_frequency = match &rcc.kernel_clock { 596 let clock_frequency = match &rcc.kernel_clock {
589 PeripheralRccKernelClock::Mux(mux) => clock_gen.gen_mux(mux), 597 PeripheralRccKernelClock::Mux(mux) => clock_gen.gen_mux(p.name, mux),
590 PeripheralRccKernelClock::Clock(clock) => clock_gen.gen_clock(clock), 598 PeripheralRccKernelClock::Clock(clock) => clock_gen.gen_clock(p.name, clock),
591 }; 599 };
592 600
593 // A refcount leak can result if the same field is shared by peripherals with different stop modes 601 // A refcount leak can result if the same field is shared by peripherals with different stop modes