diff options
| author | Justus K <[email protected]> | 2024-07-02 16:39:24 +0200 |
|---|---|---|
| committer | Justus K <[email protected]> | 2024-07-03 08:32:00 +0200 |
| commit | 9e4e536769e8bf35ecd43efac58d0655a77e5d58 (patch) | |
| tree | 11b1a057e2b85a967ef69f9fa7b9a2189502a576 /embassy-stm32 | |
| parent | 9bdb697cd96d36dd6e42e8680e3f2f7983e35f74 (diff) | |
Better panic message when peripheral clock is not enabled
Diffstat (limited to 'embassy-stm32')
| -rw-r--r-- | embassy-stm32/build.rs | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs index 24e2226a2..14db0504b 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 |
