DMA的控制方式

转自:http://www.worlduc.com/blog.aspx?bid=3791093


DMA的控制方式


DMA方式的基本概念  

直接内存访问(DMA)是一种完全由硬件执行I/O交换的工作方式。在这种方式中,DMA控制器从CPU完全接管对总线的控制,数据交换不经过CPU,而直接在内存和I/O设

                                       备之间进行 。

DMA方式的主要优点是速度快。由于CPU根本不参加传送操作,因此就省去了CPU取指令、取数、送数等操作。

多种DMA至少能执行以下一些基本操作:

         (1)从外围设备发出DMA请求;

         (2)CPU响应请求,把CPU工作改成DMA操作方式,DMA控制器从CPU接管总线的控制;

         (3)由DMA控制器对内存寻址,即决定数据传送的内存单元地址及数据传送个数的计数,并执行数据传送的操作;

         (4)向CPU报告DMA操作的结束。

                      2.  DMA传送方式         

  DMA技术的出现,使得外围设备可以通过DMA控制器直接访问内存,与此同时,CPU可以继续执行程序。DMA控制器与CPU分时使用内存通常采用以下三种方法:

(1).停止CPU访问内存

当外围设备要求传送一批数据时,由DMA控制器发一个停止信号给CPU,要求CPU放弃对地址总线、数据总线和有关控制总线的使用权。DMA控制器获得总线控制权以后,开始进行数据传送。在一批数据传送完毕后,DMA控制器通知CPU可以使用内存,并把总线控制权交还给CPU。在这种DMA传送过程中,CPU基本处于不工作状态或者说保持状态。

(2).周期挪用

当I/O设备没有DMA请求时,CPU按程序要求访问内存;一旦I/O设备有DMA请求,则由I/O设备挪用一个或几个内存周期。

I/O设备要求DMA传送时可能遇到两种情况

u      此时CPU不需要访内,如CPU正在执行乘法指令。由于乘法指令执行时间较长,此时I/O访内与CPU访内没有冲突,即I/O设备挪用一二个内存周期对CPU执行程序没有任何影响。

u      I/O设备要求访内时CPU也要求访内,这就产生了访内冲突,在这种情况下I/O设备访内优先,因为I/O访内有时间要求,前一个I/O数据必须在下一个访内请求到来之前存取完毕。显然,在这种情况下I/O 设备挪用一二个内存周期,意味着CPU延缓了对指令的执行,或者更明确地说,在CPU执行访内指令的过程中插入DMA请求,挪用了一二个内存周期。

(3).DMA与CPU交替访内

如果CPU的工作周期比内存存取周期长很多,此时采用交替访内的方法可以使DMA传送和CPU同时发挥最高的效率。 

3.  基本的DMA控制器      

(1).DMA控制器的基本组成

一个DMA控制器,实际上是采用DMA方式的外围设备与系统总线之间的接口电路。这个接口电路是在中断接口的基础上再加DMA机构组成

一个最简单的DMA控制器由以下逻辑部件组成:

u      内存地址计数器 用于存放内存中要交换的数据的地址。

u      字计数器 用于记录传送数据块的长度(多少字数)。

u      数据缓冲寄存器 用于暂存每次传送的数据(一个字)。

u      “DMA请求”标志 每当设备准备好一个数据字后给出一个控制信号,使“DMA请求” 标志置“1”。

u       “控制/状态”逻辑 由控制和时序电路以及状态标志等组成,用于修改内存地址计数器和字计数器,指定传送类型(输入或输出),并对“DMA请求”信号和CPU响应信号进行协调和同步。

u      中断机构 当字计数器溢出时(全0),意味着一组数据交换完毕,由溢出信号触发中断机构,向CPU提出中断报告。

(2).DMA数据传送过程

DMA的数据块传送过程可分为三个阶段:传送前预处理;正式传送;传送后处理。

u      预处理 由CPU执行几条输入输出指令,测试设备状态,向DMA控制器的设备地址寄存器中送入设备号并启动设备,向内存地址计数器中送入起始地址,向字计数器中送入交换的数据字个数。在这些工作完成后,CPU继续执行原来的主程序。

u      正式传送 当外设准备好发送数据(输入)或接受数据(输出)时,它发出DMA请求,由DMA控制器向CPU发出总线使用权的请求(HOLD)。

u      后处理 一旦DMA的中断请求得到响应,CPU停止主程序的执行,转去执行中断服务程序做一些DMA的结束处理工作。这些工作包括校验送入内存的数据是否正确;决定继续用DMA方式传送下去,还是结束传送;测试在传送过程中是否发生了错误等等。

基本DMA控制器与系统的连接方式:

(1)公用的DMA请求方式;(2)独立的DMA请求方式,这与中断方式类似。              

4.  DMA工作过程    

当某个外围设备请求DMA服务时,传送作过程如下:

u      DMA控制器接到设备发出的DMA请求时,将请求转送到CPU。

u      CPU在适当的时刻响应DMA请求。若CPU不需要占用总线则继续执行指令;若CPU需要占用 总线,则CPU进入等待状态。

u      DMA控制器接到CPU的响应信号后,进行以下工作:①对现有DMA请求中优先权最高的请求 给予DMA响应;②选择相应的地址寄存器的内容驱动地址总线;③根据所选设备操作寄存器 的内容,向总线发读、写信号;④外围设备向数据总线传送数据,或从数据总线接收数据; ⑤每个字节传送完毕后,DMA控制器使相应的地址寄存器和长度寄存器加“1”或减“1”。

u      正式传送 当外设准备好发送数据(输入)或接受数据(输出)时,它发出DMA请求,由DMA控制器向CPU发出总线使用权的请求(HOLD)。

