Get DMA on H7 working, add usart_dma example for H7.
This commit is contained in:
@ -139,7 +139,7 @@ unsafe fn on_irq() {
|
||||
/// safety: must be called only once
|
||||
pub(crate) unsafe fn init() {
|
||||
pac::interrupts! {
|
||||
(DMA, $irq:ident) => {
|
||||
(BDMA, $irq:ident) => {
|
||||
crate::interrupt::$irq::steal().enable();
|
||||
};
|
||||
}
|
||||
@ -209,52 +209,11 @@ pac::bdma_channels! {
|
||||
};
|
||||
}
|
||||
|
||||
// HACK: on stm32h7 "DMA" interrupts are for DMA, not BDMA, so this
|
||||
// would cause duplicate interrupt definitions. Do it manually insted
|
||||
#[cfg(not(rcc_h7))]
|
||||
pac::interrupts! {
|
||||
(DMA, $irq:ident) => {
|
||||
(BDMA, $irq:ident) => {
|
||||
#[crate::interrupt]
|
||||
unsafe fn $irq () {
|
||||
on_irq()
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#[cfg(rcc_h7)]
|
||||
mod _if_h7 {
|
||||
use super::*;
|
||||
|
||||
#[crate::interrupt]
|
||||
unsafe fn BDMA_CHANNEL0() {
|
||||
on_irq()
|
||||
}
|
||||
#[crate::interrupt]
|
||||
unsafe fn BDMA_CHANNEL1() {
|
||||
on_irq()
|
||||
}
|
||||
#[crate::interrupt]
|
||||
unsafe fn BDMA_CHANNEL2() {
|
||||
on_irq()
|
||||
}
|
||||
#[crate::interrupt]
|
||||
unsafe fn BDMA_CHANNEL3() {
|
||||
on_irq()
|
||||
}
|
||||
#[crate::interrupt]
|
||||
unsafe fn BDMA_CHANNEL4() {
|
||||
on_irq()
|
||||
}
|
||||
#[crate::interrupt]
|
||||
unsafe fn BDMA_CHANNEL5() {
|
||||
on_irq()
|
||||
}
|
||||
#[crate::interrupt]
|
||||
unsafe fn BDMA_CHANNEL6() {
|
||||
on_irq()
|
||||
}
|
||||
#[crate::interrupt]
|
||||
unsafe fn BDMA_CHANNEL7() {
|
||||
on_irq()
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ use core::task::Poll;
|
||||
use atomic_polyfill::{AtomicU8, Ordering};
|
||||
use core::future::Future;
|
||||
use embassy::interrupt::{Interrupt, InterruptExt};
|
||||
use embassy::util::AtomicWaker;
|
||||
use embassy::util::{AtomicWaker, OnDrop};
|
||||
use futures::future::poll_fn;
|
||||
|
||||
use crate::interrupt;
|
||||
@ -38,6 +38,7 @@ static STATE: State = State::new();
|
||||
|
||||
//async unsafe fn do_transfer(ch: &mut impl Channel, ch_func: u8, src: *const u8, dst: &mut [u8]) {
|
||||
|
||||
#[allow(unused)]
|
||||
pub(crate) async unsafe fn do_transfer(
|
||||
dma: pac::dma::Dma,
|
||||
channel_number: u8,
|
||||
@ -59,6 +60,15 @@ pub(crate) async unsafe fn do_transfer(
|
||||
|
||||
let ch = dma.st(channel_number as _);
|
||||
|
||||
let on_drop = OnDrop::new(|| unsafe {
|
||||
ch.cr().modify(|w| {
|
||||
w.set_tcie(false);
|
||||
w.set_teie(false);
|
||||
w.set_en(false);
|
||||
});
|
||||
while ch.cr().read().en() {}
|
||||
});
|
||||
|
||||
#[cfg(dmamux)]
|
||||
super::dmamux::configure_dmamux(dmamux_regs, dmamux_ch_num, request);
|
||||
|
||||
@ -74,6 +84,7 @@ pub(crate) async unsafe fn do_transfer(
|
||||
w.set_pinc(vals::Inc::FIXED);
|
||||
w.set_teie(true);
|
||||
w.set_tcie(true);
|
||||
w.set_trbuff(true);
|
||||
w.set_en(true);
|
||||
|
||||
#[cfg(dma_v2)]
|
||||
|
Reference in New Issue
Block a user