Merge pull request #2224 from cbruiz/stm32g0-usb_spi

Add support for HSE Oscillator in stm32g0
This commit is contained in:
Dario Nieuwenhuis 2023-12-04 12:32:52 +00:00 committed by GitHub
commit 52fabbfb46
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -10,10 +10,18 @@ use crate::time::Hertz;
/// HSI speed /// HSI speed
pub const HSI_FREQ: Hertz = Hertz(16_000_000); pub const HSI_FREQ: Hertz = Hertz(16_000_000);
#[derive(Clone, Copy, Eq, PartialEq)]
pub enum HseMode {
/// crystal/ceramic oscillator (HSEBYP=0)
Oscillator,
/// external analog clock (low swing) (HSEBYP=1)
Bypass,
}
/// System clock mux source /// System clock mux source
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
pub enum ClockSrc { pub enum ClockSrc {
HSE(Hertz), HSE(Hertz, HseMode),
HSI(HSIPrescaler), HSI(HSIPrescaler),
PLL(PllConfig), PLL(PllConfig),
LSI, LSI,
@ -61,7 +69,7 @@ impl Default for PllConfig {
#[derive(Clone, Copy, Eq, PartialEq)] #[derive(Clone, Copy, Eq, PartialEq)]
pub enum PllSource { pub enum PllSource {
HSI, HSI,
HSE(Hertz), HSE(Hertz, HseMode),
} }
/// Clocks configutation /// Clocks configutation
@ -90,7 +98,7 @@ impl PllConfig {
pub(crate) fn init(self) -> Hertz { pub(crate) fn init(self) -> Hertz {
let (src, input_freq) = match self.source { let (src, input_freq) = match self.source {
PllSource::HSI => (vals::Pllsrc::HSI, HSI_FREQ), PllSource::HSI => (vals::Pllsrc::HSI, HSI_FREQ),
PllSource::HSE(freq) => (vals::Pllsrc::HSE, freq), PllSource::HSE(freq, _) => (vals::Pllsrc::HSE, freq),
}; };
let m_freq = input_freq / self.m; let m_freq = input_freq / self.m;
@ -125,8 +133,11 @@ impl PllConfig {
RCC.cr().write(|w| w.set_hsion(true)); RCC.cr().write(|w| w.set_hsion(true));
while !RCC.cr().read().hsirdy() {} while !RCC.cr().read().hsirdy() {}
} }
PllSource::HSE(_) => { PllSource::HSE(_, mode) => {
RCC.cr().write(|w| w.set_hseon(true)); RCC.cr().write(|w| {
w.set_hsebyp(mode != HseMode::Oscillator);
w.set_hseon(true);
});
while !RCC.cr().read().hserdy() {} while !RCC.cr().read().hserdy() {}
} }
} }
@ -177,9 +188,12 @@ pub(crate) unsafe fn init(config: Config) {
(HSI_FREQ / div, Sw::HSI) (HSI_FREQ / div, Sw::HSI)
} }
ClockSrc::HSE(freq) => { ClockSrc::HSE(freq, mode) => {
// Enable HSE // Enable HSE
RCC.cr().write(|w| w.set_hseon(true)); RCC.cr().write(|w| {
w.set_hseon(true);
w.set_hsebyp(mode != HseMode::Oscillator);
});
while !RCC.cr().read().hserdy() {} while !RCC.cr().read().hserdy() {}
(freq, Sw::HSE) (freq, Sw::HSE)