DMA 简单的介绍

转载至:http://share.onlinesjtu.com/mod/tab/view.php?id=273

DMA方式是一种完全由硬件执行I/O交换的工作方式。在这种方式中,DMA控制器从CPU完全接管对总线的控制,数据交换不经过CPU,而直接在主存和I/O设备之间进行。DMA控制器向主存发出地址和控制信号,修改主存地址,对传送的字的个数进行计数,并且以中断方式向CPU报告传送操作的结束。DMA方式控制简单,适用于高数据传输率设备进行成组传送。

DMA方式的主要优点是速度快,由于CPU不参加传送操作,因此省去了CPU取指令、取数、送数等操作,也没有保存现场、恢复现场之类的工作。而且,主存地址的修改、传送字个数的计数等也不由软件实现,而是用硬件线路直接实现的。所以,DMA方式能够满足高速I/O设备的要求,也有利于CPU效率的发挥,一般用于高速传送成组数据。

DMA方式的工作过程如下:首先,当要求通过DMA方式传输数据时,DMA控制器向CPU发出请求,CPU释放总线控制权,交由DMA控制器管理;然后,DMA控制器向外设返回一个应答信号,外设与主存开始进行数据交换;最后,当数据传输完毕后,DMA控制器把总线控制权交还给CPU。在这种方式下,DMA控制器与CPU分时使用总线,其时间图如图7-7所示。



在DMA方式中,批量数据传送前的准备工作,以及传送结束后的处理工作,仍由CPU通过执行管理程序来承担,DMA控制器只负责具体的数据传送工作。

一次DMA数据块传送过程可分为三个阶段:传送前预处理、正式传送、传送后处理,如图7-8所示。



1)预处理阶段

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

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

2)正式传送阶段

当外围设备发出DMA请求时,CPU在本机器周期执行结束后响应该请求,并使CPU的总线驱动器处于第三态(高阻状态)。之后,CPU与系统总线相脱离,而DMA控制器则接管数据总线与地址总线的控制,并向主存提供地址,于是在主存与外围设备之间进行数据交换。每交换一个字,地址计数器和字计数器加“1”,当字计数器溢出时,DMA操作结束,DMA控制器向CPU发出中断报告。

DMA数据传送是以数据块为基本单位进行的,因此,每次DMA控制器占用总线后,无论是数据输入操作,还是输出操作,都是通过循环来实现的。当进行输入操作时,外围设备的数据(一次一个字或一个字节)传向主存;当进行输出操作时,主存的数据传向外围设备。

3)后处理阶段

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

基本DMA控制器与系统的连接方式有两种,一种是公用的DMA请求方式,另一种是独立的DMA请求方式。


最简单的DMA控制器,一个控制器只控制一个I/O设备,而在实际应用中情况要复杂得多,因此通常采用选择型DMA控制器和多路型DMA控制器。

1. 选择型DMA控制器

选择型DMA控制器在物理上可以连接多个设备,而在逻辑上只允许连接一个设备。换句话说,在某一个时间段内只能为一个设备提供服务。

选择型DMA控制器的工作原理与基本DMA控制器大致相同。除了前面提到的基本逻辑部件外,还有一个设备号寄存器。数据传送是以数据块为单位进行的,在每个数据块传送之前的预置阶段,除了用程序中的I/O指令给出数据块的传送个数、起始地址、操作命令外,还要给出所选择的设备号。从预置开始,一直到这个数据块传送结束,DMA控制器只为所选的设备提供服务。下一次预置时再根据I/O指令指出的设备号,为所选择的另一设备提供服务。显然,选择型DMA控制器相当于一个逻辑开关,根据I/O指令来控制此开关与某个设备连接。

选择型DMA控制器只增加了少量的硬件就达到为多个外围设备提供服务的目的,它特别适合于数据传输率很高甚至接近于主存存取速度的设备,在高速传送完一个数据块后,控制器又可为其他设备提供服务。

2. 多路型DMA控制器

与选择型DMA方式相比,多路型DMA不仅在物理上可以连接多个外围设备,而且在逻辑上也允许这些外围设备同时工作,各个设备以字节交叉方式通过DMA控制器进行数据传送。

多路型DMA控制器适合于同时为多个慢速外围设备提供服务。

多路型DMA控制器可以对多个独立的DMA通路进行控制。当某个外围设备请求DMA服务时,操作过程如下:

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

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

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

以上是一个DMA请求的过程,在一批数据传送过程中,要多次重复上述过程,直到外围设备表示一个数据块已传送完毕,或该设备的长度控制器判定传送长度已满。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在STM32中,ADC(模数转换器)和DMA(直接内存访问)可以结合使用,以实现高效的数据采集和传输。下面是一个关于STM32 ADC和DMA简单介绍: 1. 配置ADC通道: 在使用ADC之前,需要配置ADC通道以选择要采集的模拟信号。可以使用HAL库提供的函数进行配置,例如: ```c ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; HAL_ADC_ConfigChannel(&hadc1, &sConfig); ``` 2. 配置DMA通道: 在使用DMA进行数据传输之前,需要配置DMA通道以指定数据的源和目的地。可以使用HAL库提供的函数进行配置,例如: ```c DMA_HandleTypeDef hdma_adc1 = {0}; hdma_adc1.Instance = DMA1_Channel1; hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_adc1.Init.Mode = DMA_CIRCULAR; hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH; HAL_DMA_Init(&hdma_adc1); ``` 3. 启动ADC和DMA: 在配置完ADC和DMA之后,可以使用HAL库提供的函数启动ADC和DMA,例如: ```c HAL_ADC_Start(&hadc1); HAL_ADCEx_MultiModeStart_DMA(&hadc1, adc_buffer, 300); ``` 以上是关于STM32 ADC和DMA简单介绍。通过配置ADC通道和DMA通道,并启动ADC和DMA,可以实现高效的模拟信号采集和传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值