一、简介
•DMA(Direct Memory Access)直接存储器存取
•DMA可以提供外设寄存器和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源
•12个独立可配置的通道: DMA1(7个通道), DMA2(5个通道)
•每个通道都支持软件触发和特定的硬件触发,从存储器转运到存储器用软件触发,外设寄存器和存储器之间转运用硬件触发。
•STM32F103C8T6 DMA资源:DMA1(7个通道)
二、存储器映射
1. ROM 区域(只读存储区)
| 起始地址 | 存储器类型 | 用途解读 |
|---|---|---|
0x0800 0000 |
程序存储器 Flash | 这是 STM32 的主程序存储区,C 语言编译后的二进制代码、常量数据都会烧录在这里。系统上电后,CPU 会从该地址开始取指令执行。 |
0x1FFF F000 |
系统存储器 | 该区域存储了 ST 官方提供的 BootLoader 程序,可通过串口等方式对主 Flash 进行程序下载,常用于芯片出厂后的首次烧录或固件升级。 |
0x1FFF F800 |
选项字节 | 存储芯片的配置参数,如读保护、写保护、电压监测阈值等,这些参数独立于用户程序,通常通过专用指令修改。 |
2. RAM 区域(读写存储区)
| 起始地址 | 存储器类型 | 用途解读 |
|---|---|---|
0x2000 0000 |
运行内存 SRAM | 程序运行时的临时数据、局部变量、堆栈等都存放在这里,掉电后数据会丢失。 |
0x4000 0000 |
外设寄存器 | 所有片上外设(如 GPIO、UART、SPI 等)的配置和状态寄存器都映射在此区域,通过读写这些寄存器可以控制外设工作。 |
0xE000 0000 |
内核外设寄存器 | 映射 Cortex-M 内核的专属外设寄存器,如嵌套向量中断控制器(NVIC)、系统定时器(SysTick)等,用于配置内核的核心功能。 |
地址映射本质:Cortex-M 内核将程序代码、数据、外设寄存器统一映射到 4GB 的线性地址空间,CPU 可以通过地址直接访问,无需额外的地址转换,简化了硬件设计和软件开发。
哈佛结构:该架构中,程序存储器(Flash)和数据存储器(SRAM)拥有独立的总线,CPU 可以同时取指令和访问数据,提升了执行效率。
三、DMA结构
框图

1.框图中的 DMA 子系统结构
从图中可以清晰看到 STM32 的 DMA 模块组成:
-
DMA1 与 DMA2:这是两个独立的 DMA 控制器,拥有各自的通道和仲裁器。
-
DMA1:包含 7 个通道,主要负责为挂载在 APB1 和部分 APB2 总线上的外设提供 DMA 请求,比如 UART、SPI、I2C、TIM 等。
-
DMA2:包含 5 个通道,主要服务于以太网 MAC、USB OTG FS 等高速外设,以及 ADC 等数据吞吐量较高的设备。
-
-
仲裁器:当多个 DMA 通道同时发起请求时,仲裁器会根据通道优先级决定哪个请求先被响应。
-
AHB 从设备接口:DMA 控制器通过这个接口连接到 AHB 总线,从而实现对 Flash、SRAM 等存储器的高速访问。
-
DMA 的工作流程
-
请求触发:当外设(如 UART、ADC)需要传输数据时,会向对应的 DMA 通道发出一个 "DMA 请求" 信号。
-
仲裁响应:DMA 控制器的仲裁器收到请求后,根据预设的优先级选择最高优先级的请求进行响应。
-
直接传输:获得响应的 DMA 通道会直接通过 AHB 总线,在源地址(如外设寄存器或 SRAM)和目标地址(如 SRAM 或外设寄存器)之间搬运数据,整个过程无需 CPU 干预。
-
完成中断:当数据传输完成后,DMA 会向 CPU 发送中断信号,通知 CPU 可以处理后续工作。
-
与系统总线的关联
-
DMA 总线:DMA 控制器通过 DMA 总线与系统总线矩阵相连,能够访问 Flash、SRAM 以及挂载在 APB1/APB2 上的外设寄存器。
-
总线桥(桥 1、桥 2):APB1 和 APB2 总线上的外设,通过桥 1、桥 2 连接到 AHB 总线,从而让 DMA 可以访问这些外设的寄存器。
基本结构

- 配置阶段:CPU 先配置好外设和存储器的地址、数据宽度、地址自增模式,以及传输方向和计数器值。
- 触发传输:通过M2M(M to M 存储器到存储器)选择触发模式,由硬件事件或软件指令触发 DMA 开始工作。这里的软件触发是以最快的速度将计数器减到零,所以不能和自动重装同时工作,否则DMA会一直工作。
- 自动搬运:DMA 控制器在无需 CPU 干预的情况下,按配置自动搬运数据,并递减传输计数器。
- 循环或结束:如果开启自动重装,计数器归零后会自动重新加载并开始新一轮传输;否则传输结束后触发中断通知 CPU。
- 开关控制:写传输计数器时,必须先关闭DMA。
DMA请求

EN位是数据选择器的使能位,每个通道的硬件触发源不同,所以硬件触发要选择对应的通道,软件触发可以任意选择通道。
数据宽度与对齐

当目标的数据宽度,比源端的数据宽度大,就在目标数据的前面补0
当目标的数据宽度,比源端的数据宽度小,就将目标数据的高位丢弃只读取低位
数据转换+DMA

外设的地址DataA[7]的首地址 、存储器的地址DataB[7]的首地址、数据宽度都是8位字节、两边都是地址自增模式、传输方向DataA[7]-->DataB[7]、计数器值为7、不需要自动重装、软件触发。
ADC扫描模式+DMA

DMA转运的时机,需要和ADC单个通道转换完成同步,所以DMA的触发要选择ADC的硬件触发。
ADC单个通道转换完成后不产生任何标志位和中断,但应该会产生DMA请求去触发DMA转换。