stm32/rcc: add shared code for hsi48 with crs support.
This commit is contained in:
62
embassy-stm32/src/rcc/hsi48.rs
Normal file
62
embassy-stm32/src/rcc/hsi48.rs
Normal file
@ -0,0 +1,62 @@
|
||||
#![allow(unused)]
|
||||
|
||||
use crate::pac::crs::vals::Syncsrc;
|
||||
use crate::pac::{CRS, RCC};
|
||||
use crate::rcc::sealed::RccPeripheral;
|
||||
use crate::time::Hertz;
|
||||
|
||||
/// HSI48 speed
|
||||
pub const HSI48_FREQ: Hertz = Hertz(48_000_000);
|
||||
|
||||
/// Configuration for the HSI48 clock
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct Hsi48Config {
|
||||
/// Enable CRS Sync from USB Start Of Frame (SOF) events.
|
||||
/// Required if HSI48 is going to be used as USB clock.
|
||||
///
|
||||
/// Other use cases of CRS are not supported yet.
|
||||
pub sync_from_usb: bool,
|
||||
}
|
||||
|
||||
impl Default for Hsi48Config {
|
||||
fn default() -> Self {
|
||||
Self { sync_from_usb: false }
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn init_hsi48(config: Hsi48Config) -> Hertz {
|
||||
// Enable VREFINT reference for HSI48 oscillator
|
||||
#[cfg(stm32l0)]
|
||||
crate::pac::SYSCFG.cfgr3().modify(|w| {
|
||||
w.set_enref_hsi48(true);
|
||||
w.set_en_vrefint(true);
|
||||
});
|
||||
|
||||
// Enable HSI48
|
||||
#[cfg(not(any(stm32u5, stm32g0, stm32h5, stm32h7, stm32u5, stm32wba, stm32f0)))]
|
||||
let r = RCC.crrcr();
|
||||
#[cfg(any(stm32u5, stm32g0, stm32h5, stm32h7, stm32u5, stm32wba))]
|
||||
let r = RCC.cr();
|
||||
#[cfg(any(stm32f0))]
|
||||
let r = RCC.cr2();
|
||||
|
||||
r.modify(|w| w.set_hsi48on(true));
|
||||
while r.read().hsi48rdy() == false {}
|
||||
|
||||
if config.sync_from_usb {
|
||||
crate::peripherals::CRS::enable_and_reset();
|
||||
|
||||
CRS.cfgr().modify(|w| {
|
||||
w.set_syncsrc(Syncsrc::USB);
|
||||
});
|
||||
|
||||
// These are the correct settings for standard USB operation. If other settings
|
||||
// are needed there will need to be additional config options for the CRS.
|
||||
crate::pac::CRS.cr().modify(|w| {
|
||||
w.set_autotrimen(true);
|
||||
w.set_cen(true);
|
||||
});
|
||||
}
|
||||
|
||||
HSI48_FREQ
|
||||
}
|
Reference in New Issue
Block a user