aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/src/rcc/f4/mod.rs19
-rw-r--r--examples/stm32f4/src/bin/hello.rs34
2 files changed, 50 insertions, 3 deletions
diff --git a/embassy-stm32/src/rcc/f4/mod.rs b/embassy-stm32/src/rcc/f4/mod.rs
index de330d36d..a5773ec13 100644
--- a/embassy-stm32/src/rcc/f4/mod.rs
+++ b/embassy-stm32/src/rcc/f4/mod.rs
@@ -24,6 +24,7 @@ pub struct Config {
24 pub hclk: Option<Hertz>, 24 pub hclk: Option<Hertz>,
25 pub pclk1: Option<Hertz>, 25 pub pclk1: Option<Hertz>,
26 pub pclk2: Option<Hertz>, 26 pub pclk2: Option<Hertz>,
27 pub enable_debug_wfe: bool,
27} 28}
28 29
29/// RCC peripheral 30/// RCC peripheral
@@ -68,7 +69,7 @@ impl<'d> Rcc<'d> {
68 } else { 69 } else {
69 sysclk 70 sysclk
70 }; 71 };
71 assert!((SYSCLK_MIN..=SYSCLK_MAX).contains(&sysclk)); 72 assert!((SYSCLK_MIN..=SYSCLK_MAX).contains(&sysclk), "sysclk");
72 73
73 let hclk = self.config.hclk.map(|h| h.0).unwrap_or(sysclk); 74 let hclk = self.config.hclk.map(|h| h.0).unwrap_or(sysclk);
74 let (hpre_bits, hpre_div) = match (sysclk + hclk - 1) / hclk { 75 let (hpre_bits, hpre_div) = match (sysclk + hclk - 1) / hclk {
@@ -168,6 +169,15 @@ impl<'d> Rcc<'d> {
168 }); 169 });
169 } 170 }
170 171
172 if self.config.enable_debug_wfe {
173 unsafe {
174 RCC.ahb1enr().modify(|w| w.set_dma1en(true));
175 critical_section::with(|_| {
176 crate::dbgmcu::Dbgmcu::enable_all();
177 });
178 }
179 }
180
171 Clocks { 181 Clocks {
172 sys: Hertz(sysclk), 182 sys: Hertz(sysclk),
173 apb1: Hertz(pclk1), 183 apb1: Hertz(pclk1),
@@ -237,7 +247,7 @@ impl<'d> Rcc<'d> {
237 .unwrap(); 247 .unwrap();
238 248
239 let vco_in = pllsrcclk / pllm; 249 let vco_in = pllsrcclk / pllm;
240 assert!((1_000_000..=2_000_000).contains(&vco_in)); 250 assert!((1_000_000..=2_000_000).contains(&vco_in), "vco_in");
241 251
242 // Main scaler, must result in >= 100MHz (>= 192MHz for F401) 252 // Main scaler, must result in >= 100MHz (>= 192MHz for F401)
243 // and <= 432MHz, min 50, max 432 253 // and <= 432MHz, min 50, max 432
@@ -256,7 +266,10 @@ impl<'d> Rcc<'d> {
256 } else { 266 } else {
257 sysclk * sysclk_div / vco_in 267 sysclk * sysclk_div / vco_in
258 }; 268 };
259 assert!((192_000_000..=432_000_000).contains(&(vco_in * plln))); 269 assert!(
270 (192_000_000..=432_000_000).contains(&(vco_in * plln)),
271 "plln"
272 );
260 273
261 let pllp = (sysclk_div / 2) - 1; 274 let pllp = (sysclk_div / 2) - 1;
262 275
diff --git a/examples/stm32f4/src/bin/hello.rs b/examples/stm32f4/src/bin/hello.rs
new file mode 100644
index 000000000..8d4be7150
--- /dev/null
+++ b/examples/stm32f4/src/bin/hello.rs
@@ -0,0 +1,34 @@
1#![no_std]
2#![no_main]
3#![feature(trait_alias)]
4#![feature(min_type_alias_impl_trait)]
5#![feature(impl_trait_in_bindings)]
6#![feature(type_alias_impl_trait)]
7#![allow(incomplete_features)]
8
9use defmt::{info, panic};
10use embassy::executor::Spawner;
11use embassy::time::{Duration, Timer};
12use embassy_stm32::rcc::Config as RccConfig;
13use embassy_stm32::time::Hertz;
14use embassy_stm32::Config;
15use embassy_stm32::Peripherals;
16
17#[path = "../example_common.rs"]
18mod example_common;
19
20fn config() -> Config {
21 let mut rcc_config = RccConfig::default();
22 rcc_config.sys_ck = Some(Hertz(32_000_000));
23 rcc_config.enable_debug_wfe = true;
24
25 Config::default().rcc(rcc_config)
26}
27
28#[embassy::main(config = "config()")]
29async fn main(_spawner: Spawner, _p: Peripherals) -> ! {
30 loop {
31 info!("Hello World!");
32 Timer::after(Duration::from_secs(1)).await;
33 }
34}