首页/外设速查/DMA
💨

DMA 直接内存访问

通信外设
数据在外设与内存间直传,CPU 只收"完成通知",高吞吐采集/通信的加速器。
🧩 核心原理
📈 时序 / 工作过程图
DMA 直接内存访问流程外设与内存之间数据直传,传输完成再通知 CPU外设数据寄存器UART_RX / ADC_DR内存缓冲区SRAM 数组DMA 搬运不占用CPUCPU处理数据/休眠传输完成中断通知DMA 传输方向:外设→内存 / 内存→外设 / 内存→内存 · 半字/字对齐 · 循环模式
⚙️ 配置 / 使用要点
  1. 使能 DMA 时钟,配置通道/方向/宽度/模式
  2. 目标数组对齐(半字2字节/字4字节)
  3. 外设地址固定,内存地址自增
  4. 使能完成中断 + 启动传输
🛠️ 项目示例
ADC 双通道 DMA 连续采集(每轮转换完成中断)
// 见 ADC 示例:HAL_ADC_Start_DMA(&hadc1, (uint32_t*)buf, 2);
// 传输完成回调:
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){
  // buf 已填好 2 个通道最新值
  voltage = buf[0] * 3.3f / 4095.0f;
  // 无需再启动:连续模式自动继续
}
// CPU 全程不参与搬运,只在完成时被通知
❓ 面试高频
DMA为什么能省CPU?
数据搬移由DMA控制器硬件完成,CPU可以休眠/干别的,只在传输完成中断里处理一次
DMA和中断的区别?
中断是通知CPU"有事";DMA是硬件帮你把数据搬完再通知,中断+DMA组合才高效
什么场景必须用DMA?
高速连续数据流:ADC多通道扫描、UART大包收发、SPI读写Flash、内存拷贝
✅ 自查清单 (点击勾选,本地保存)
0/0
知道三种传输方向
理解触发源与完成中断
会配循环模式
知道内存对齐要求
能说出DMA+ADC/UART典型组合