initial independent watchdog implementation

This commit is contained in:
Vincent Stakenburg 2022-06-10 16:10:54 +02:00
parent c7703ba17c
commit 5cf3fbece4
2 changed files with 55 additions and 0 deletions

View file

@ -55,6 +55,9 @@ pub mod usb;
#[cfg(any(otgfs, otghs))]
pub mod usb_otg;
#[cfg(iwdg)]
pub mod wdg;
#[cfg(feature = "subghz")]
pub mod subghz;

View file

@ -0,0 +1,52 @@
use core::marker::PhantomData;
use embassy::util::Unborrow;
use embassy_hal_common::unborrow;
use stm32_metapac::iwdg::vals::Key;
pub use stm32_metapac::iwdg::vals::Pr as Prescaler;
pub struct IndependentWatchdog<'d, T: Instance> {
wdg: PhantomData<&'d mut T>,
}
impl<'d, T: Instance> IndependentWatchdog<'d, T> {
pub fn new(_instance: impl Unborrow<Target = T>, presc: Prescaler) -> Self {
unborrow!(_instance);
let wdg = T::regs();
unsafe {
wdg.kr().write(|w| w.set_key(Key::ENABLE));
wdg.pr().write(|w| w.set_pr(presc));
}
IndependentWatchdog {
wdg: PhantomData::default(),
}
}
pub unsafe fn unleash(&mut self) {
T::regs().kr().write(|w| w.set_key(Key::START));
}
pub unsafe fn feed(&mut self) {
T::regs().kr().write(|w| w.set_key(Key::RESET));
}
}
mod sealed {
pub trait Instance {
fn regs() -> crate::pac::iwdg::Iwdg;
}
}
pub trait Instance: sealed::Instance {}
impl sealed::Instance for crate::peripherals::IWDG {
fn regs() -> crate::pac::iwdg::Iwdg {
crate::pac::IWDG
}
}
impl Instance for crate::peripherals::IWDG {}