803: Initial independent watchdog implementation r=FrozenDroid a=FrozenDroid



Co-authored-by: Vincent Stakenburg <v.stakenburg@cosinuss.nl>
This commit is contained in:
bors[bot] 2022-06-28 11:40:51 +00:00 committed by GitHub
commit e0e675042b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 56 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,53 @@
use core::marker::PhantomData;
use embassy_hal_common::{unborrow, 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> + 'd, 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 pet(&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 {}
foreach_peripheral!(
(iwdg, $inst:ident) => {
impl sealed::Instance for crate::peripherals::$inst {
fn regs() -> crate::pac::iwdg::Iwdg {
crate::pac::$inst
}
}
impl Instance for crate::peripherals::$inst {}
};
);