#[cfg(any(feature = "9160", feature = "5340-app", feature = "5340-net"))]
use crate::pac::CLOCK_NS as CLOCK;
#[cfg(not(any(feature = "9160", feature = "5340-app", feature = "5340-net")))]
use crate::pac::CLOCK;
pub struct Internal;
pub struct ExternalOscillator;
pub struct LfOscSynthesized;
pub struct LfOscStarted;
pub struct LfOscStopped;
pub const HFCLK_FREQ: u32 = 64_000_000;
pub const LFCLK_FREQ: u32 = 32_768;
pub struct Clocks<H, L, LSTAT> {
hfclk: H,
lfclk: L,
lfstat: LSTAT,
periph: CLOCK,
}
impl Clocks<Internal, Internal, LfOscStopped> {
pub fn new(clock: CLOCK) -> Clocks<Internal, Internal, LfOscStopped> {
Clocks {
hfclk: Internal,
lfclk: Internal,
lfstat: LfOscStopped,
periph: clock,
}
}
}
impl<H, L, LSTAT> Clocks<H, L, LSTAT> {
pub fn enable_ext_hfosc(self) -> Clocks<ExternalOscillator, L, LSTAT> {
self.periph.tasks_hfclkstart.write(|w| unsafe { w.bits(1) });
while self.periph.events_hfclkstarted.read().bits() != 1 {}
self.periph
.events_hfclkstarted
.write(|w| unsafe { w.bits(0) });
Clocks {
hfclk: ExternalOscillator,
lfclk: self.lfclk,
lfstat: self.lfstat,
periph: self.periph,
}
}
pub fn disable_ext_hfosc(self) -> Clocks<Internal, L, LSTAT> {
self.periph.tasks_hfclkstop.write(|w| unsafe { w.bits(1) });
Clocks {
hfclk: Internal,
lfclk: self.lfclk,
lfstat: self.lfstat,
periph: self.periph,
}
}
pub fn start_lfclk(self) -> Clocks<H, L, LfOscStarted> {
self.periph.tasks_lfclkstart.write(|w| unsafe { w.bits(1) });
while self.periph.events_lfclkstarted.read().bits() != 1 {}
self.periph
.events_lfclkstarted
.write(|w| unsafe { w.bits(0) });
Clocks {
hfclk: self.hfclk,
lfclk: self.lfclk,
lfstat: LfOscStarted,
periph: self.periph,
}
}
}
pub enum LfOscConfiguration {
NoExternalNoBypass,
ExternalNoBypass,
ExternalAndBypass,
}
impl<H, L> Clocks<H, L, LfOscStarted> {
pub fn stop_lfclk(self) -> Clocks<H, L, LfOscStopped> {
self.periph.tasks_lfclkstop.write(|w| unsafe { w.bits(1) });
Clocks {
hfclk: self.hfclk,
lfclk: self.lfclk,
lfstat: LfOscStopped,
periph: self.periph,
}
}
}
impl<H, L> Clocks<H, L, LfOscStopped> {
#[cfg(feature = "51")]
pub fn set_lfclk_src_rc(self) -> Clocks<H, Internal, LfOscStopped> {
self.periph.lfclksrc.write(|w| w.src().rc());
Clocks {
hfclk: self.hfclk,
lfclk: Internal,
lfstat: self.lfstat,
periph: self.periph,
}
}
#[cfg(feature = "51")]
pub fn set_lfclk_src_synth(self) -> Clocks<H, LfOscSynthesized, LfOscStopped> {
self.periph.lfclksrc.write(|w| w.src().synth());
Clocks {
hfclk: self.hfclk,
lfclk: LfOscSynthesized,
lfstat: self.lfstat,
periph: self.periph,
}
}
#[cfg(feature = "51")]
pub fn set_lfclk_src_external(self) -> Clocks<H, ExternalOscillator, LfOscStopped> {
self.periph.lfclksrc.write(move |w| w.src().xtal());
Clocks {
hfclk: self.hfclk,
lfclk: ExternalOscillator,
lfstat: self.lfstat,
periph: self.periph,
}
}
#[cfg(not(any(
feature = "9160",
feature = "5340-app",
feature = "5340-net",
feature = "51"
)))]
pub fn set_lfclk_src_rc(self) -> Clocks<H, Internal, LfOscStopped> {
self.periph
.lfclksrc
.write(|w| w.src().rc().bypass().disabled().external().disabled());
Clocks {
hfclk: self.hfclk,
lfclk: Internal,
lfstat: self.lfstat,
periph: self.periph,
}
}
#[cfg(not(any(
feature = "9160",
feature = "5340-app",
feature = "5340-net",
feature = "51"
)))]
pub fn set_lfclk_src_synth(self) -> Clocks<H, LfOscSynthesized, LfOscStopped> {
self.periph
.lfclksrc
.write(|w| w.src().synth().bypass().disabled().external().disabled());
Clocks {
hfclk: self.hfclk,
lfclk: LfOscSynthesized,
lfstat: self.lfstat,
periph: self.periph,
}
}
#[cfg(not(any(
feature = "9160",
feature = "5340-app",
feature = "5340-net",
feature = "51"
)))]
pub fn set_lfclk_src_external(
self,
cfg: LfOscConfiguration,
) -> Clocks<H, ExternalOscillator, LfOscStopped> {
let (ext, byp) = match cfg {
LfOscConfiguration::NoExternalNoBypass => (false, false),
LfOscConfiguration::ExternalNoBypass => (true, false),
LfOscConfiguration::ExternalAndBypass => (true, true),
};
self.periph
.lfclksrc
.write(move |w| w.src().xtal().bypass().bit(byp).external().bit(ext));
Clocks {
hfclk: self.hfclk,
lfclk: ExternalOscillator,
lfstat: self.lfstat,
periph: self.periph,
}
}
}