我用的是正点的
STM32F103
来进行学习,板子和教程是野火的指南者
。
之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。
CPU在板子里是个大忙人,各个外设都需要CPU操心,经常出现找不到人的情况。
所以为了给CPU减负,DMA应运而生。
DMA,全称Direct Memory Access,即直接存储器访问。
DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
换句话说,让两个外设自己打电话。
如果有了DMA,那么传输是这样的:
参考文章如下:
【STM32】 DMA原理,步骤超细详解,一文看懂DMA
一、DMA功能框图
笔者使用的板子是野火的指南者,MCU为STM32F103。
在开发手册中可以看到
- DMA请求
- 通道
- 仲裁器
1、DMA请求
如果外设要想通过 DMA 来传输数据,必须先给 DMA 控制器发送 DMA 请求,DMA 收到请求信号之后,控制器会给外设一个应答信号,当外设应答后且 DMA 控制器收到应答信号之后,就会启动 DMA 的传输,直到传输完毕。
DMA 有 DMA1
和 DMA2
两个控制器,DMA1
有 7 个通道,DMA2
有 5 个通道,不同的 DMA 控制器的通道对应着不同的外设请求,这决定了我们在软件编程上该怎么设置。
2、通道
DMA 具有 12 个独立可编程的通道,其中 DMA1
有 7 个通道,DMA2
有 5 个通道,每个通道对应不同的外设的 DMA 请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一个,不能同时接收多个。
3、仲裁器
当发生多个 DMA 通道请求时,就意味着有先后响应处理的顺序问题,这个就由仲裁器也管理。
仲裁器管理 DMA 通道请求分为两个阶段。
-
第一阶段属于软件阶段,可以在
DMA_CCRx
寄存器中设置,有 4 个等级:- 非常高
- 高
- 中
- 低
-
第二阶段属于硬件阶段,如果两个或以上的 DMA 通道请求设置的优先级一样,则他们优先级取决于通道编号,编号越低优先权越高,比如通道 0 高于通道 1。
在大容量产品和互联型产品中,DMA1 控制器拥有高于 DMA2 控制器的优先级。