f4-rcc: Add option to enable debug_wfe and add hello example

This commit is contained in:
Thales Fragoso 2021-07-28 16:02:56 -03:00
parent 5abaf8e9d6
commit e7714983b3
2 changed files with 50 additions and 3 deletions

View File

@ -24,6 +24,7 @@ pub struct Config {
pub hclk: Option<Hertz>,
pub pclk1: Option<Hertz>,
pub pclk2: Option<Hertz>,
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;

View 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;
}
}