直接存儲器存取(DMA)用來提供在外設和存儲器之間或者存儲器和存儲器之間的高速數據傳輸。無須 CPU干預,數據可以通過 DMA 快速地移動,節省了 CPU 的資源,進行其他操作。DMA 控制器有 3 條 DMA 通道,每條通道負責管理來自 1 個或者多個外設對存儲器訪問的請求。
DMA 控制器包括處理 DMA 請求的仲裁器,用于處理各個 DMA 請求的優先級。
DMA框圖
PY32F030 的DMA 內部有3個獨立的通道,可用于外設與存儲器或存儲器與存儲器之間的高速數據傳輸,可配置各通道的優先級。
示例
存儲器與存儲器:examples/dma_mem2mem.rs
#![no_std]
#![no_main]
use defmt::Debug2Format;
use hal::dma::{AnyDma, Burst, Priorities, RepeatMode};
use py32f030_hal::{selfas hal, dma::Config, mode::Blocking};
use {defmt_rtt as _, panic_probe as _};
#[cortex_m_rt::entry]
fn main() -> ! {
let p = hal::init(Default::default());
defmt::info!("embassy_dma_mem2mem example!");
letmut src: [u32; 4] = [1, 2, 3, 4];
letmut dst: [u32; 4] = [0; 4];
letmut dma: AnyDma<_, Blocking> = AnyDma::new(p.DMA);
let [mut channel1, _, _] = dma.split();
channel1.config(Config::new_mem2mem(
src.as_mut_ptr() asu32,
true,
dst.as_mut_ptr() asu32,
true,
Priorities::Low,
RepeatMode::OneTime(src.len() asu16),
Burst::World,
));
channel1.start();
let rst = channel1.wait_complet();
defmt::info!("rst: {:?}", Debug2Format(&rst));
defmt::info!("src: {} ", src);
defmt::info!("dst: {} ", dst);
loop {
cortex_m::asm::wfe();
}
}