use crate::hal;
use hal::pac;
use hal::prelude::*;
use hal::pwr;
use hal::rcc;
use hal::rcc::rec::AdcClkSel;
use hal::time::Hertz;
use hal::time::MegaHertz;
use crate::audio;
const PLL3_P: Hertz = Hertz::from_raw(audio::FS.to_Hz() * 256);
pub trait SeedCrystal {
const CRYSTAL_FREQ: MegaHertz = MegaHertz::from_raw(16);
fn use_seed_crystal(self) -> Self;
}
impl SeedCrystal for rcc::Rcc {
fn use_seed_crystal(self) -> Self {
self.use_hse(Self::CRYSTAL_FREQ.convert())
}
}
pub fn configure(pwr: pwr::Pwr, rcc: rcc::Rcc, syscfg: &pac::SYSCFG) -> rcc::Ccdr {
let pwrcfg = pwr.vos0(syscfg).freeze();
#[cfg(not(feature = "log-itm"))]
let mut ccdr = rcc
.use_seed_crystal() .pll1_strategy(rcc::PllConfigStrategy::Iterative) .pll1_q_ck(48.MHz()) .sys_ck(480.MHz()) .pll3_p_ck(PLL3_P) .per_ck(4.MHz()) .freeze(pwrcfg, syscfg);
#[cfg(any(feature = "log-itm"))]
let mut ccdr = rcc
.use_seed_crystal() .pll1_strategy(rcc::PllConfigStrategy::Iterative) .sys_ck(480.MHz()) .pll1_r_ck(480.MHz()) .pll1_q_ck(48.MHz()) .pll3_p_ck(PLL3_P) .per_ck(4.MHz()) .freeze(pwrcfg, syscfg);
ccdr.peripheral.kernel_adc_clk_mux(AdcClkSel::PER);
#[cfg(any(feature = "log-itm"))]
unsafe {
let swo_frequency = 2_000_000;
let mut cp = cortex_m::Peripherals::steal();
let dp = pac::Peripherals::steal();
crate::itm::enable_itm(
&mut cp.DCB,
&dp.DBGMCU,
&mut cp.ITM,
ccdr.clocks.c_ck().to_Hz(),
swo_frequency,
);
}
ccdr
}