STM32F103 “BluePill” 上的 DMA 原理与实践
摘要:本文深入浅出地介绍什么是 DMA(直接存储器访问),它的核心原理、硬件架构,以及在 STM32F103(BluePill)上常见的几种使用场景(ADC、UART、内存拷贝等)。通过对比 CPU 轮询、中断、DMA 三种方式的数据搬运效率,结合寄存器级和 HAL 库示例代码,并附带性能测试与优化建议,帮助你在实际项目中高效地利用 DMA 降低 CPU 占用、提高实时性。
目录
-
引言
-
DMA 基础概念
-
STM32F1 系列的 DMA 控制器架构
-
DMA 工作流程详解
-
DMA 常见模式
-
DMA 与 UART 串口通信
-
DMA 与 ADC 数据采集
-
内存到内存拷贝:DMA 也能做 memcpy
-
在 BluePill 上使用寄存器级配置 DMA
-
用 STM32CubeMX 和 HAL 库更省心地用 DMA
-
性能对比与注意事项
-
优化建议
-
总结与展望
-
参考文献
1. 引言
在嵌入式系统中,外设与内存之间经常需要搬运大量数据——比如 ADC 连续采样、UART 收发大块报文、DMA 做内存拷贝等。如果全部依赖 CPU 轮询或中断,会带来:
-
CPU 占用高:处理每个字节都要打断或忙等。
-
实时性差:大量中断可能导致其他关键任务丢帧。
-
效率低下:总线利用率不佳。
STM32 家族片上集成的 DMA 控制器,可在不干扰 CPU 的情况下直接在内存和外设间搬运数据。正确使用 DMA,能将数据搬运任务交给专用硬件,CPU 只需“下达命令、收尾处理”,极大提高系统整体效率。本篇文章围绕 STM32F103(也就是常见的 “BluePill”)展开,既有底层原理,又有寄存器级、HAL 库两套实战示例,帮助你快速上手。
2. DMA 基础概念
-
DMA 控制器:片上独立模块,具有多个“通道”(Channel)或“流”(Stream)用于管理不同搬运任务。
-
通道 Channel:用户配置源地址、目标地址、数据长度、传输方向、地址自增模式、中断使能等。每个通道相当于一条搬运“管道”。
-
DMA 请求:外设(如 UART、ADC、SPI)在准备好数据或空闲可写时,会给出硬件信号,触发 DMA 从源到目标的一次搬运。
-
总线主控权(Bus Master):DMA 控制器可暂时接管系统总线,直接访问内存和外设寄存器,无需 CPU 干预。
优势
-
零 CPU 干预&#