aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreverdrone <[email protected]>2025-09-20 12:39:15 +0200
committereverdrone <[email protected]>2025-09-20 12:39:15 +0200
commitc4b0e3a2bfc2c4b60f70f862a893b90b91954baa (patch)
tree1881fea51ca1ed1c792d3ed0a9f66df2c870bf63
parentc6371d7a9b828297eae43e61440f4cc0af7a3979 (diff)
Add feature, disable flash for N6 family
-rw-r--r--embassy-stm32/Cargo.toml10
-rw-r--r--embassy-stm32/build.rs226
-rw-r--r--embassy-stm32/src/lib.rs1
3 files changed, 127 insertions, 110 deletions
diff --git a/embassy-stm32/Cargo.toml b/embassy-stm32/Cargo.toml
index 6cd8ed262..fb4bc70b7 100644
--- a/embassy-stm32/Cargo.toml
+++ b/embassy-stm32/Cargo.toml
@@ -95,6 +95,7 @@ build = [
95 {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "low-power", "stm32wba65ri", "time", "time-driver-any"]}, 95 {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "low-power", "stm32wba65ri", "time", "time-driver-any"]},
96 {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "stm32u5f9zj", "time", "time-driver-any"]}, 96 {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "stm32u5f9zj", "time", "time-driver-any"]},
97 {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "stm32u5g9nj", "time", "time-driver-any"]}, 97 {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "stm32u5g9nj", "time", "time-driver-any"]},
98 {target = "thumbv8m.main-none-eabihf", features = ["defmt", "exti", "stm32n657x0", "time", "time-driver-any"]},
98 {target = "thumbv7em-none-eabi", features = ["defmt", "exti", "stm32wb35ce", "time", "time-driver-any"]}, 99 {target = "thumbv7em-none-eabi", features = ["defmt", "exti", "stm32wb35ce", "time", "time-driver-any"]},
99 {target = "thumbv7em-none-eabi", features = ["defmt", "exti", "low-power", "stm32wb55rg", "time", "time-driver-any"]}, 100 {target = "thumbv7em-none-eabi", features = ["defmt", "exti", "low-power", "stm32wb55rg", "time", "time-driver-any"]},
100 {target = "thumbv6m-none-eabi", features = ["defmt", "exti", "stm32u031r8", "time", "time-driver-any"]}, 101 {target = "thumbv6m-none-eabi", features = ["defmt", "exti", "stm32u031r8", "time", "time-driver-any"]},
@@ -173,8 +174,8 @@ cortex-m = "0.7.6"
173futures-util = { version = "0.3.30", default-features = false } 174futures-util = { version = "0.3.30", default-features = false }
174sdio-host = "0.9.0" 175sdio-host = "0.9.0"
175critical-section = "1.1" 176critical-section = "1.1"
176#stm32-metapac = { version = "18" } 177stm32-metapac = { path = "../../stm32-data/build/stm32-metapac" }
177stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-3cf72eac610259fd78ef16f1c63be69a144d75f7" } 178# stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-3cf72eac610259fd78ef16f1c63be69a144d75f7" }
178 179
179vcell = "0.1.3" 180vcell = "0.1.3"
180nb = "1.0.0" 181nb = "1.0.0"
@@ -203,8 +204,8 @@ proptest-state-machine = "0.3.0"
203proc-macro2 = "1.0.36" 204proc-macro2 = "1.0.36"
204quote = "1.0.15" 205quote = "1.0.15"
205 206
206#stm32-metapac = { version = "18", default-features = false, features = ["metadata"]} 207stm32-metapac = { path = "../../stm32-data/build/stm32-metapac", default-features = false, features = ["metadata"]}
207stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-3cf72eac610259fd78ef16f1c63be69a144d75f7", default-features = false, features = ["metadata"] } 208# stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-3cf72eac610259fd78ef16f1c63be69a144d75f7", default-features = false, features = ["metadata"] }
208 209
209[features] 210[features]
210default = ["rt"] 211default = ["rt"]
@@ -1629,6 +1630,7 @@ stm32l562qe = [ "stm32-metapac/stm32l562qe" ]
1629stm32l562re = [ "stm32-metapac/stm32l562re" ] 1630stm32l562re = [ "stm32-metapac/stm32l562re" ]
1630stm32l562ve = [ "stm32-metapac/stm32l562ve" ] 1631stm32l562ve = [ "stm32-metapac/stm32l562ve" ]
1631stm32l562ze = [ "stm32-metapac/stm32l562ze" ] 1632stm32l562ze = [ "stm32-metapac/stm32l562ze" ]
1633stm32n657x0 = [ "stm32-metapac/stm32n657x0" ]
1632stm32u031c6 = [ "stm32-metapac/stm32u031c6" ] 1634stm32u031c6 = [ "stm32-metapac/stm32u031c6" ]
1633stm32u031c8 = [ "stm32-metapac/stm32u031c8" ] 1635stm32u031c8 = [ "stm32-metapac/stm32u031c8" ]
1634stm32u031f4 = [ "stm32-metapac/stm32u031f4" ] 1636stm32u031f4 = [ "stm32-metapac/stm32u031f4" ]
diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs
index b5f1261fe..861f3fcee 100644
--- a/embassy-stm32/build.rs
+++ b/embassy-stm32/build.rs
@@ -352,101 +352,108 @@ fn main() {
352 352
353 // ======== 353 // ========
354 // Generate FLASH regions 354 // Generate FLASH regions
355 let mut flash_regions = TokenStream::new(); 355 cfgs.declare("flash");
356 let flash_memory_regions: Vec<_> = memory 356 let mut has_flash = false;
357 .iter() 357 if !chip_name.starts_with("stm32n6") {
358 .filter(|x| x.kind == MemoryRegionKind::Flash && x.settings.is_some()) 358 cfgs.enable("flash");
359 .collect(); 359 has_flash = true;
360 for region in flash_memory_regions.iter() { 360
361 let region_name = format_ident!("{}", get_flash_region_name(region.name)); 361 let mut flash_regions = TokenStream::new();
362 let bank_variant = format_ident!( 362 let flash_memory_regions: Vec<_> = memory
363 "{}", 363 .iter()
364 if region.name.starts_with("BANK_1") { 364 .filter(|x| x.kind == MemoryRegionKind::Flash && x.settings.is_some())
365 "Bank1" 365 .collect();
366 } else if region.name.starts_with("BANK_2") { 366 for region in flash_memory_regions.iter() {
367 "Bank2" 367 let region_name = format_ident!("{}", get_flash_region_name(region.name));
368 } else if region.name == "OTP" { 368 let bank_variant = format_ident!(
369 "Otp" 369 "{}",
370 } else { 370 if region.name.starts_with("BANK_1") {
371 continue; 371 "Bank1"
372 } 372 } else if region.name.starts_with("BANK_2") {
373 ); 373 "Bank2"
374 let base = region.address; 374 } else if region.name == "OTP" {
375 let size = region.size; 375 "Otp"
376 let settings = region.settings.as_ref().unwrap(); 376 } else {
377 let erase_size = settings.erase_size; 377 continue;
378 let write_size = settings.write_size; 378 }
379 let erase_value = settings.erase_value; 379 );
380 380 let base = region.address;
381 flash_regions.extend(quote! { 381 let size = region.size;
382 pub const #region_name: crate::flash::FlashRegion = crate::flash::FlashRegion { 382 let settings = region.settings.as_ref().unwrap();
383 bank: crate::flash::FlashBank::#bank_variant, 383 let erase_size = settings.erase_size;
384 base: #base, 384 let write_size = settings.write_size;
385 size: #size, 385 let erase_value = settings.erase_value;
386 erase_size: #erase_size, 386
387 write_size: #write_size, 387 flash_regions.extend(quote! {
388 erase_value: #erase_value, 388 pub const #region_name: crate::flash::FlashRegion = crate::flash::FlashRegion {
389 _ensure_internal: (), 389 bank: crate::flash::FlashBank::#bank_variant,
390 }; 390 base: #base,
391 }); 391 size: #size,
392 erase_size: #erase_size,
393 write_size: #write_size,
394 erase_value: #erase_value,
395 _ensure_internal: (),
396 };
397 });
392 398
393 let region_type = format_ident!("{}", get_flash_region_type_name(region.name)); 399 let region_type = format_ident!("{}", get_flash_region_type_name(region.name));
394 flash_regions.extend(quote! { 400 flash_regions.extend(quote! {
395 #[cfg(flash)] 401 #[cfg(flash)]
396 pub struct #region_type<'d, MODE = crate::flash::Async>(pub &'static crate::flash::FlashRegion, pub(crate) embassy_hal_internal::Peri<'d, crate::peripherals::FLASH>, pub(crate) core::marker::PhantomData<MODE>); 402 pub struct #region_type<'d, MODE = crate::flash::Async>(pub &'static crate::flash::FlashRegion, pub(crate) embassy_hal_internal::Peri<'d, crate::peripherals::FLASH>, pub(crate) core::marker::PhantomData<MODE>);
397 }); 403 });
398 } 404 }
399 405
400 let (fields, (inits, region_names)): (Vec<TokenStream>, (Vec<TokenStream>, Vec<Ident>)) = flash_memory_regions 406 let (fields, (inits, region_names)): (Vec<TokenStream>, (Vec<TokenStream>, Vec<Ident>)) = flash_memory_regions
401 .iter() 407 .iter()
402 .map(|f| { 408 .map(|f| {
403 let region_name = get_flash_region_name(f.name); 409 let region_name = get_flash_region_name(f.name);
404 let field_name = format_ident!("{}", region_name.to_lowercase()); 410 let field_name = format_ident!("{}", region_name.to_lowercase());
405 let field_type = format_ident!("{}", get_flash_region_type_name(f.name)); 411 let field_type = format_ident!("{}", get_flash_region_type_name(f.name));
406 let field = quote! { 412 let field = quote! {
407 pub #field_name: #field_type<'d, MODE> 413 pub #field_name: #field_type<'d, MODE>
408 }; 414 };
409 let region_name = format_ident!("{}", region_name); 415 let region_name = format_ident!("{}", region_name);
410 let init = quote! { 416 let init = quote! {
411 #field_name: #field_type(&#region_name, unsafe { p.clone_unchecked()}, core::marker::PhantomData) 417 #field_name: #field_type(&#region_name, unsafe { p.clone_unchecked()}, core::marker::PhantomData)
412 }; 418 };
413 419
414 (field, (init, region_name)) 420 (field, (init, region_name))
415 }) 421 })
416 .unzip(); 422 .unzip();
417
418 let regions_len = flash_memory_regions.len();
419 flash_regions.extend(quote! {
420 #[cfg(flash)]
421 pub struct FlashLayout<'d, MODE = crate::flash::Async> {
422 #(#fields),*,
423 _mode: core::marker::PhantomData<MODE>,
424 }
425 423
426 #[cfg(flash)] 424 let regions_len = flash_memory_regions.len();
427 impl<'d, MODE> FlashLayout<'d, MODE> { 425 flash_regions.extend(quote! {
428 pub(crate) fn new(p: embassy_hal_internal::Peri<'d, crate::peripherals::FLASH>) -> Self { 426 #[cfg(flash)]
429 Self { 427 pub struct FlashLayout<'d, MODE = crate::flash::Async> {
430 #(#inits),*, 428 #(#fields),*,
431 _mode: core::marker::PhantomData, 429 _mode: core::marker::PhantomData<MODE>,
430 }
431
432 #[cfg(flash)]
433 impl<'d, MODE> FlashLayout<'d, MODE> {
434 pub(crate) fn new(p: embassy_hal_internal::Peri<'d, crate::peripherals::FLASH>) -> Self {
435 Self {
436 #(#inits),*,
437 _mode: core::marker::PhantomData,
438 }
432 } 439 }
433 } 440 }
434 }
435 441
436 pub const FLASH_REGIONS: [&crate::flash::FlashRegion; #regions_len] = [ 442 pub const FLASH_REGIONS: [&crate::flash::FlashRegion; #regions_len] = [
437 #(&#region_names),* 443 #(&#region_names),*
438 ]; 444 ];
439 }); 445 });
440 446
441 let max_erase_size = flash_memory_regions 447 let max_erase_size = flash_memory_regions
442 .iter() 448 .iter()
443 .map(|region| region.settings.as_ref().unwrap().erase_size) 449 .map(|region| region.settings.as_ref().unwrap().erase_size)
444 .max() 450 .max()
445 .unwrap(); 451 .unwrap();
446 452
447 g.extend(quote! { pub const MAX_ERASE_SIZE: usize = #max_erase_size as usize; }); 453 g.extend(quote! { pub const MAX_ERASE_SIZE: usize = #max_erase_size as usize; });
448 454
449 g.extend(quote! { pub mod flash_regions { #flash_regions } }); 455 g.extend(quote! { pub mod flash_regions { #flash_regions } });
456 }
450 457
451 // ======== 458 // ========
452 // Extract the rcc registers 459 // Extract the rcc registers
@@ -1844,7 +1851,12 @@ fn main() {
1844 if r.kind == "dma" || r.kind == "bdma" || r.kind == "gpdma" || r.kind == "lpdma" { 1851 if r.kind == "dma" || r.kind == "bdma" || r.kind == "gpdma" || r.kind == "lpdma" {
1845 for irq in p.interrupts { 1852 for irq in p.interrupts {
1846 let ch_name = format!("{}_{}", p.name, irq.signal); 1853 let ch_name = format!("{}_{}", p.name, irq.signal);
1847 let ch = METADATA.dma_channels.iter().find(|c| c.name == ch_name).unwrap(); 1854 let ch = METADATA.dma_channels.iter().find(|c| c.name == ch_name);
1855
1856 if ch.is_none() {
1857 continue;
1858 }
1859 let ch = ch.unwrap();
1848 1860
1849 // Some H7 chips have BDMA1 hardcoded for DFSDM, ie no DMAMUX. It's unsupported, skip it. 1861 // Some H7 chips have BDMA1 hardcoded for DFSDM, ie no DMAMUX. It's unsupported, skip it.
1850 if has_dmamux && ch.dmamux.is_none() { 1862 if has_dmamux && ch.dmamux.is_none() {
@@ -1985,31 +1997,33 @@ fn main() {
1985 // ======== 1997 // ========
1986 // Generate flash constants 1998 // Generate flash constants
1987 1999
1988 let flash_regions: Vec<&MemoryRegion> = memory 2000 if has_flash {
1989 .iter() 2001 let flash_regions: Vec<&MemoryRegion> = memory
1990 .filter(|x| x.kind == MemoryRegionKind::Flash && x.name.starts_with("BANK_")) 2002 .iter()
1991 .collect(); 2003 .filter(|x| x.kind == MemoryRegionKind::Flash && x.name.starts_with("BANK_"))
1992 let first_flash = flash_regions.first().unwrap(); 2004 .collect();
1993 let total_flash_size = flash_regions 2005 let first_flash = flash_regions.first().unwrap();
1994 .iter() 2006 let total_flash_size = flash_regions
1995 .map(|x| x.size) 2007 .iter()
1996 .reduce(|acc, item| acc + item) 2008 .map(|x| x.size)
1997 .unwrap(); 2009 .reduce(|acc, item| acc + item)
1998 let write_sizes: HashSet<_> = flash_regions 2010 .unwrap();
1999 .iter() 2011 let write_sizes: HashSet<_> = flash_regions
2000 .map(|r| r.settings.as_ref().unwrap().write_size) 2012 .iter()
2001 .collect(); 2013 .map(|r| r.settings.as_ref().unwrap().write_size)
2002 assert_eq!(1, write_sizes.len()); 2014 .collect();
2015 assert_eq!(1, write_sizes.len());
2003 2016
2004 let flash_base = first_flash.address as usize; 2017 let flash_base = first_flash.address as usize;
2005 let total_flash_size = total_flash_size as usize; 2018 let total_flash_size = total_flash_size as usize;
2006 let write_size = (*write_sizes.iter().next().unwrap()) as usize; 2019 let write_size = (*write_sizes.iter().next().unwrap()) as usize;
2007 2020
2008 g.extend(quote!( 2021 g.extend(quote!(
2009 pub const FLASH_BASE: usize = #flash_base; 2022 pub const FLASH_BASE: usize = #flash_base;
2010 pub const FLASH_SIZE: usize = #total_flash_size; 2023 pub const FLASH_SIZE: usize = #total_flash_size;
2011 pub const WRITE_SIZE: usize = #write_size; 2024 pub const WRITE_SIZE: usize = #write_size;
2012 )); 2025 ));
2026 }
2013 2027
2014 // ======== 2028 // ========
2015 // Generate EEPROM constants 2029 // Generate EEPROM constants
diff --git a/embassy-stm32/src/lib.rs b/embassy-stm32/src/lib.rs
index 7e0f7884e..292586ee4 100644
--- a/embassy-stm32/src/lib.rs
+++ b/embassy-stm32/src/lib.rs
@@ -74,6 +74,7 @@ pub mod dts;
74pub mod eth; 74pub mod eth;
75#[cfg(feature = "exti")] 75#[cfg(feature = "exti")]
76pub mod exti; 76pub mod exti;
77#[cfg(flash)]
77pub mod flash; 78pub mod flash;
78#[cfg(fmc)] 79#[cfg(fmc)]
79pub mod fmc; 80pub mod fmc;