u      后处理 一旦DMA的中断请求得到响应,CPU停止主程序的执行,转去执行中断服务程序做一些DMA的结束处理工作。这些工作包括校验送入内存的数据是否正确;决定继续用DMA方式传送下去,还是结束传送;测试在传送过程中是否发生了错误等等。

基本DMA控制器与系统的连接方式:

(1)公用的DMA请求方式;(2)独立的DMA请求方式,这与中断方式类似。              

4.  DMA工作过程    

当某个外围设备请求DMA服务时,传送作过程如下:

u      DMA控制器接到设备发出的DMA请求时,将请求转送到CPU。

u      CPU在适当的时刻响应DMA请求。若CPU不需要占用总线则继续执行指令;若CPU需要占用 总线,则CPU进入等待状态。

u      DMA控制器接到CPU的响应信号后,进行以下工作:①对现有DMA请求中优先权最高的请求 给予DMA响应;②选择相应的地址寄存器的内容驱动地址总线;③根据所选设备操作寄存器 的内容,向总线发读、写信号;④外围设备向数据总线传送数据,或从数据总线接收数据; ⑤每个字节传送完毕后,DMA控制器使相应的地址寄存器和长度寄存器加“1”或减“1”。


<think>好的,我需要回答用户关于DMA控制方式工作原理和实现方法的问题。首先,我应该回顾一下DMA的基本概念。DMA(直接存储器访问)是一种允许外设直接与内存交换数据而不需要CPU介入的技术,这样可以提高数据传输效率,减少CPU负担。 接下来,我需要整理DMA工作原理。根据用户提供的引用资料,DMA控制器有多个通道,每个通道管理特定外设的请求,并且有仲裁器处理优先级。传输模式有普通模式和循环模式,这需要详细解释。 然后,实现方法部分应该包括初始化的步骤,比如配置源地址、目标地址、传输方向等。用户提到的引用[3]中提到初始化结构体的配置,这部分需要详细说明。此外,中断使能也是关键,引用[1]提到了中断控制,需要解释如何在传输完成后处理中断。 还要注意用户提供的结构信息,比如DMA1和DMA2的不同通道数量,以及它们挂载在AHB总线上,这可能影响性能和功耗,引用[4]提到这一点。在实现方法中需要提到总线结构的影响。 另外,我需要确保使用正确的中文术语,并且按照用户的要求,行内公式用$...$,独立公式用$$...$$。虽然这个问题可能不涉及太多数学公式,但如果有的话,比如传输数据量的计算,需要正确应用格式。 最后,生成相关问题时要基于DMA的基本原理、配置步骤、传输模式和应用场景来设计,确保问题能帮助用户深入理解。同时,引用标识要自然地添加在相关段落末尾,比如在提到仲裁器时引用[2],提到传输模式时引用[3]等。 检查是否有遗漏的信息点,比如DMA工作流程步骤:请求、响应、传输、结束,这些都需要涵盖。确保回答结构清晰,分点明确,符合用户要求的系统级指令和可见层格式。</think>### DMA控制方式工作原理及实现方法 #### 一、DMA工作原理 DMA(Direct Memory Access)是一种允许外设直接与内存交换数据的技术,无需CPU参与,从而提高数据传输效率并降低CPU负载[^1]。其核心流程如下: 1. **请求阶段** 外设(如ADC、UART)通过DMA通道发送传输请求。例如,当UART接收缓冲区满时,会触发DMA请求信号。 2. **仲裁与响应** DMA控制器根据通道优先级(由仲裁器协调)响应请求,接管总线控制权。若多个请求同时发生,高优先级通道先被处理[^2]。 3. **数据传输** DMA控制器根据配置的源地址(如外设寄存器)和目标地址(如内存),直接完成数据搬运。例如: $$ \text{传输字节数} = \text{DMA\_CNDTRx} \times \text{数据宽度} $$ 每传输一次,计数器`DMA_CNDTRx`递减,直至归零[^3]。 4. **传输完成** 当计数器为0时,DMA释放总线控制权,并触发中断(若使能)。此时CPU可处理后续任务,如数据解析[^1]。 --- #### 二、DMA实现方法(以STM32为例) 1. **初始化配置** - **通道选择**:根据外设类型选择对应的DMA通道(如DMA1通道5用于UART1_TX)[^2]。 - **传输方向**:设置`DMA_DIR`为外设→内存或内存→外设。 - **数据宽度**:配置源/目标的数据宽度(8/16/32位)。 - **模式选择**: - **普通模式**:单次传输后停止,需重新使能。 - **循环模式**:计数器自动重装,适用于连续传输(如音频流)。 ```c DMA_InitTypeDef DMA_InitStruct; DMA_InitStruct.DMA_PeripheralBaseAddr = &USART1->DR; // 外设地址 DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)buffer; // 内存地址 DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC; // 传输方向 DMA_InitStruct.DMA_BufferSize = 256; // 传输次数 DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; // 循环模式 DMA_Init(DMA1_Channel4, &DMA_InitStruct); ``` 2. **中断配置** 使能传输完成中断,并在中断服务函数中处理数据: ```c DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE); // 使能传输完成中断 NVIC_EnableIRQ(DMA1_Channel4_IRQn); // 开启中断向量 ``` 3. **启动传输** 调用`DMA_Cmd()`启动DMA,外设触发请求后自动传输。 --- #### 三、关键设计特点 1. **总线架构** DMA控制器挂载在AHB总线上,与CPU并行工作,避免总线竞争,提升吞吐量[^4]。 2. **优先级机制** 每个通道可配置优先级(低/中/高/最高),仲裁器决定请求响应顺序[^2]。 3. **双缓冲技术** 结合循环模式,可在传输时操作另一块内存,避免数据覆盖。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值