DMA是什么?——帮 CPU 跑腿的 DMA

DMA是什么?——帮 CPU 跑腿的 DMA

一、DMA业务简单理解

在程序中, 如果要实现将一个数据块复制到另外一个数据块时,
常规做法就是将源数据放在 for 循环当中, 然后一个一个的复制到目标位置。
这里 CPU 就起到了一个“搬运工”的作用,
但是,单纯的搬运工作将会阻塞 CPU,
使得 CPU 重复执行耗时的复制任务,降低了整个系统的实时性,
因此 DMA(Direct Memory Access,直接内存存取) 诞生了。
DMA 就是 CPU的贴身小秘书, CPU 只需要告诉 DMA, 你要去哪取货(源地址),要送到哪(目标地址),
要求的每次运货的货物重量(数据长度, 8/16/32 位) ,要运几次等等。
CPU 给 DMA 分配完任务之后, CPU 就去执行它自己的业务逻辑去了,而 DMA 也开始进行数据的搬运,
这样一来就大大降低了 CPU 的工作负担。

STM32F103 上面最多包含两个 DMA 外设(DMA1 和 DMA2)和 12 个 DMA 通道
(DMA1 包含 7个通道, DMA2 包含 5 个通道) ,
其中 DMA2 仅存在于大容量单片机中。
这里的每个通道就代表着一个数据搬运工,并且为了防止多个搬运工同时进行数据搬运时产生冲突
(多通道共用一个数据总线) ,就又规定了 4 个传输优先级,
分别是很高,高,中等和低, 当优先级相同时通道号小的传输优先级比通道号大的传输优先级要高,
另外, STM32 的 DMA 除了可以在内存中来回搬运数据外,还可以在外设和内存以及内存和外设之间进行数据的传输,
比如我们学习 ADC 章节的时候是通过 CPU 进行数据采集的,
如果使用 DMA 的话,则由 DMA 负责采集ADC 的数据寄存器并将其值存放到我们指定的内存变量当中。

二、DMA 相关的寄存器(主要是四个)

记住名字和对应功能,对应用层面就行了

DMA 中断状态寄存器(DMA_ISR)

这些标志位用于判断此时 DMA 的运行状态,
比如传输到一半或者完全传输标志位,其中用到最多的就是传输完成标志,即 TCIFx

DMA 中断标志清除寄存器(DMA_IFCR)

和其他外设清除标志位的方式不同,
DMA 要使用单独的标志清除寄存器来清除掉DMA_ISR 寄存器中的对应标志位。

DMA 中断标志清除寄存器(DMA_IFCR)

DMA 通道 x 外设地址寄存器(DMA_CPARx)/ DMA 通道 x 存储器地址寄存器(DMA_CMARx)

三、总结(配置 DMA 的步骤)

  1. 设置 DMA 的通道,传输数据数量,传输方向,源/目标地址,源/目标的数据宽度,是否循环传输,并开启 DMA;
  2. 在相应外设中,设置触发 DMA 传输的事件,比如本章是通过定时器发生比较事件时触发 DMA 传输;
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值