diff options
| author | Thales Fragoso <[email protected]> | 2021-07-28 16:02:56 -0300 |
|---|---|---|
| committer | Thales Fragoso <[email protected]> | 2021-07-29 18:43:15 -0300 |
| commit | e7714983b3f6ff5084e1cb27bc4de794f98081fd (patch) | |
| tree | ccedd3ed5d3f51627b60f1216e8da9098947e623 | |
| parent | 5abaf8e9d6a673bbbf7e900b15a77d6e7d1a2962 (diff) | |
f4-rcc: Add option to enable debug_wfe and add hello example
| -rw-r--r-- | embassy-stm32/src/rcc/f4/mod.rs | 19 | ||||
| -rw-r--r-- | examples/stm32f4/src/bin/hello.rs | 34 |
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 | |||
| 9 | use defmt::{info, panic}; | ||
| 10 | use embassy::executor::Spawner; | ||
| 11 | use embassy::time::{Duration, Timer}; | ||
| 12 | use embassy_stm32::rcc::Config as RccConfig; | ||
| 13 | use embassy_stm32::time::Hertz; | ||
| 14 | use embassy_stm32::Config; | ||
| 15 | use embassy_stm32::Peripherals; | ||
| 16 | |||
| 17 | #[path = "../example_common.rs"] | ||
| 18 | mod example_common; | ||
| 19 | |||
| 20 | fn 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()")] | ||
| 29 | async fn main(_spawner: Spawner, _p: Peripherals) -> ! { | ||
| 30 | loop { | ||
| 31 | info!("Hello World!"); | ||
| 32 | Timer::after(Duration::from_secs(1)).await; | ||
| 33 | } | ||
| 34 | } | ||
