aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2021-07-15 06:31:54 +0200
committerBob McWhirter <[email protected]>2021-07-16 14:41:20 -0400
commit63a0e188eae16bdf3c40ec627bbfbdcaa1cf4978 (patch)
treebe235ef80711b00e7c5211fc3ae54f9e6751d911
parent2ee20f5dcb27ef6e340569922a861ce3d9596d74 (diff)
stm32/dma: fix h7 impls
-rw-r--r--embassy-stm32/src/dma/bdma.rs42
-rw-r--r--embassy-stm32/src/dma/dmamux.rs33
-rw-r--r--examples/stm32h7/src/bin/usart.rs9
3 files changed, 63 insertions, 21 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}
diff --git a/examples/stm32h7/src/bin/usart.rs b/examples/stm32h7/src/bin/usart.rs
index d8e60158b..143f94491 100644
--- a/examples/stm32h7/src/bin/usart.rs
+++ b/examples/stm32h7/src/bin/usart.rs
@@ -1,4 +1,3 @@
1
2#![no_std] 1#![no_std]
3#![no_main] 2#![no_main]
4#![feature(trait_alias)] 3#![feature(trait_alias)]
@@ -13,12 +12,12 @@ use cortex_m::prelude::_embedded_hal_blocking_serial_Write;
13use embassy::executor::Executor; 12use embassy::executor::Executor;
14use embassy::time::Clock; 13use embassy::time::Clock;
15use embassy::util::Forever; 14use embassy::util::Forever;
15use embassy_stm32::dma::NoDma;
16use embassy_stm32::usart::{Config, Uart}; 16use embassy_stm32::usart::{Config, Uart};
17use embassy_stm32::dma_traits::NoDma;
18use example_common::*; 17use example_common::*;
19 18
20use stm32h7xx_hal as hal;
21use hal::prelude::*; 19use hal::prelude::*;
20use stm32h7xx_hal as hal;
22 21
23use cortex_m_rt::entry; 22use cortex_m_rt::entry;
24use stm32h7::stm32h743 as pac; 23use stm32h7::stm32h743 as pac;
@@ -60,8 +59,7 @@ fn main() -> ! {
60 59
61 let rcc = pp.RCC.constrain(); 60 let rcc = pp.RCC.constrain();
62 61
63 rcc 62 rcc.sys_ck(96.mhz())
64 .sys_ck(96.mhz())
65 .pclk1(48.mhz()) 63 .pclk1(48.mhz())
66 .pclk2(48.mhz()) 64 .pclk2(48.mhz())
67 .pclk3(48.mhz()) 65 .pclk3(48.mhz())
@@ -89,7 +87,6 @@ fn main() -> ! {
89 w 87 w
90 }); 88 });
91 89
92
93 unsafe { embassy::time::set_clock(&ZeroClock) }; 90 unsafe { embassy::time::set_clock(&ZeroClock) };
94 91
95 let executor = EXECUTOR.put(Executor::new()); 92 let executor = EXECUTOR.put(Executor::new());