initial independent watchdog implementation
This commit is contained in:
parent
c7703ba17c
commit
5cf3fbece4
2 changed files with 55 additions and 0 deletions
|
@ -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;
|
||||
|
||||
|
|
52
embassy-stm32/src/wdg/mod.rs
Normal file
52
embassy-stm32/src/wdg/mod.rs
Normal 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 {}
|
Loading…
Reference in a new issue