rtc: get wakup irq working
This commit is contained in:
parent
1ea4c58c39
commit
fc04d2a33c
@ -7,6 +7,7 @@ use embassy_time::Duration;
|
|||||||
|
|
||||||
use crate::interrupt;
|
use crate::interrupt;
|
||||||
use crate::interrupt::typelevel::Interrupt;
|
use crate::interrupt::typelevel::Interrupt;
|
||||||
|
use crate::pac::EXTI;
|
||||||
|
|
||||||
const THREAD_PENDER: usize = usize::MAX;
|
const THREAD_PENDER: usize = usize::MAX;
|
||||||
const THRESHOLD: Duration = Duration::from_millis(500);
|
const THRESHOLD: Duration = Duration::from_millis(500);
|
||||||
@ -28,6 +29,9 @@ pub fn stop_with_rtc(rtc: &'static Rtc) {
|
|||||||
crate::interrupt::typelevel::RTC_WKUP::unpend();
|
crate::interrupt::typelevel::RTC_WKUP::unpend();
|
||||||
unsafe { crate::interrupt::typelevel::RTC_WKUP::enable() };
|
unsafe { crate::interrupt::typelevel::RTC_WKUP::enable() };
|
||||||
|
|
||||||
|
EXTI.rtsr(0).modify(|w| w.set_line(22, true));
|
||||||
|
EXTI.imr(0).modify(|w| w.set_line(22, true));
|
||||||
|
|
||||||
unsafe { RTC = Some(rtc) };
|
unsafe { RTC = Some(rtc) };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
use defmt::Format;
|
||||||
use stm32_metapac::rtc::vals::{Init, Osel, Pol};
|
use stm32_metapac::rtc::vals::{Init, Osel, Pol};
|
||||||
|
|
||||||
use super::{sealed, RtcClockSource, RtcConfig};
|
use super::{sealed, RtcClockSource, RtcConfig};
|
||||||
@ -73,7 +74,7 @@ impl core::ops::Sub for RtcInstant {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy, Debug, Format)]
|
||||||
pub(crate) enum WakeupPrescaler {
|
pub(crate) enum WakeupPrescaler {
|
||||||
Div2,
|
Div2,
|
||||||
Div4,
|
Div4,
|
||||||
@ -185,17 +186,26 @@ impl super::Rtc {
|
|||||||
);
|
);
|
||||||
|
|
||||||
trace!("set wakeup timer for {} ms", duration.as_millis());
|
trace!("set wakeup timer for {} ms", duration.as_millis());
|
||||||
|
trace!("set wakeup timer for {} ticks with pre {}", rtc_ticks, prescaler);
|
||||||
|
|
||||||
RTC::regs().wpr().write(|w| w.set_key(0xca));
|
self.write(false, |regs| {
|
||||||
RTC::regs().wpr().write(|w| w.set_key(0x53));
|
regs.cr().modify(|w| w.set_wutie(true));
|
||||||
|
|
||||||
RTC::regs().wutr().modify(|w| w.set_wut(rtc_ticks));
|
trace!("clear wute");
|
||||||
|
regs.cr().modify(|w| w.set_wute(false));
|
||||||
|
regs.isr().modify(|w| w.set_wutf(false));
|
||||||
|
|
||||||
RTC::regs().cr().modify(|w| {
|
trace!("wait for wutwf...");
|
||||||
|
while !regs.isr().read().wutwf() {}
|
||||||
|
trace!("wait for wutwf...done");
|
||||||
|
|
||||||
|
regs.cr().modify(|w| {
|
||||||
w.set_wucksel(prescaler.into());
|
w.set_wucksel(prescaler.into());
|
||||||
|
|
||||||
w.set_wutie(true);
|
w.set_wutie(true);
|
||||||
w.set_wute(true);
|
});
|
||||||
|
|
||||||
|
regs.cr().modify(|w| w.set_wute(true));
|
||||||
});
|
});
|
||||||
|
|
||||||
if !RTC::regs().cr().read().wute() {
|
if !RTC::regs().cr().read().wute() {
|
||||||
@ -204,6 +214,12 @@ impl super::Rtc {
|
|||||||
trace!("wakeup timer enabled");
|
trace!("wakeup timer enabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !RTC::regs().cr().read().wutie() {
|
||||||
|
trace!("wakeup timer interrupt not enabled");
|
||||||
|
} else {
|
||||||
|
trace!("wakeup timer interrupt enabled");
|
||||||
|
}
|
||||||
|
|
||||||
RtcInstant::now()
|
RtcInstant::now()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -216,19 +232,11 @@ impl super::Rtc {
|
|||||||
pub(crate) fn stop_wakeup_alarm(&self) -> RtcInstant {
|
pub(crate) fn stop_wakeup_alarm(&self) -> RtcInstant {
|
||||||
trace!("disable wakeup timer...");
|
trace!("disable wakeup timer...");
|
||||||
|
|
||||||
RTC::regs().cr().modify(|w| {
|
self.write(false, |regs| {
|
||||||
w.set_wute(false);
|
regs.cr().modify(|w| w.set_wute(false));
|
||||||
|
regs.isr().modify(|w| w.set_wutf(false));
|
||||||
});
|
});
|
||||||
|
|
||||||
trace!("wait for wakeup timer stop...");
|
|
||||||
|
|
||||||
// Wait for the wakeup timer to stop
|
|
||||||
// while !RTC::regs().isr().read().wutf() {}
|
|
||||||
//
|
|
||||||
// RTC::regs().isr().modify(|w| w.set_wutf(false));
|
|
||||||
|
|
||||||
trace!("wait for wakeup timer stop...done");
|
|
||||||
|
|
||||||
RtcInstant::now()
|
RtcInstant::now()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -380,7 +388,7 @@ impl super::Rtc {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn write<F, R>(&mut self, init_mode: bool, f: F) -> R
|
pub(super) fn write<F, R>(&self, init_mode: bool, f: F) -> R
|
||||||
where
|
where
|
||||||
F: FnOnce(&crate::pac::rtc::Rtc) -> R,
|
F: FnOnce(&crate::pac::rtc::Rtc) -> R,
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user