diff --git a/embassy-stm32/Cargo.toml b/embassy-stm32/Cargo.toml index 7e11e263..01a9d482 100644 --- a/embassy-stm32/Cargo.toml +++ b/embassy-stm32/Cargo.toml @@ -58,7 +58,7 @@ rand_core = "0.6.3" sdio-host = "0.5.0" embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true } critical-section = "1.1" -stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-8381654ade324de3945c3c755d359686e957e99b" } +stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-1374ed622714ef4702826699ca21cc1f741f4133" } vcell = "0.1.3" bxcan = "0.7.0" nb = "1.0.0" @@ -76,7 +76,7 @@ critical-section = { version = "1.1", features = ["std"] } [build-dependencies] proc-macro2 = "1.0.36" quote = "1.0.15" -stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-8381654ade324de3945c3c755d359686e957e99b", default-features = false, features = ["metadata"]} +stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-1374ed622714ef4702826699ca21cc1f741f4133", default-features = false, features = ["metadata"]} [features] diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs index 1307656a..6b41cd39 100644 --- a/embassy-stm32/build.rs +++ b/embassy-stm32/build.rs @@ -6,7 +6,7 @@ use std::{env, fs}; use proc_macro2::{Ident, TokenStream}; use quote::{format_ident, quote}; use stm32_metapac::metadata::ir::{BlockItemInner, Enum, FieldSet}; -use stm32_metapac::metadata::{MemoryRegionKind, PeripheralRccRegister, METADATA}; +use stm32_metapac::metadata::{MemoryRegionKind, PeripheralRccRegister, StopMode, METADATA}; fn main() { let target = env::var("TARGET").unwrap(); @@ -557,18 +557,18 @@ fn main() { }; /* - If LP and non-LP peripherals share the same RCC enable bit, then a refcount leak will result. + A refcount leak can result if the same field is shared by peripherals with different stop modes - This should be checked in stm32-data-gen. + This condition should be checked in stm32-data */ - let stop_refcount = if p.name.starts_with("LP") { - quote! { REFCOUNT_STOP2 } - } else { - quote! { REFCOUNT_STOP1 } + let stop_refcount = match rcc.stop_mode { + StopMode::Standby => None, + StopMode::Stop2 => Some(quote! { REFCOUNT_STOP2 }), + StopMode::Stop1 => Some(quote! { REFCOUNT_STOP1 }), }; - let (incr_stop_refcount, decr_stop_refcount) = if p.name != "RTC" { - ( + let (incr_stop_refcount, decr_stop_refcount) = match stop_refcount { + Some(stop_refcount) => ( quote! { #[cfg(feature = "low-power")] unsafe { crate::rcc::#stop_refcount += 1 }; @@ -577,9 +577,8 @@ fn main() { #[cfg(feature = "low-power")] unsafe { crate::rcc::#stop_refcount -= 1 }; }, - ) - } else { - (quote! {}, quote! {}) + ), + None => (TokenStream::new(), TokenStream::new()), }; g.extend(quote! {