f4-rcc: Add option to enable debug_wfe and add hello example
This commit is contained in:
parent
5abaf8e9d6
commit
e7714983b3
@ -24,6 +24,7 @@ pub struct Config {
|
|||||||
pub hclk: Option<Hertz>,
|
pub hclk: Option<Hertz>,
|
||||||
pub pclk1: Option<Hertz>,
|
pub pclk1: Option<Hertz>,
|
||||||
pub pclk2: Option<Hertz>,
|
pub pclk2: Option<Hertz>,
|
||||||
|
pub enable_debug_wfe: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// RCC peripheral
|
/// RCC peripheral
|
||||||
@ -68,7 +69,7 @@ impl<'d> Rcc<'d> {
|
|||||||
} else {
|
} else {
|
||||||
sysclk
|
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 hclk = self.config.hclk.map(|h| h.0).unwrap_or(sysclk);
|
||||||
let (hpre_bits, hpre_div) = match (sysclk + hclk - 1) / hclk {
|
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 {
|
Clocks {
|
||||||
sys: Hertz(sysclk),
|
sys: Hertz(sysclk),
|
||||||
apb1: Hertz(pclk1),
|
apb1: Hertz(pclk1),
|
||||||
@ -237,7 +247,7 @@ impl<'d> Rcc<'d> {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let vco_in = pllsrcclk / pllm;
|
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)
|
// Main scaler, must result in >= 100MHz (>= 192MHz for F401)
|
||||||
// and <= 432MHz, min 50, max 432
|
// and <= 432MHz, min 50, max 432
|
||||||
@ -256,7 +266,10 @@ impl<'d> Rcc<'d> {
|
|||||||
} else {
|
} else {
|
||||||
sysclk * sysclk_div / vco_in
|
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;
|
let pllp = (sysclk_div / 2) - 1;
|
||||||
|
|
||||||
|
34
examples/stm32f4/src/bin/hello.rs
Normal file
34
examples/stm32f4/src/bin/hello.rs
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user