aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-stm32/src')
-rw-r--r--embassy-stm32/src/dma/bdma.rs42
-rw-r--r--embassy-stm32/src/dma/dmamux.rs33
2 files changed, 60 insertions, 15 deletions
diff --git a/embassy-stm32/src/dma/bdma.rs b/embassy-stm32/src/dma/bdma.rs
index 9449d4bf8..37bd24d09 100644
--- a/embassy-stm32/src/dma/bdma.rs
+++ b/embassy-stm32/src/dma/bdma.rs
@@ -138,7 +138,6 @@ unsafe fn on_irq() {
138 } 138 }
139} 139}
140 140
141
142/// safety: must be called only once 141/// safety: must be called only once
143pub(crate) unsafe fn init() { 142pub(crate) unsafe fn init() {
144 pac::interrupts! { 143 pac::interrupts! {
@@ -212,6 +211,9 @@ pac::bdma_channels! {
212 }; 211 };
213} 212}
214 213
214// HACK: on stm32h7 "DMA" interrupts are for DMA, not BDMA, so this
215// would cause duplicate interrupt definitions. Do it manually insted
216#[cfg(not(rcc_h7))]
215pac::interrupts! { 217pac::interrupts! {
216 (DMA, $irq:ident) => { 218 (DMA, $irq:ident) => {
217 #[crate::interrupt] 219 #[crate::interrupt]
@@ -220,3 +222,41 @@ pac::interrupts! {
220 } 222 }
221 }; 223 };
222} 224}
225
226#[cfg(rcc_h7)]
227mod _if_h7 {
228 use super::*;
229
230 #[crate::interrupt]
231 unsafe fn BDMA_CHANNEL0() {
232 on_irq()
233 }
234 #[crate::interrupt]
235 unsafe fn BDMA_CHANNEL1() {
236 on_irq()
237 }
238 #[crate::interrupt]
239 unsafe fn BDMA_CHANNEL2() {
240 on_irq()
241 }
242 #[crate::interrupt]
243 unsafe fn BDMA_CHANNEL3() {
244 on_irq()
245 }
246 #[crate::interrupt]
247 unsafe fn BDMA_CHANNEL4() {
248 on_irq()
249 }
250 #[crate::interrupt]
251 unsafe fn BDMA_CHANNEL5() {
252 on_irq()
253 }
254 #[crate::interrupt]
255 unsafe fn BDMA_CHANNEL6() {
256 on_irq()
257 }
258 #[crate::interrupt]
259 unsafe fn BDMA_CHANNEL7() {
260 on_irq()
261 }
262}
diff --git a/embassy-stm32/src/dma/dmamux.rs b/embassy-stm32/src/dma/dmamux.rs
index ca2879c2e..e9fa48231 100644
--- a/embassy-stm32/src/dma/dmamux.rs
+++ b/embassy-stm32/src/dma/dmamux.rs
@@ -31,28 +31,33 @@ macro_rules! dma_num {
31 (DMA2) => { 31 (DMA2) => {
32 1 32 1
33 }; 33 };
34 (BDMA) => {
35 0
36 };
37} 34}
38 35
39macro_rules! dmamux_peri { 36#[cfg(not(rcc_h7))]
40 (DMA1) => { 37pac::bdma_channels! {
41 crate::pac::DMAMUX1 38 ($channel_peri:ident, $dma_peri:ident, $channel_num:expr) => {
42 }; 39 impl MuxChannel for peripherals::$channel_peri {
43 (DMA2) => { 40 const DMAMUX_CH_NUM: u8 = (dma_num!($dma_peri) * 8) + $channel_num;
44 crate::pac::DMAMUX1 41 const DMAMUX_REGS: pac::dmamux::Dmamux = pac::DMAMUX1;
45 }; 42 }
46 (BDMA) => {
47 crate::pac::DMAMUX1
48 }; 43 };
49} 44}
50 45
51pac::bdma_channels! { 46#[cfg(rcc_h7)]
47pac::dma_channels! {
52 ($channel_peri:ident, $dma_peri:ident, $channel_num:expr) => { 48 ($channel_peri:ident, $dma_peri:ident, $channel_num:expr) => {
53 impl MuxChannel for peripherals::$channel_peri { 49 impl MuxChannel for peripherals::$channel_peri {
54 const DMAMUX_CH_NUM: u8 = (dma_num!($dma_peri) * 8) + $channel_num; 50 const DMAMUX_CH_NUM: u8 = (dma_num!($dma_peri) * 8) + $channel_num;
55 const DMAMUX_REGS: pac::dmamux::Dmamux = dmamux_peri!($dma_peri); 51 const DMAMUX_REGS: pac::dmamux::Dmamux = pac::DMAMUX1;
52 }
53 };
54}
55#[cfg(rcc_h7)]
56pac::bdma_channels! {
57 ($channel_peri:ident, $dma_peri:ident, $channel_num:expr) => {
58 impl MuxChannel for peripherals::$channel_peri {
59 const DMAMUX_CH_NUM: u8 = $channel_num;
60 const DMAMUX_REGS: pac::dmamux::Dmamux = pac::DMAMUX2;
56 } 61 }
57 }; 62 };
58} 63}