DMA 传输
DMA(Direct Memory Access,直接内存访问)是一种允许外设直接与内存交换数据的技术,无需 CPU 干预。STM32F1 的 DMA 控制器可以显著提高数据传输效率,降低 CPU 负担,特别适用于 ADC 数据采集、USART/SPI 数据收发等高速数据传输场景。本文档详细介绍 DMA 的工作原理、通道映射、配置方法和实际应用。
DMA 原理
为什么需要 DMA
传统的数据传输方式需要 CPU 参与:
// CPU 参与的数据传输
for (int i = 0; i < 100; i++)
{
buffer[i] = USART1->DR; // CPU 逐字节读取
}
问题:
- CPU 被占用,无法处理其他任务
- 传输速度受 CPU 指令执行速度限制
- 高频率中断导致系统响应变慢
DMA 工作机制
DMA 控制器接管数据传输,CPU 可以并行处理其他任务:
传统方式:
CPU ──────────────────────────► 数据传输 ──────► 处理
DMA 方式:
CPU ──────────────────────────► 处理 ─────────► 处理
DMA ──────────────────────────► 数据传输 ──────►
DMA 特性
STM32F1 DMA 控制器特性:
- 12 个通道(DMA1: 7 通道,DMA2: 5 通道)
- 独立的源和目标端口,支持存储器到外设、外设到存储器、存储器到存储器传输
- 可编程的数据长度:1~65535 字节
- 支持循环模式:传输完成后自动重新开始
- 独立的中断和 flags:传输完成、半满、错误等
DMA 通道映射
DMA1 请求映射
| 通道 | 外设请求 |
|---|---|
| 通道 1 | ADC1 |
| 通道 2 | USART3_TX |
| 通道 3 | USART3_RX |
| 通道 4 | USART2_TX |
| 通道 5 | USART2_RX |
| 通道 6 | SPI2_RX / I2S2_RX |
| 通道 7 | SPI2_TX / I2S2_TX |
DMA2 请求映射
| 通道 | 外设请求 |
|---|---|
| 通道 1 | ADC2 |
| 通道 2 | SPI1_RX |
| 通道 3 | SPI1_TX |
| 通道 4 | USART1_TX |
| 通道 5 | USART1_RX |
DMA 控制器特性对比
| 特性 | DMA1 | DMA2 |
|---|---|---|
| 通道数 | 7 | 5 |
| 支持 ADC | 是 | 是 |
| 支持 SPI | 是 | 是 |
| 支持 USART | 是 | 是 |
| 支持 Timer | 是 | 是 |
| 存储器到存储器 | 不支持 | 支持 |
DMA 传输类型
1. 外设到存储器(Peripheral to Memory)
数据从外设数据寄存器传输到内存缓冲区:
USART_DR / SPI_DR / ADC_DR ──► 内存缓冲区
典型应用:
- USART 接收数据
- SPI 从设备接收数据
- ADC 转换结果采集
2. 存储器到外设(Memory to Peripheral)
数据从内存缓冲区传输到外设数据寄存器:
内存缓冲区 ──► USART_DR / SPI_DR / DAC_DHR
典型应用:
- USART 发送数据
- SPI 发送数据
- DAC 输出