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 传输;
<think>好的,我现在需要回答用户关于DMA的概念以及它与中断方式区别的问题。首先,我得确保自己准确理解DMA的定义,并能够清晰解释它与中断的不同之处。 首先,DMA的全称是直接存储器访问(Direct Memory Access),这应该是一种允许外设直接与内存进行数据传输的技术,而不需要CPU的介入。这样做的优势在于减少CPU的负担,提高系统效率。我需要确认这一点是否正确,可能还需要查阅相关资料或引用中的内容来支持。比如,用户提供的引用里提到了中断优先级,虽然不直接相关,但可能涉及到数据传输时中断的使用情况,可以对比说明DMA如何减少中断次数。 接下来,关于中断方式,用户可能指的是传统的数据传输方式,即外设通过中断通知CPU进行数据传输。每次传输都需要CPU参与,比如从外设读取数据到内存,或者从内存发送数据到外设。这种方式在数据量小的时候还可以,但数据量大时会导致频繁中断,增加CPU负载,影响整体性能。 两者的主要区别应该包括以下几点: 1. **CPU参与程度**:DMA不需要CPU直接参与数据传输,而中断方式需要CPU处理每个数据传输请求。 2. **效率**:DMA适合大批量数据传输,减少CPU开销;中断方式适合小量或即时性高的数据传输。 3. **中断次数**:DMA只在传输完成时产生中断,而中断方式每次传输都可能需要中断。 4. **应用场景**:DMA常用于高速外设如硬盘、网络接口卡等,中断方式用于键盘、鼠标等低速率设备。 需要确保这些区别的准确性,可能结合用户提供的引用内容。比如,引用[^1]中提到中断优先级配置,当多个中断同时发生时处理顺序,这可能与中断方式的频繁中断问题相关。而引用[^2]中的IIC通信协议使用场景,可能涉及到是否需要DMA的支持,但需要确认是否有直接联系。 此外,用户可能还希望了解DMA的工作流程,比如DMA控制器的作用,如何初始化DMA传输,以及传输完成后的中断处理。这部分内容可以进一步详细说明,但用户的问题主要集中在定义和区别上,可能需要先回答核心问题,再扩展相关细节。 需要注意使用中文回答,并且按照系统级指令的要求,数学公式用$...$,独立公式用$$...$$,但这里可能更多是概念解释,数学公式可能较少。不过如果有数据传输速率的计算,可能需要用到,比如传输时间比较,但不确定是否需要。暂时先集中在概念对比上。 最后,生成相关问题时要围绕DMA和中断方式的对比,可能的问题包括DMA的应用场景、如何配置DMADMA控制器的功能、中断方式的优缺点等。</think>### DMA定义及其与中断方式的区别 #### 1. **DMA(直接存储器访问)定义** DMA(Direct Memory Access)是一种允许外设**直接与内存交换数据**的技术,**无需CPU介入**数据传输过程。其核心是通过独立的DMA控制器管理数据传输,仅在传输开始前由CPU配置参数(如源地址、目标地址、数据量),传输完成后通过中断通知CPU。 #### 2. **中断方式定义** 中断方式依赖**CPU主动处理数据传输**。外设通过中断信号通知CPU需要处理数据,CPU暂停当前任务,执行中断服务程序(ISR)完成数据搬运。例如,每次串口接收一个字节数据都会触发中断,由CPU读取并存储到内存。 #### 3. **主要区别对比** | **对比维度** | **DMA** | **中断方式** | |--------------------|----------------------------------|----------------------------------| | **CPU参与度** | 仅配置参数和接收完成通知 | 全程参与每次数据传输 | | **效率** | 适合大批量数据(如视频流、磁盘I/O) | 适合小数据量或高实时性场景(如按键) | | **系统开销** | 减少CPU占用,提升整体吞吐量 | 频繁中断导致CPU负载高 | | **中断频率** | 仅传输完成时触发一次中断 | 每次数据传输均触发中断 | #### 4. **工作流程示例** - **DMA传输流程**: 1. CPU配置DMA控制器(源地址、目标地址、数据长度)。 2. 外设发起传输请求,DMA控制器接管总线。 3. 数据直接在内存与外设间传输。 4. 传输完成后,DMA控制器触发中断通知CPU。 - **中断方式流程**: 1. 外设数据就绪,向CPU发送中断请求。 2. CPU暂停当前任务,执行ISR读取数据。 3. ISR结束后,CPU恢复原任务。 #### 5. **应用场景** - **DMA**:网络数据包传输、音频/视频流处理、高速存储设备(SSD)。 - **中断方式**:键盘输入、传感器信号采集、低速率通信(如UART)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值