aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/src/dma/bdma.rs7
-rw-r--r--embassy-stm32/src/dma/dma.rs7
-rw-r--r--embassy-stm32/src/dma/mod.rs8
-rw-r--r--embassy-stm32/src/flash/h7.rs17
-rw-r--r--embassy-stm32/src/lib.rs17
5 files changed, 37 insertions, 19 deletions
diff --git a/embassy-stm32/src/dma/bdma.rs b/embassy-stm32/src/dma/bdma.rs
index 674255ddc..e6ce05b7b 100644
--- a/embassy-stm32/src/dma/bdma.rs
+++ b/embassy-stm32/src/dma/bdma.rs
@@ -3,6 +3,7 @@
3use core::sync::atomic::{fence, Ordering}; 3use core::sync::atomic::{fence, Ordering};
4use core::task::Waker; 4use core::task::Waker;
5 5
6use embassy_cortex_m::interrupt::Priority;
6use embassy_sync::waitqueue::AtomicWaker; 7use embassy_sync::waitqueue::AtomicWaker;
7 8
8use super::{TransferOptions, Word, WordSize}; 9use super::{TransferOptions, Word, WordSize};
@@ -38,10 +39,12 @@ impl State {
38static STATE: State = State::new(); 39static STATE: State = State::new();
39 40
40/// safety: must be called only once 41/// safety: must be called only once
41pub(crate) unsafe fn init() { 42pub(crate) unsafe fn init(irq_priority: Priority) {
42 foreach_interrupt! { 43 foreach_interrupt! {
43 ($peri:ident, bdma, $block:ident, $signal_name:ident, $irq:ident) => { 44 ($peri:ident, bdma, $block:ident, $signal_name:ident, $irq:ident) => {
44 crate::interrupt::$irq::steal().enable(); 45 let irq = crate::interrupt::$irq::steal();
46 irq.set_priority(irq_priority);
47 irq.enable();
45 }; 48 };
46 } 49 }
47 crate::_generated::init_bdma(); 50 crate::_generated::init_bdma();
diff --git a/embassy-stm32/src/dma/dma.rs b/embassy-stm32/src/dma/dma.rs
index a45b8780b..97a3df088 100644
--- a/embassy-stm32/src/dma/dma.rs
+++ b/embassy-stm32/src/dma/dma.rs
@@ -1,6 +1,7 @@
1use core::sync::atomic::{fence, Ordering}; 1use core::sync::atomic::{fence, Ordering};
2use core::task::Waker; 2use core::task::Waker;
3 3
4use embassy_cortex_m::interrupt::Priority;
4use embassy_sync::waitqueue::AtomicWaker; 5use embassy_sync::waitqueue::AtomicWaker;
5 6
6use super::{Burst, FlowControl, Request, TransferOptions, Word, WordSize}; 7use super::{Burst, FlowControl, Request, TransferOptions, Word, WordSize};
@@ -67,10 +68,12 @@ impl State {
67static STATE: State = State::new(); 68static STATE: State = State::new();
68 69
69/// safety: must be called only once 70/// safety: must be called only once
70pub(crate) unsafe fn init() { 71pub(crate) unsafe fn init(irq_priority: Priority) {
71 foreach_interrupt! { 72 foreach_interrupt! {
72 ($peri:ident, dma, $block:ident, $signal_name:ident, $irq:ident) => { 73 ($peri:ident, dma, $block:ident, $signal_name:ident, $irq:ident) => {
73 interrupt::$irq::steal().enable(); 74 let irq = interrupt::$irq::steal();
75 irq.set_priority(irq_priority);
76 irq.enable();
74 }; 77 };
75 } 78 }
76 crate::_generated::init_dma(); 79 crate::_generated::init_dma();
diff --git a/embassy-stm32/src/dma/mod.rs b/embassy-stm32/src/dma/mod.rs
index cc030a93e..74bce6aa9 100644
--- a/embassy-stm32/src/dma/mod.rs
+++ b/embassy-stm32/src/dma/mod.rs
@@ -12,6 +12,8 @@ use core::mem;
12use core::pin::Pin; 12use core::pin::Pin;
13use core::task::{Context, Poll, Waker}; 13use core::task::{Context, Poll, Waker};
14 14
15#[cfg(any(dma, bdma))]
16use embassy_cortex_m::interrupt::Priority;
15use embassy_hal_common::{impl_peripheral, into_ref}; 17use embassy_hal_common::{impl_peripheral, into_ref};
16 18
17#[cfg(dmamux)] 19#[cfg(dmamux)]
@@ -294,11 +296,11 @@ pub struct NoDma;
294impl_peripheral!(NoDma); 296impl_peripheral!(NoDma);
295 297
296// safety: must be called only once at startup 298// safety: must be called only once at startup
297pub(crate) unsafe fn init() { 299pub(crate) unsafe fn init(#[cfg(bdma)] bdma_priority: Priority, #[cfg(dma)] dma_priority: Priority) {
298 #[cfg(bdma)] 300 #[cfg(bdma)]
299 bdma::init(); 301 bdma::init(bdma_priority);
300 #[cfg(dma)] 302 #[cfg(dma)]
301 dma::init(); 303 dma::init(dma_priority);
302 #[cfg(dmamux)] 304 #[cfg(dmamux)]
303 dmamux::init(); 305 dmamux::init();
304 #[cfg(gpdma)] 306 #[cfg(gpdma)]
diff --git a/embassy-stm32/src/flash/h7.rs b/embassy-stm32/src/flash/h7.rs
index 3f2129de8..3178b3be9 100644
--- a/embassy-stm32/src/flash/h7.rs
+++ b/embassy-stm32/src/flash/h7.rs
@@ -79,24 +79,19 @@ pub(crate) unsafe fn blocking_erase(from: u32, to: u32) -> Result<(), Error> {
79 let from = from - super::FLASH_BASE as u32; 79 let from = from - super::FLASH_BASE as u32;
80 let to = to - super::FLASH_BASE as u32; 80 let to = to - super::FLASH_BASE as u32;
81 81
82 let bank_size = (super::FLASH_SIZE / 2) as u32; 82 let (start, end) = if to <= super::FLASH_SIZE as u32 {
83
84 let (bank, start, end) = if to <= bank_size {
85 let start_sector = from / super::ERASE_SIZE as u32; 83 let start_sector = from / super::ERASE_SIZE as u32;
86 let end_sector = to / super::ERASE_SIZE as u32; 84 let end_sector = to / super::ERASE_SIZE as u32;
87 (0, start_sector, end_sector) 85 (start_sector, end_sector)
88 } else if from >= SECOND_BANK_OFFSET as u32 && to <= (SECOND_BANK_OFFSET as u32 + bank_size) {
89 let start_sector = (from - SECOND_BANK_OFFSET as u32) / super::ERASE_SIZE as u32;
90 let end_sector = (to - SECOND_BANK_OFFSET as u32) / super::ERASE_SIZE as u32;
91 (1, start_sector, end_sector)
92 } else { 86 } else {
93 error!("Attempting to write outside of defined sectors"); 87 error!("Attempting to write outside of defined sectors {:x} {:x}", from, to);
94 return Err(Error::Unaligned); 88 return Err(Error::Unaligned);
95 }; 89 };
96 90
97 trace!("Erasing bank {}, sectors from {} to {}", bank, start, end); 91 trace!("Erasing sectors from {} to {}", start, end);
98 for sector in start..end { 92 for sector in start..end {
99 let ret = erase_sector(pac::FLASH.bank(bank), sector as u8); 93 let bank = if sector >= 8 { 1 } else { 0 };
94 let ret = erase_sector(pac::FLASH.bank(bank), (sector % 8) as u8);
100 if ret.is_err() { 95 if ret.is_err() {
101 return ret; 96 return ret;
102 } 97 }
diff --git a/embassy-stm32/src/lib.rs b/embassy-stm32/src/lib.rs
index d7443eace..16c46ca22 100644
--- a/embassy-stm32/src/lib.rs
+++ b/embassy-stm32/src/lib.rs
@@ -79,6 +79,8 @@ pub(crate) mod _generated {
79// Reexports 79// Reexports
80pub use _generated::{peripherals, Peripherals}; 80pub use _generated::{peripherals, Peripherals};
81pub use embassy_cortex_m::executor; 81pub use embassy_cortex_m::executor;
82#[cfg(any(dma, bdma))]
83use embassy_cortex_m::interrupt::Priority;
82pub use embassy_cortex_m::interrupt::_export::interrupt; 84pub use embassy_cortex_m::interrupt::_export::interrupt;
83pub use embassy_hal_common::{into_ref, Peripheral, PeripheralRef}; 85pub use embassy_hal_common::{into_ref, Peripheral, PeripheralRef};
84#[cfg(feature = "unstable-pac")] 86#[cfg(feature = "unstable-pac")]
@@ -91,6 +93,10 @@ pub struct Config {
91 pub rcc: rcc::Config, 93 pub rcc: rcc::Config,
92 #[cfg(dbgmcu)] 94 #[cfg(dbgmcu)]
93 pub enable_debug_during_sleep: bool, 95 pub enable_debug_during_sleep: bool,
96 #[cfg(bdma)]
97 pub bdma_interrupt_priority: Priority,
98 #[cfg(dma)]
99 pub dma_interrupt_priority: Priority,
94} 100}
95 101
96impl Default for Config { 102impl Default for Config {
@@ -99,6 +105,10 @@ impl Default for Config {
99 rcc: Default::default(), 105 rcc: Default::default(),
100 #[cfg(dbgmcu)] 106 #[cfg(dbgmcu)]
101 enable_debug_during_sleep: true, 107 enable_debug_during_sleep: true,
108 #[cfg(bdma)]
109 bdma_interrupt_priority: Priority::P0,
110 #[cfg(dma)]
111 dma_interrupt_priority: Priority::P0,
102 } 112 }
103 } 113 }
104} 114}
@@ -137,7 +147,12 @@ pub fn init(config: Config) -> Peripherals {
137 } 147 }
138 148
139 gpio::init(); 149 gpio::init();
140 dma::init(); 150 dma::init(
151 #[cfg(bdma)]
152 config.bdma_interrupt_priority,
153 #[cfg(dma)]
154 config.dma_interrupt_priority,
155 );
141 #[cfg(feature = "exti")] 156 #[cfg(feature = "exti")]
142 exti::init(); 157 exti::init();
143 158