aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandros Liarokapis <[email protected]>2024-08-17 00:26:33 +0300
committerAlexandros Liarokapis <[email protected]>2024-08-17 16:54:41 +0300
commit2b7e76efe9916170cba69da964d53c19a246ae45 (patch)
tree10f1b8973e80af44dd81a65aad4f1e7456a3ca30
parent6d9ed4c0807c977aa6d3c852360d52128f8c459a (diff)
Fix dma nvic issues on dual core lines
This commit addresses #3256 by disabling dma NVIC interrupt enablement at startup. Instead, per-channel NVIC interrupt enablement is now done with the rest of the dma channel configuration. This ensures that each core will only handle the interrupts of the DMA channels that it uses.
-rw-r--r--embassy-stm32/build.rs70
-rw-r--r--embassy-stm32/src/dma/dma_bdma.rs9
-rw-r--r--embassy-stm32/src/dma/gpdma.rs9
-rw-r--r--embassy-stm32/src/lib.rs20
-rw-r--r--embassy-stm32/src/rcc/bd.rs2
-rw-r--r--embassy-stm32/src/rcc/c0.rs1
-rw-r--r--embassy-stm32/src/rcc/f013.rs1
-rw-r--r--embassy-stm32/src/rcc/f247.rs2
-rw-r--r--embassy-stm32/src/rcc/g0.rs2
-rw-r--r--embassy-stm32/src/rcc/g4.rs2
-rw-r--r--embassy-stm32/src/rcc/h.rs3
-rw-r--r--embassy-stm32/src/rcc/l.rs1
-rw-r--r--embassy-stm32/src/rcc/u5.rs1
-rw-r--r--embassy-stm32/src/rcc/wba.rs1
-rw-r--r--examples/boot/application/stm32wl/memory.x6
-rw-r--r--examples/stm32wl/memory.x6
16 files changed, 108 insertions, 28 deletions
diff --git a/embassy-stm32/build.rs b/embassy-stm32/build.rs
index d8a7ea0e6..1984a1420 100644
--- a/embassy-stm32/build.rs
+++ b/embassy-stm32/build.rs
@@ -1494,6 +1494,36 @@ fn main() {
1494 .flat_map(|p| &p.registers) 1494 .flat_map(|p| &p.registers)
1495 .any(|p| p.kind == "dmamux"); 1495 .any(|p| p.kind == "dmamux");
1496 1496
1497 let mut dma_irqs: BTreeMap<&str, Vec<String>> = BTreeMap::new();
1498
1499 for p in METADATA.peripherals {
1500 if let Some(r) = &p.registers {
1501 if r.kind == "dma" || r.kind == "bdma" || r.kind == "gpdma" || r.kind == "lpdma" {
1502 for irq in p.interrupts {
1503 let ch_name = format!("{}_{}", p.name, irq.signal);
1504 let ch = METADATA.dma_channels.iter().find(|c| c.name == ch_name).unwrap();
1505
1506 // Some H7 chips have BDMA1 hardcoded for DFSDM, ie no DMAMUX. It's unsupported, skip it.
1507 if has_dmamux && ch.dmamux.is_none() {
1508 continue;
1509 }
1510
1511 dma_irqs.entry(irq.interrupt).or_default().push(ch_name);
1512 }
1513 }
1514 }
1515 }
1516
1517 #[cfg(feature = "_dual-core")]
1518 let mut dma_ch_to_irq: BTreeMap<&str, Vec<String>> = BTreeMap::new();
1519
1520 #[cfg(feature = "_dual-core")]
1521 for (irq, channels) in &dma_irqs {
1522 for channel in channels {
1523 dma_ch_to_irq.entry(channel).or_default().push(irq.to_string());
1524 }
1525 }
1526
1497 for (ch_idx, ch) in METADATA.dma_channels.iter().enumerate() { 1527 for (ch_idx, ch) in METADATA.dma_channels.iter().enumerate() {
1498 // Some H7 chips have BDMA1 hardcoded for DFSDM, ie no DMAMUX. It's unsupported, skip it. 1528 // Some H7 chips have BDMA1 hardcoded for DFSDM, ie no DMAMUX. It's unsupported, skip it.
1499 if has_dmamux && ch.dmamux.is_none() { 1529 if has_dmamux && ch.dmamux.is_none() {
@@ -1502,6 +1532,16 @@ fn main() {
1502 1532
1503 let name = format_ident!("{}", ch.name); 1533 let name = format_ident!("{}", ch.name);
1504 let idx = ch_idx as u8; 1534 let idx = ch_idx as u8;
1535 #[cfg(feature = "_dual-core")]
1536 let irq = {
1537 let irq_name = if let Some(x) = &dma_ch_to_irq.get(ch.name) {
1538 format_ident!("{}", x.get(0).unwrap())
1539 } else {
1540 panic!("failed to find dma interrupt")
1541 };
1542 quote!(crate::pac::Interrupt::#irq_name)
1543 };
1544
1505 g.extend(quote!(dma_channel_impl!(#name, #idx);)); 1545 g.extend(quote!(dma_channel_impl!(#name, #idx);));
1506 1546
1507 let dma = format_ident!("{}", ch.dma); 1547 let dma = format_ident!("{}", ch.dma);
@@ -1532,6 +1572,7 @@ fn main() {
1532 None => quote!(), 1572 None => quote!(),
1533 }; 1573 };
1534 1574
1575 #[cfg(not(feature = "_dual-core"))]
1535 dmas.extend(quote! { 1576 dmas.extend(quote! {
1536 crate::dma::ChannelInfo { 1577 crate::dma::ChannelInfo {
1537 dma: #dma_info, 1578 dma: #dma_info,
@@ -1539,31 +1580,20 @@ fn main() {
1539 #dmamux 1580 #dmamux
1540 }, 1581 },
1541 }); 1582 });
1583 #[cfg(feature = "_dual-core")]
1584 dmas.extend(quote! {
1585 crate::dma::ChannelInfo {
1586 dma: #dma_info,
1587 num: #ch_num,
1588 irq: #irq,
1589 #dmamux
1590 },
1591 });
1542 } 1592 }
1543 1593
1544 // ======== 1594 // ========
1545 // Generate DMA IRQs. 1595 // Generate DMA IRQs.
1546 1596
1547 let mut dma_irqs: BTreeMap<&str, Vec<String>> = BTreeMap::new();
1548
1549 for p in METADATA.peripherals {
1550 if let Some(r) = &p.registers {
1551 if r.kind == "dma" || r.kind == "bdma" || r.kind == "gpdma" {
1552 for irq in p.interrupts {
1553 let ch_name = format!("{}_{}", p.name, irq.signal);
1554 let ch = METADATA.dma_channels.iter().find(|c| c.name == ch_name).unwrap();
1555
1556 // Some H7 chips have BDMA1 hardcoded for DFSDM, ie no DMAMUX. It's unsupported, skip it.
1557 if has_dmamux && ch.dmamux.is_none() {
1558 continue;
1559 }
1560
1561 dma_irqs.entry(irq.interrupt).or_default().push(ch_name);
1562 }
1563 }
1564 }
1565 }
1566
1567 let dma_irqs: TokenStream = dma_irqs 1597 let dma_irqs: TokenStream = dma_irqs
1568 .iter() 1598 .iter()
1569 .map(|(irq, channels)| { 1599 .map(|(irq, channels)| {
diff --git a/embassy-stm32/src/dma/dma_bdma.rs b/embassy-stm32/src/dma/dma_bdma.rs
index 8a6aa53a0..8e2964f94 100644
--- a/embassy-stm32/src/dma/dma_bdma.rs
+++ b/embassy-stm32/src/dma/dma_bdma.rs
@@ -15,6 +15,8 @@ use crate::{interrupt, pac};
15pub(crate) struct ChannelInfo { 15pub(crate) struct ChannelInfo {
16 pub(crate) dma: DmaInfo, 16 pub(crate) dma: DmaInfo,
17 pub(crate) num: usize, 17 pub(crate) num: usize,
18 #[cfg(feature = "_dual-core")]
19 pub(crate) irq: pac::Interrupt,
18 #[cfg(dmamux)] 20 #[cfg(dmamux)]
19 pub(crate) dmamux: super::DmamuxInfo, 21 pub(crate) dmamux: super::DmamuxInfo,
20} 22}
@@ -259,10 +261,12 @@ pub(crate) unsafe fn init(
259 foreach_interrupt! { 261 foreach_interrupt! {
260 ($peri:ident, dma, $block:ident, $signal_name:ident, $irq:ident) => { 262 ($peri:ident, dma, $block:ident, $signal_name:ident, $irq:ident) => {
261 crate::interrupt::typelevel::$irq::set_priority_with_cs(cs, dma_priority); 263 crate::interrupt::typelevel::$irq::set_priority_with_cs(cs, dma_priority);
264 #[cfg(not(feature = "_dual-core"))]
262 crate::interrupt::typelevel::$irq::enable(); 265 crate::interrupt::typelevel::$irq::enable();
263 }; 266 };
264 ($peri:ident, bdma, $block:ident, $signal_name:ident, $irq:ident) => { 267 ($peri:ident, bdma, $block:ident, $signal_name:ident, $irq:ident) => {
265 crate::interrupt::typelevel::$irq::set_priority_with_cs(cs, bdma_priority); 268 crate::interrupt::typelevel::$irq::set_priority_with_cs(cs, bdma_priority);
269 #[cfg(not(feature = "_dual-core"))]
266 crate::interrupt::typelevel::$irq::enable(); 270 crate::interrupt::typelevel::$irq::enable();
267 }; 271 };
268 } 272 }
@@ -341,6 +345,11 @@ impl AnyChannel {
341 options: TransferOptions, 345 options: TransferOptions,
342 ) { 346 ) {
343 let info = self.info(); 347 let info = self.info();
348 #[cfg(feature = "_dual-core")]
349 {
350 use embassy_hal_internal::interrupt::InterruptExt as _;
351 info.irq.enable();
352 }
344 353
345 #[cfg(dmamux)] 354 #[cfg(dmamux)]
346 super::dmamux::configure_dmamux(&info.dmamux, _request); 355 super::dmamux::configure_dmamux(&info.dmamux, _request);
diff --git a/embassy-stm32/src/dma/gpdma.rs b/embassy-stm32/src/dma/gpdma.rs
index 13d5d15be..f9d66ca86 100644
--- a/embassy-stm32/src/dma/gpdma.rs
+++ b/embassy-stm32/src/dma/gpdma.rs
@@ -18,6 +18,8 @@ use crate::pac::gpdma::vals;
18pub(crate) struct ChannelInfo { 18pub(crate) struct ChannelInfo {
19 pub(crate) dma: pac::gpdma::Gpdma, 19 pub(crate) dma: pac::gpdma::Gpdma,
20 pub(crate) num: usize, 20 pub(crate) num: usize,
21 #[cfg(feature = "_dual-core")]
22 pub(crate) irq: pac::Interrupt,
21} 23}
22 24
23/// GPDMA transfer options. 25/// GPDMA transfer options.
@@ -57,6 +59,7 @@ pub(crate) unsafe fn init(cs: critical_section::CriticalSection, irq_priority: P
57 foreach_interrupt! { 59 foreach_interrupt! {
58 ($peri:ident, gpdma, $block:ident, $signal_name:ident, $irq:ident) => { 60 ($peri:ident, gpdma, $block:ident, $signal_name:ident, $irq:ident) => {
59 crate::interrupt::typelevel::$irq::set_priority_with_cs(cs, irq_priority); 61 crate::interrupt::typelevel::$irq::set_priority_with_cs(cs, irq_priority);
62 #[cfg(not(feature = "_dual-core"))]
60 crate::interrupt::typelevel::$irq::enable(); 63 crate::interrupt::typelevel::$irq::enable();
61 }; 64 };
62 } 65 }
@@ -67,6 +70,12 @@ impl AnyChannel {
67 /// Safety: Must be called with a matching set of parameters for a valid dma channel 70 /// Safety: Must be called with a matching set of parameters for a valid dma channel
68 pub(crate) unsafe fn on_irq(&self) { 71 pub(crate) unsafe fn on_irq(&self) {
69 let info = self.info(); 72 let info = self.info();
73 #[cfg(feature = "_dual-core")]
74 {
75 use embassy_hal_internal::interrupt::InterruptExt as _;
76 info.irq.enable();
77 }
78
70 let state = &STATE[self.id as usize]; 79 let state = &STATE[self.id as usize];
71 80
72 let ch = info.dma.ch(info.num); 81 let ch = info.dma.ch(info.num);
diff --git a/embassy-stm32/src/lib.rs b/embassy-stm32/src/lib.rs
index 12ebbae2d..98695e738 100644
--- a/embassy-stm32/src/lib.rs
+++ b/embassy-stm32/src/lib.rs
@@ -197,6 +197,7 @@ pub use crate::pac::NVIC_PRIO_BITS;
197 197
198/// `embassy-stm32` global configuration. 198/// `embassy-stm32` global configuration.
199#[non_exhaustive] 199#[non_exhaustive]
200#[derive(Clone, Copy)]
200pub struct Config { 201pub struct Config {
201 /// RCC config. 202 /// RCC config.
202 pub rcc: rcc::Config, 203 pub rcc: rcc::Config,
@@ -303,6 +304,7 @@ mod dual_core {
303 pub struct SharedData { 304 pub struct SharedData {
304 init_flag: AtomicUsize, 305 init_flag: AtomicUsize,
305 clocks: UnsafeCell<MaybeUninit<Clocks>>, 306 clocks: UnsafeCell<MaybeUninit<Clocks>>,
307 config: UnsafeCell<MaybeUninit<Config>>,
306 } 308 }
307 309
308 unsafe impl Sync for SharedData {} 310 unsafe impl Sync for SharedData {}
@@ -325,6 +327,8 @@ mod dual_core {
325 rcc::set_freqs_ptr(shared_data.clocks.get()); 327 rcc::set_freqs_ptr(shared_data.clocks.get());
326 let p = init_hw(config); 328 let p = init_hw(config);
327 329
330 unsafe { *shared_data.config.get() }.write(config);
331
328 shared_data.init_flag.store(INIT_DONE_FLAG, Ordering::SeqCst); 332 shared_data.init_flag.store(INIT_DONE_FLAG, Ordering::SeqCst);
329 333
330 p 334 p
@@ -372,9 +376,23 @@ mod dual_core {
372 fn init_secondary_hw(shared_data: &'static SharedData) -> Peripherals { 376 fn init_secondary_hw(shared_data: &'static SharedData) -> Peripherals {
373 rcc::set_freqs_ptr(shared_data.clocks.get()); 377 rcc::set_freqs_ptr(shared_data.clocks.get());
374 378
379 let config = unsafe { (*shared_data.config.get()).assume_init() };
380
375 // We use different timers on the different cores, so we have to still initialize one here 381 // We use different timers on the different cores, so we have to still initialize one here
376 #[cfg(feature = "_time-driver")]
377 critical_section::with(|cs| { 382 critical_section::with(|cs| {
383 unsafe {
384 dma::init(
385 cs,
386 #[cfg(bdma)]
387 config.bdma_interrupt_priority,
388 #[cfg(dma)]
389 config.dma_interrupt_priority,
390 #[cfg(gpdma)]
391 config.gpdma_interrupt_priority,
392 )
393 }
394
395 #[cfg(feature = "_time-driver")]
378 // must be after rcc init 396 // must be after rcc init
379 time_driver::init(cs); 397 time_driver::init(cs);
380 }); 398 });
diff --git a/embassy-stm32/src/rcc/bd.rs b/embassy-stm32/src/rcc/bd.rs
index 4e9c18594..9ccca8a2a 100644
--- a/embassy-stm32/src/rcc/bd.rs
+++ b/embassy-stm32/src/rcc/bd.rs
@@ -16,6 +16,7 @@ pub enum LseMode {
16 Bypass, 16 Bypass,
17} 17}
18 18
19#[derive(Clone, Copy)]
19pub struct LseConfig { 20pub struct LseConfig {
20 pub frequency: Hertz, 21 pub frequency: Hertz,
21 pub mode: LseMode, 22 pub mode: LseMode,
@@ -80,6 +81,7 @@ fn bdcr() -> Reg<Bdcr, RW> {
80 return crate::pac::RCC.csr1(); 81 return crate::pac::RCC.csr1();
81} 82}
82 83
84#[derive(Clone, Copy)]
83pub struct LsConfig { 85pub struct LsConfig {
84 pub rtc: RtcClockSource, 86 pub rtc: RtcClockSource,
85 pub lsi: bool, 87 pub lsi: bool,
diff --git a/embassy-stm32/src/rcc/c0.rs b/embassy-stm32/src/rcc/c0.rs
index 5adf37941..6712aedc4 100644
--- a/embassy-stm32/src/rcc/c0.rs
+++ b/embassy-stm32/src/rcc/c0.rs
@@ -37,6 +37,7 @@ pub struct Hsi {
37 37
38/// Clocks configutation 38/// Clocks configutation
39#[non_exhaustive] 39#[non_exhaustive]
40#[derive(Clone, Copy)]
40pub struct Config { 41pub struct Config {
41 /// HSI Configuration 42 /// HSI Configuration
42 pub hsi: Option<Hsi>, 43 pub hsi: Option<Hsi>,
diff --git a/embassy-stm32/src/rcc/f013.rs b/embassy-stm32/src/rcc/f013.rs
index 63dc27bdd..60577b213 100644
--- a/embassy-stm32/src/rcc/f013.rs
+++ b/embassy-stm32/src/rcc/f013.rs
@@ -76,6 +76,7 @@ pub enum HrtimClockSource {
76 76
77/// Clocks configutation 77/// Clocks configutation
78#[non_exhaustive] 78#[non_exhaustive]
79#[derive(Clone, Copy)]
79pub struct Config { 80pub struct Config {
80 pub hsi: bool, 81 pub hsi: bool,
81 pub hse: Option<Hse>, 82 pub hse: Option<Hse>,
diff --git a/embassy-stm32/src/rcc/f247.rs b/embassy-stm32/src/rcc/f247.rs
index 61f687d30..58056301a 100644
--- a/embassy-stm32/src/rcc/f247.rs
+++ b/embassy-stm32/src/rcc/f247.rs
@@ -63,6 +63,7 @@ pub struct Pll {
63/// Used to calculate flash waitstates. See 63/// Used to calculate flash waitstates. See
64/// RM0033 - Table 3. Number of wait states according to Cortex®-M3 clock frequency 64/// RM0033 - Table 3. Number of wait states according to Cortex®-M3 clock frequency
65#[cfg(stm32f2)] 65#[cfg(stm32f2)]
66#[derive(Clone, Copy)]
66pub enum VoltageScale { 67pub enum VoltageScale {
67 /// 2.7 to 3.6 V 68 /// 2.7 to 3.6 V
68 Range0, 69 Range0,
@@ -76,6 +77,7 @@ pub enum VoltageScale {
76 77
77/// Configuration of the core clocks 78/// Configuration of the core clocks
78#[non_exhaustive] 79#[non_exhaustive]
80#[derive(Clone, Copy)]
79pub struct Config { 81pub struct Config {
80 pub hsi: bool, 82 pub hsi: bool,
81 pub hse: Option<Hse>, 83 pub hse: Option<Hse>,
diff --git a/embassy-stm32/src/rcc/g0.rs b/embassy-stm32/src/rcc/g0.rs
index c2fa0ca39..c53c83b0e 100644
--- a/embassy-stm32/src/rcc/g0.rs
+++ b/embassy-stm32/src/rcc/g0.rs
@@ -33,6 +33,7 @@ pub struct Hse {
33/// Use this struct to configure the PLL source, input frequency, multiplication factor, and output 33/// Use this struct to configure the PLL source, input frequency, multiplication factor, and output
34/// dividers. Be sure to keep check the datasheet for your specific part for the appropriate 34/// dividers. Be sure to keep check the datasheet for your specific part for the appropriate
35/// frequency ranges for each of these settings. 35/// frequency ranges for each of these settings.
36#[derive(Clone, Copy)]
36pub struct Pll { 37pub struct Pll {
37 /// PLL Source clock selection. 38 /// PLL Source clock selection.
38 pub source: PllSource, 39 pub source: PllSource,
@@ -55,6 +56,7 @@ pub struct Pll {
55 56
56/// Clocks configutation 57/// Clocks configutation
57#[non_exhaustive] 58#[non_exhaustive]
59#[derive(Clone, Copy)]
58pub struct Config { 60pub struct Config {
59 /// HSI Enable 61 /// HSI Enable
60 pub hsi: bool, 62 pub hsi: bool,
diff --git a/embassy-stm32/src/rcc/g4.rs b/embassy-stm32/src/rcc/g4.rs
index c261c0fed..16561f908 100644
--- a/embassy-stm32/src/rcc/g4.rs
+++ b/embassy-stm32/src/rcc/g4.rs
@@ -32,6 +32,7 @@ pub struct Hse {
32/// Use this struct to configure the PLL source, input frequency, multiplication factor, and output 32/// Use this struct to configure the PLL source, input frequency, multiplication factor, and output
33/// dividers. Be sure to keep check the datasheet for your specific part for the appropriate 33/// dividers. Be sure to keep check the datasheet for your specific part for the appropriate
34/// frequency ranges for each of these settings. 34/// frequency ranges for each of these settings.
35#[derive(Clone, Copy)]
35pub struct Pll { 36pub struct Pll {
36 /// PLL Source clock selection. 37 /// PLL Source clock selection.
37 pub source: PllSource, 38 pub source: PllSource,
@@ -54,6 +55,7 @@ pub struct Pll {
54 55
55/// Clocks configutation 56/// Clocks configutation
56#[non_exhaustive] 57#[non_exhaustive]
58#[derive(Clone, Copy)]
57pub struct Config { 59pub struct Config {
58 /// HSI Enable 60 /// HSI Enable
59 pub hsi: bool, 61 pub hsi: bool,
diff --git a/embassy-stm32/src/rcc/h.rs b/embassy-stm32/src/rcc/h.rs
index e3c7dd158..376a0b454 100644
--- a/embassy-stm32/src/rcc/h.rs
+++ b/embassy-stm32/src/rcc/h.rs
@@ -120,7 +120,7 @@ impl From<TimerPrescaler> for Timpre {
120/// Power supply configuration 120/// Power supply configuration
121/// See RM0433 Rev 4 7.4 121/// See RM0433 Rev 4 7.4
122#[cfg(any(pwr_h7rm0399, pwr_h7rm0455, pwr_h7rm0468, pwr_h7rs))] 122#[cfg(any(pwr_h7rm0399, pwr_h7rm0455, pwr_h7rm0468, pwr_h7rs))]
123#[derive(PartialEq)] 123#[derive(Clone, Copy, PartialEq)]
124pub enum SupplyConfig { 124pub enum SupplyConfig {
125 /// Default power supply configuration. 125 /// Default power supply configuration.
126 /// V CORE Power Domains are supplied from the LDO according to VOS. 126 /// V CORE Power Domains are supplied from the LDO according to VOS.
@@ -180,6 +180,7 @@ pub enum SMPSSupplyVoltage {
180 180
181/// Configuration of the core clocks 181/// Configuration of the core clocks
182#[non_exhaustive] 182#[non_exhaustive]
183#[derive(Clone, Copy)]
183pub struct Config { 184pub struct Config {
184 pub hsi: Option<HSIPrescaler>, 185 pub hsi: Option<HSIPrescaler>,
185 pub hse: Option<Hse>, 186 pub hse: Option<Hse>,
diff --git a/embassy-stm32/src/rcc/l.rs b/embassy-stm32/src/rcc/l.rs
index e9266c65b..6120d33be 100644
--- a/embassy-stm32/src/rcc/l.rs
+++ b/embassy-stm32/src/rcc/l.rs
@@ -30,6 +30,7 @@ pub struct Hse {
30} 30}
31 31
32/// Clocks configuration 32/// Clocks configuration
33#[derive(Clone, Copy)]
33pub struct Config { 34pub struct Config {
34 // base clock sources 35 // base clock sources
35 pub msi: Option<MSIRange>, 36 pub msi: Option<MSIRange>,
diff --git a/embassy-stm32/src/rcc/u5.rs b/embassy-stm32/src/rcc/u5.rs
index d6331f512..28545ca51 100644
--- a/embassy-stm32/src/rcc/u5.rs
+++ b/embassy-stm32/src/rcc/u5.rs
@@ -59,6 +59,7 @@ pub struct Pll {
59 pub divr: Option<PllDiv>, 59 pub divr: Option<PllDiv>,
60} 60}
61 61
62#[derive(Clone, Copy)]
62pub struct Config { 63pub struct Config {
63 // base clock sources 64 // base clock sources
64 pub msi: Option<MSIRange>, 65 pub msi: Option<MSIRange>,
diff --git a/embassy-stm32/src/rcc/wba.rs b/embassy-stm32/src/rcc/wba.rs
index 8e1779d7c..1fee648d4 100644
--- a/embassy-stm32/src/rcc/wba.rs
+++ b/embassy-stm32/src/rcc/wba.rs
@@ -15,6 +15,7 @@ pub struct Hse {
15} 15}
16 16
17/// Clocks configuration 17/// Clocks configuration
18#[derive(Clone, Copy)]
18pub struct Config { 19pub struct Config {
19 // base clock sources 20 // base clock sources
20 pub hsi: bool, 21 pub hsi: bool,
diff --git a/examples/boot/application/stm32wl/memory.x b/examples/boot/application/stm32wl/memory.x
index 5af1723f5..20109e37e 100644
--- a/examples/boot/application/stm32wl/memory.x
+++ b/examples/boot/application/stm32wl/memory.x
@@ -5,8 +5,8 @@ MEMORY
5 BOOTLOADER_STATE : ORIGIN = 0x08006000, LENGTH = 4K 5 BOOTLOADER_STATE : ORIGIN = 0x08006000, LENGTH = 4K
6 FLASH : ORIGIN = 0x08008000, LENGTH = 64K 6 FLASH : ORIGIN = 0x08008000, LENGTH = 64K
7 DFU : ORIGIN = 0x08018000, LENGTH = 68K 7 DFU : ORIGIN = 0x08018000, LENGTH = 68K
8 SHARED_RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64 8 SHARED_RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128
9 RAM (rwx) : ORIGIN = 0x20000040, LENGTH = 32K - 64 9 RAM (rwx) : ORIGIN = 0x20000080, LENGTH = 32K - 128
10} 10}
11 11
12__bootloader_state_start = ORIGIN(BOOTLOADER_STATE) - ORIGIN(BOOTLOADER); 12__bootloader_state_start = ORIGIN(BOOTLOADER_STATE) - ORIGIN(BOOTLOADER);
@@ -21,4 +21,4 @@ SECTIONS
21 { 21 {
22 *(.shared_data) 22 *(.shared_data)
23 } > SHARED_RAM 23 } > SHARED_RAM
24} \ No newline at end of file 24}
diff --git a/examples/stm32wl/memory.x b/examples/stm32wl/memory.x
index 0298caa4b..4590867a8 100644
--- a/examples/stm32wl/memory.x
+++ b/examples/stm32wl/memory.x
@@ -2,8 +2,8 @@ MEMORY
2{ 2{
3 /* NOTE 1 K = 1 KiBi = 1024 bytes */ 3 /* NOTE 1 K = 1 KiBi = 1024 bytes */
4 FLASH : ORIGIN = 0x08000000, LENGTH = 256K 4 FLASH : ORIGIN = 0x08000000, LENGTH = 256K
5 SHARED_RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64 5 SHARED_RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128
6 RAM (rwx) : ORIGIN = 0x20000040, LENGTH = 64K - 64 6 RAM (rwx) : ORIGIN = 0x20000080, LENGTH = 64K - 128
7} 7}
8 8
9SECTIONS 9SECTIONS
@@ -12,4 +12,4 @@ SECTIONS
12 { 12 {
13 *(.shared_data) 13 *(.shared_data)
14 } > SHARED_RAM 14 } > SHARED_RAM
15} \ No newline at end of file 15}