2. DMA 基础回顾:工作原理、传输方向与模式

在深入串口 DMA 双缓冲实现之前,必须牢固掌握 DMA 的核心机制。DMA(Direct Memory Access,直接存储器访问)允许外设与存储器之间直接交换数据,无需 CPU 逐字节干预,是实现“零拷贝”连续采样的基石。

2.1 DMA 工作原理

DMA 控制器本质上是一个专用的硬件数据传输引擎。它拥有自己的总线接口,可以独立访问系统总线(AHB/APB)。当外设(如 USART)准备好数据时,它会向 DMA 控制器发送请求信号;DMA 控制器在获得总线控制权后,执行一次源地址到目的地址的数据搬运,完成后释放总线并通知 CPU(通过中断或标志位)。

核心优势:CPU 只需在 DMA 传输开始前配置好源地址、目的地址、数据长度和触发源,之后即可执行其他任务(如算法运算、显示刷新),传输过程完全由硬件自动完成。
DMA 工作原理流程图 外设 (USART) DMA 控制器 存储器 (SRAM) CPU DMA 请求 数据搬运 传输完成中断 CPU 配置后即可休眠或执行其他任务

2.2 传输方向

STM32 DMA 支持三种传输方向,对应不同的应用场景:

传输方向 源地址 目的地址 典型应用
外设 → 存储器 外设数据寄存器 (USART->DR) SRAM 缓冲区 串口接收、ADC 采样
存储器 → 外设 SRAM 缓冲区 外设数据寄存器 (USART->DR) 串口发送、DAC 输出
存储器 → 存储器 SRAM 区域 A SRAM 区域 B 内存拷贝、数据搬移
提示:在串口连续采样场景中,我们主要使用 外设 → 存储器 方向。USART 接收到的每个字节都会自动触发 DMA 传输,将数据存入指定的缓冲区,CPU 完全不需要参与逐字节读取。

2.3 传输模式:单次 vs 循环

DMA 传输模式决定了传输完成后的行为,这是双缓冲设计的关键前提:

  • 单次模式 (Normal):DMA 传输完设定的数据量(如 100 字节)后自动停止,不再响应外设请求。需要软件重新使能才能再次启动。
  • 循环模式 (Circular):DMA 传输完设定的数据量后,自动将地址指针重置回起始地址,继续响应外设请求,形成环形缓冲区。这是实现连续不间断采样的基础。
DMA 传输模式对比 单次模式 (Normal) B0 B1 B2 ... 传输 N 字节后停止 需软件重新使能 ✗ 不适合连续采样 循环模式 (Circular) B0 B1 B2 ... 自动回绕,永不停止 ✓ 适合连续采样

2.4 DMA 请求与通道映射

每个外设的 DMA 请求都连接到 DMA 控制器的特定通道(Stream/Channel)。以 STM32F4 系列为例,DMA2 控制器负责处理 USART 的接收和发送请求:

外设 DMA 控制器 通道 (Stream) 请求类型
USART1_RX DMA2 Stream 2 外设 → 存储器
USART1_TX DMA2 Stream 7 存储器 → 外设
USART2_RX DMA1 Stream 5 外设 → 存储器
USART2_TX DMA1 Stream 6 存储器 → 外设
重要:不同 STM32 系列(F1/F4/G4/H7)的 DMA 通道映射差异很大。务必查阅对应型号的 参考手册 (Reference Manual) 中的 DMA 请求映射表,错误的通道配置会导致 DMA 无法响应外设请求。
DMA 请求与通道映射架构 (以 STM32F4 为例) USART1 USART2 USART3 DMA 控制器 Stream 2 Stream 7 Stream 5 Stream 6 Stream 1

2.5 关键配置参数总结

在初始化 DMA 时,以下参数必须正确设置,才能保证串口 DMA 正常工作:

  • 源地址:外设数据寄存器地址(如 &USART1->DR)
  • 目的地址:内存缓冲区地址(如 uint8_t rx_buffer[100])
  • 数据宽度:字节 (8-bit)、半字 (16-bit)、字 (32-bit)。串口通常使用字节。
  • 传输数量:每次 DMA 传输的数据项个数(如 100 字节)
  • 地址增量:外设地址固定(不增量),内存地址递增(增量)
  • 传输模式:循环模式 (Circular) 用于连续采样
  • 优先级:低、中、高、最高。多 DMA 通道同时工作时需合理分配。