diff --git a/embassy-stm32/src/rcc/f4/mod.rs b/embassy-stm32/src/rcc/f4/mod.rs index de330d36..a5773ec1 100644 --- a/embassy-stm32/src/rcc/f4/mod.rs +++ b/embassy-stm32/src/rcc/f4/mod.rs @@ -24,6 +24,7 @@ pub struct Config { pub hclk: Option, pub pclk1: Option, pub pclk2: Option, + pub enable_debug_wfe: bool, } /// RCC peripheral @@ -68,7 +69,7 @@ impl<'d> Rcc<'d> { } else { sysclk }; - assert!((SYSCLK_MIN..=SYSCLK_MAX).contains(&sysclk)); + assert!((SYSCLK_MIN..=SYSCLK_MAX).contains(&sysclk), "sysclk"); let hclk = self.config.hclk.map(|h| h.0).unwrap_or(sysclk); let (hpre_bits, hpre_div) = match (sysclk + hclk - 1) / hclk { @@ -168,6 +169,15 @@ impl<'d> Rcc<'d> { }); } + if self.config.enable_debug_wfe { + unsafe { + RCC.ahb1enr().modify(|w| w.set_dma1en(true)); + critical_section::with(|_| { + crate::dbgmcu::Dbgmcu::enable_all(); + }); + } + } + Clocks { sys: Hertz(sysclk), apb1: Hertz(pclk1), @@ -237,7 +247,7 @@ impl<'d> Rcc<'d> { .unwrap(); let vco_in = pllsrcclk / pllm; - assert!((1_000_000..=2_000_000).contains(&vco_in)); + assert!((1_000_000..=2_000_000).contains(&vco_in), "vco_in"); // Main scaler, must result in >= 100MHz (>= 192MHz for F401) // and <= 432MHz, min 50, max 432 @@ -256,7 +266,10 @@ impl<'d> Rcc<'d> { } else { sysclk * sysclk_div / vco_in }; - assert!((192_000_000..=432_000_000).contains(&(vco_in * plln))); + assert!( + (192_000_000..=432_000_000).contains(&(vco_in * plln)), + "plln" + ); let pllp = (sysclk_div / 2) - 1; diff --git a/examples/stm32f4/src/bin/hello.rs b/examples/stm32f4/src/bin/hello.rs new file mode 100644 index 00000000..8d4be715 --- /dev/null +++ b/examples/stm32f4/src/bin/hello.rs @@ -0,0 +1,34 @@ +#![no_std] +#![no_main] +#![feature(trait_alias)] +#![feature(min_type_alias_impl_trait)] +#![feature(impl_trait_in_bindings)] +#![feature(type_alias_impl_trait)] +#![allow(incomplete_features)] + +use defmt::{info, panic}; +use embassy::executor::Spawner; +use embassy::time::{Duration, Timer}; +use embassy_stm32::rcc::Config as RccConfig; +use embassy_stm32::time::Hertz; +use embassy_stm32::Config; +use embassy_stm32::Peripherals; + +#[path = "../example_common.rs"] +mod example_common; + +fn config() -> Config { + let mut rcc_config = RccConfig::default(); + rcc_config.sys_ck = Some(Hertz(32_000_000)); + rcc_config.enable_debug_wfe = true; + + Config::default().rcc(rcc_config) +} + +#[embassy::main(config = "config()")] +async fn main(_spawner: Spawner, _p: Peripherals) -> ! { + loop { + info!("Hello World!"); + Timer::after(Duration::from_secs(1)).await; + } +}