Merge pull request #3556 from chrenderle/low-power

low-power: add support for stm32u0
This commit is contained in:
Dario Nieuwenhuis 2024-11-25 14:00:28 +00:00 committed by GitHub
commit 37111a891c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 38 additions and 13 deletions

View File

@ -70,6 +70,7 @@ use crate::rtc::Rtc;
static mut EXECUTOR: Option<Executor> = None;
#[cfg(not(stm32u0))]
foreach_interrupt! {
(RTC, rtc, $block:ident, WKUP, $irq:ident) => {
#[interrupt]
@ -80,6 +81,17 @@ foreach_interrupt! {
};
}
#[cfg(stm32u0)]
foreach_interrupt! {
(RTC, rtc, $block:ident, TAMP, $irq:ident) => {
#[interrupt]
#[allow(non_snake_case)]
unsafe fn $irq() {
EXECUTOR.as_mut().unwrap().on_wakeup_irq();
}
};
}
#[allow(dead_code)]
pub(crate) unsafe fn on_wakeup_irq() {
EXECUTOR.as_mut().unwrap().on_wakeup_irq();
@ -112,10 +124,10 @@ pub enum StopMode {
Stop2,
}
#[cfg(any(stm32l4, stm32l5, stm32u5))]
#[cfg(any(stm32l4, stm32l5, stm32u5, stm32u0))]
use stm32_metapac::pwr::vals::Lpms;
#[cfg(any(stm32l4, stm32l5, stm32u5))]
#[cfg(any(stm32l4, stm32l5, stm32u5, stm32u0))]
impl Into<Lpms> for StopMode {
fn into(self) -> Lpms {
match self {
@ -186,7 +198,7 @@ impl Executor {
#[allow(unused_variables)]
fn configure_stop(&mut self, stop_mode: StopMode) {
#[cfg(any(stm32l4, stm32l5, stm32u5))]
#[cfg(any(stm32l4, stm32l5, stm32u5, stm32u0))]
crate::pac::PWR.cr1().modify(|m| m.set_lpms(stop_mode.into()));
#[cfg(stm32h5)]
crate::pac::PWR.pmcr().modify(|v| {

View File

@ -159,6 +159,9 @@ impl LsConfig {
} else {
None
};
#[cfg(rcc_u0)]
let lse_sysen = Some(lse_en);
_ = lse_drv; // not all chips have it.
// Disable backup domain write protection
@ -199,7 +202,7 @@ impl LsConfig {
}
ok &= reg.lseon() == lse_en;
ok &= reg.lsebyp() == lse_byp;
#[cfg(any(rcc_l5, rcc_u5, rcc_wle, rcc_wl5, rcc_wba))]
#[cfg(any(rcc_l5, rcc_u5, rcc_wle, rcc_wl5, rcc_wba, rcc_u0))]
if let Some(lse_sysen) = lse_sysen {
ok &= reg.lsesysen() == lse_sysen;
}
@ -251,7 +254,7 @@ impl LsConfig {
while !bdcr().read().lserdy() {}
#[cfg(any(rcc_l5, rcc_u5, rcc_wle, rcc_wl5, rcc_wba))]
#[cfg(any(rcc_l5, rcc_u5, rcc_wle, rcc_wl5, rcc_wba, rcc_u0))]
if let Some(lse_sysen) = lse_sysen {
bdcr().modify(|w| {
w.set_lsesysen(lse_sysen);

View File

@ -65,7 +65,9 @@ pub(crate) enum WakeupPrescaler {
Div16 = 16,
}
#[cfg(any(stm32f4, stm32l0, stm32g4, stm32l4, stm32l5, stm32wb, stm32h5, stm32g0, stm32u5))]
#[cfg(any(
stm32f4, stm32l0, stm32g4, stm32l4, stm32l5, stm32wb, stm32h5, stm32g0, stm32u5, stm32u0
))]
impl From<WakeupPrescaler> for crate::pac::rtc::vals::Wucksel {
fn from(val: WakeupPrescaler) -> Self {
use crate::pac::rtc::vals::Wucksel;
@ -79,7 +81,9 @@ impl From<WakeupPrescaler> for crate::pac::rtc::vals::Wucksel {
}
}
#[cfg(any(stm32f4, stm32l0, stm32g4, stm32l4, stm32l5, stm32wb, stm32h5, stm32g0, stm32u5))]
#[cfg(any(
stm32f4, stm32l0, stm32g4, stm32l4, stm32l5, stm32wb, stm32h5, stm32g0, stm32u5, stm32u0
))]
impl From<crate::pac::rtc::vals::Wucksel> for WakeupPrescaler {
fn from(val: crate::pac::rtc::vals::Wucksel) -> Self {
use crate::pac::rtc::vals::Wucksel;
@ -223,7 +227,7 @@ impl Rtc {
<RTC as crate::rtc::SealedInstance>::WakeupInterrupt::unpend();
unsafe { <RTC as crate::rtc::SealedInstance>::WakeupInterrupt::enable() };
#[cfg(not(stm32u5))]
#[cfg(not(any(stm32u5, stm32u0)))]
{
use crate::pac::EXTI;
EXTI.rtsr(0).modify(|w| w.set_line(RTC::EXTI_WAKEUP_LINE, true));

View File

@ -285,7 +285,7 @@ trait SealedInstance {
const BACKUP_REGISTER_COUNT: usize;
#[cfg(feature = "low-power")]
#[cfg(not(stm32u5))]
#[cfg(not(any(stm32u5, stm32u0)))]
const EXTI_WAKEUP_LINE: usize;
#[cfg(feature = "low-power")]

View File

@ -133,14 +133,20 @@ impl SealedInstance for crate::peripherals::RTC {
cfg_if::cfg_if!(
if #[cfg(stm32g4)] {
const EXTI_WAKEUP_LINE: usize = 20;
type WakeupInterrupt = crate::interrupt::typelevel::RTC_WKUP;
} else if #[cfg(stm32g0)] {
const EXTI_WAKEUP_LINE: usize = 19;
type WakeupInterrupt = crate::interrupt::typelevel::RTC_TAMP;
} else if #[cfg(any(stm32l5, stm32h5))] {
const EXTI_WAKEUP_LINE: usize = 17;
type WakeupInterrupt = crate::interrupt::typelevel::RTC;
} else if #[cfg(stm32u5)] {
}
);
#[cfg(feature = "low-power")]
cfg_if::cfg_if!(
if #[cfg(stm32g4)] {
type WakeupInterrupt = crate::interrupt::typelevel::RTC_WKUP;
} else if #[cfg(any(stm32g0, stm32u0))] {
type WakeupInterrupt = crate::interrupt::typelevel::RTC_TAMP;
} else if #[cfg(any(stm32l5, stm32h5, stm32u5))] {
type WakeupInterrupt = crate::interrupt::typelevel::RTC;
}
);