第十四章 DMA原理和应用_第1页
第十四章 DMA原理和应用_第2页
第十四章 DMA原理和应用_第3页
第十四章 DMA原理和应用_第4页
第十四章 DMA原理和应用_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第十四章DMA原理和应用何宾2023.09教学目标直接存储器访问(DirectMemoryAccess,DMA)是计算机系统具有的一个重要特性在STC32G系列单片机中提供了DMA的功能,使得单片机系统的吞吐量显著提高,进一步提高了单片机系统并行工作的能力主要内容DMA的基本概念STC32G系列单片机DMA设计实例:存储器到存储器的DMA实现DMA的基本概念DMA是计算机系统具备的一个重要特性,允许某些硬件系统在没有中央处理单元(CentralProcessingUnit,CPU)的干预下访问主系统存储器DMA的基本概念在本书前面介绍单片机的输入/输出(比如定时器/计数器、通用异步串行收发器、模拟-数字转换器)时,CPU与这些输入/输出设备(简称外设)进行交互的方式,主要是通过读写寄存器实现的DMA的基本概念典型的,当CPU要想往通用异步串行收发器的发送数据缓冲区写数据可通过下面两种方法:通过不断访问串口控制寄存器的SCON的TI/SCON.1位,来确定发送缓冲区是否为“空”一旦发现TI/SCON.1位为“1”,则表示发送缓冲区为空,这时候CPU就可以将要发送的数据写到串口的发送数据缓冲区中,这就是通常所说的“轮询”方式轮询方式是CPU和外设进行交互的最简单方式,但是这种方式的效率最低。由于CPU不断地轮询外设的寄存器,使得无法释放CPU资源来处理其他任务,其他任务得不到CPU的及时响应和处理DMA的基本概念通过中断服务程序/中断句柄进行处理当在主程序中使能发送缓冲区为空时产生中断请求,并且使能CPU响应该中断请求时,一旦发送缓冲区为空,程序就跳到中断服务程序/中断句柄中,在中断服务程序/中断句柄中,将要发送的数据写到发送缓冲区中。中断是CPU和外设进行交互的另一种方式,这种方式的效率比轮询要高。这是因为,只有当发送缓冲区为空的时候,才需要CPU通过访问中断服务程序/中断句柄来发送数据。当没有中断产生时,也就是发送数据缓冲区不为空时,CPU可以通过运行主程序来处理其他任务但是,采用中断的方式执行CPU和外设的交互,也会有一定的问题。这是因为,如果有多个中断需要处理的时候,CPU就会被频繁的打断,使得CPU的运行效率降低。这是因为,当打断CPU的时候,需要执行保存现场的操作DMA的基本概念综上所述,不管采用轮询方式还是中断方式来执行CPU和外设之间的交互,都需要CPU的“干预”只要有CPU的“干预”,就会降低整个系统的性能那问题是,能不能想办法不让CPU进行干预呢?这就是DMA的“功劳”,DMA的引入,使得在没有CPU的干预下,实现储存器和外设之间的直接数据传输采用DMA的方式执行外设的交互是效率最高的比如,预先将要发送的数据保存到数据存储器中,当需要将这些数据发送到串口时,在DMA的控制下,将数据存储器中保存的数据直接写到串口的发送数据缓冲区中DMA的基本概念在这个过程中,没有CPU的参与/干预,CPU可以专心的处理其他任务,就好像CPU并不知道在这期间已经实现了将数据存储器中的数据写到串口数据发送缓冲区这样,CPU处理其他任务和数据从存储器写到串口发送数据缓冲区这两个“任务”是在相同的时间间隔内发生的通过这个例子可知,CPU与存储器和外设数据传输是并行执行的,进一步提高了整个系统的吞吐量DMA的基本概念通常,将用于实现DMA的控制单元称为DMA控制器(DMAController,DMAC)在一个存在DMAC的计算机系统中,实际上是有两个主设备,一个是CPU,另一个是DMA下面通过STC32G系列单片机来具体说明DMA的实现方式STC32G系列单片机DMA本节介绍STC32G单片机内DMA的原理和所支持的DMA类型STC32G系列单片机DMA

--DMA结构再次观察STC32G系列单片机的内部结构。从图中可知CPU连接到32/16/8/1位数据总线(DataBus)和24位的地址总线(AddressBus)STC32G系列单片机内的所有外设通过外设接口单元(PeripheralInterfaceUnit,PIU)连接到32/16/8/1位数据总线和24位的地址总线片内的XDATA区域的8KB扩展数据存储器连接到32/16/8/1位数据总线和24位的地址总线STC32G系列单片机DMA

--DMA结构DMA控制单元(DMAControlUnit,DMACU)有下面三个连接:DMACU连接到XDATA区域的片内数据存储器DMACU连接到32/16/8/1位数据总线和24位地址总线DMACU连接到ADC、I2C、LCM、HSSPI、USART1、USART2、UART3和UART4STC32G系列单片机DMA

--DMA结构在STC32G系列单片机中,CPU和DMA均为32/16/8/1位数据总线和24位地址总线的主设备当XDATA区域的数据存储器和外设(包括ADC、I2C、LCM、HSSPI、USART1、USART2、UART3和UART4)之间有数据移动(包括将数据从数据存储器移动到外设或将数据从外设移动到数据存储器)的要求时,DMACU向CPU发出使用32/16/8位数据总线和24位地址总线的请求,如果CPU同意DMACU控制32/16/8/1位数据总线和24位地址总线时,则CPU暂时放弃对32/16/8/1位数据总线和24位地址总线的“控制权”,此时DMACU掌管了对32/16/8/1位数据总线和24位地址总线的控制权STC32G系列单片机DMA

--DMA结构在DMACU的控制下,XDATA区域的数据存储器和相应的外设之间建立和数据的传输通道(包括32/16/8/1位数据总线和24位地址总线)。当XDATA区域的数据存储器和相应的外设之间传输完数据后,DMACU通知CPU数据传输已经结束,此时CPU将重新获得对32/16/8/1位数据总线和24位地址总线的“控制权”STC32G系列单片机DMA

--DMA类型在STC32G系列单片机中,支持的DMA类型包括:

M2M_DMA。XDATA数据存储器到XDATA数据存储器的数据读写ADC_DMA。自动扫描使能的ADC通道并将转换后的ADC结果自动保存到XDATA数据存储器SPI_DMA。自动交换XDATA数据存储器和SPI外设之间的数据URIT_DMA。自动将XDATA数据存储器的数据通过串口1发送出去URIR_DMA。自动将串口1接收到的数据保存到XDATA数据存储器STC32G系列单片机DMA

--DMA类型UR2T_DMA。自动将XDATA数据存储器的数据通过串口2发送出去UR2R_DMA。自动将串口2接收到的数据保存到XDATA数据存储器UR3T_DMA。自动将XDATA数据存储器的数据通过串口3发送出去UR3R_DMA。自动将串口3接收到的数据保存到XDATA数据存储器UR4T_DMA。自动将XDATA数据存储器的数据通过串口4发送出去STC32G系列单片机DMA

--DMA类型UR4R_DMA。自动将串口3接收到的数据保存到XDATA数据存储器LCM_DMA。自动交换XDATA数据存储器和LCM设备之间的数据I2CT_DMA。自动将XDATA数据存储器的数据通过I2C接口发送出去I2CR_DMA。自动将I2C接口接收到的数据保存到XDATA数据存储器I2ST_DMA。自动将XDATA数据存储器的数据通过I2S接口发送出去STC32G系列单片机DMA

--DMA类型I2SR_DMA。自动将I2S接口接收到的数据保存到XDATA数据存储器对于上面的DMA传输来说,每次DMA数据传输最大的数据量为65536个字节STC32G系列单片机DMA

--DMA类型在STC32G系列单片机中,每个DMA类型对XDATA数据存储器的读/写操作都可以设置四级访问优先级硬件自动进行XDATA数据存储器总线的访问仲裁,而不会影响CPU对XDATA数据存储器的访问相同优先级下,不同DMA对XDATA数据存储器的访问顺序如下:M2M_DMA、ADC_DMA、SPI_DMA、UR1R_DMA、UR1T_DMA、UR2R_DMA、UR2T_DMA、UR3R_DMA、UR3T_DMA、UR4R_DMA、UR4T_DMA、LCM_DMA、I2CR_DMA、I2CT_DMA、I2SR_DMA、I2ST_DMA设计实例:存储器到存储器的DMA实现本节将通过设计实例,说明存储器到存储器数据移动的DMA实现在该设计实例中,将要发送的数据保存在一个数组中,通过存储器到存储器的DMA,将这些数据搬移到另一个数组中该设计实例中,在将一批数据从一个数组通过DMA搬移到另一个数组的过程中,CPU没有参与/干预这个过程设计实例:存储器到存储器的DMA实现

--相关寄存器本节介绍与存储器到存储器DMA传输有关的寄存器。对于其他类型DMA传输的寄存器,请读者参考STC32G系列单片机技术参考手册第28章相关寄存器

--M2M_DMA配置寄存器(DMA_M2M_CFG)该寄存器位于XSFR地址为0x7EFA00的位置。当复位后,该寄存器的内容为“0x000000”M2MIEM2M_DMA中断使能控制位。当该位为“0”时,禁止M2M_DMA中断;当该位为“1”时,允许M2M_DMA中断TXACOM2M_DMA源地址(读取地址)改变方向。当该位为“0”时,数据读取完成后地址自动递增;当该位为“1”时,数据读取完成后地址自动递减位索引76543210名字M2MIE—TXACORXACOM2MIP[1:0]M2MPTY[1:0]相关寄存器

--M2M_DMA配置寄存器(DMA_M2M_CFG)RXACOM2M_DMA目标地址(写入地址)改变方向。当该位为“0”时,数据写入完成后地址自动递增;当该位为“1”时,数据写入完成后地址自动递减M2MIP[1:0]M2M_DMA中断优先级控制位M2MIP[1:0]中断优先级00最低级(0)01较低级(1)10较高级(2)11最高级(3)相关寄存器

--M2M_DMA配置寄存器(DMA_M2M_CFG)M2MPTY[1:0]M2M_DMA数据总线访问优先级控制位M2MPTY[1:0]总线优先级00最低级(0)01较低级(1)10较高级(2)11最高级(3)相关寄存器

--M2M_DMA控制器寄存器(DMA_M2M_CR)该寄存器位于XSFR地址为0x7EFA01的位置。当复位后,该寄存器的内容为“00xxxxxx”ENM2MM2M_DMA功能使能控制位。当该位为“0“时,禁止M2M_DMA功能。当该位为”1“时,允许M2M_DMA功能TRIGM2M_DMA数据读写触发控制位。当该位为“0”时,写“0“无效;当该位为”1“时,启动M2M_DMA操作位索引76543210名字ENM2MTRIG——————相关寄存器

--M2M_DMA状态寄存器(DMA_M2M_STA)该寄存器位于XSFR地址为0x7EFA02的位置。当复位后,该寄存器的内容为“xxxxxxx0”M2MIFM2M_DMA中断请求标志位,当M2M_DMA操作完成后,硬件自动将M2MIF置”1”,若使能M2M_DMA中断则进入中断服务程序。标志位需软件清零位索引76543210名字———————M2MIF相关寄存器

--

M2M_DMA传输总字节寄存器(

DMA_M2M_AMT和DMA_M2M_AMTH)M2M_DMA传输总字节寄存器DMA_M2M_AMT和DMA_M2M_AMTH这两个寄存器分别位于XSFR地址为0x7EFA03和0x7EFA80的位置。当复位后,这两个寄存器的内容均为“00000000”注:实际读写的字节数为(AMT+1),即当{AMT[15:8],AMT[7:0]}=0时,表示实际传输总字节为1个字节;当{AMT[15:8],AMT[7:0]}=255时,表示实际传输总字节为256个字节位索引76543210名字AMT[7:0]位索引76543210名字AMT[15:8]相关寄存器

--

M2M_DMA传输完成字节寄存器

(DMA_M2M_DONE和DMA_M2M_DONEH)M2M_DMA传输完成字节寄存器DMA_M2M_DONE和DMA_M2M_DONEH这两个寄存器分别位于XSFR地址为0x7EFA04和0x7EFA81的位置。当复位后,这两个寄存器的内容均为“00000000”{DONE[15:8],DONE[7:0]}构成16位已经读写完成的字节数位索引76543210名字DONE[7:0]位索引76543210名字DONE[15:8]相关寄存器

--

M2M_DMA发送地址寄存器

(DMA_M2M_TXAH和DMA_M2M_TXAL)M2M_DMA发送地址寄存器DMA_M2M_TXAH和DMA_M2M_TXAL这两个寄存器分别位于XSFR地址为0x7EFA05和0x7EFA06的位置。当复位后,这两个寄存器的内容均为“00000000”{ADDR[15:8],ADDR[7:0]}构成16位的发送/源地址。当执行M2M_DMA操作时,会从该地址开始读取数据位索引76543210名字ADDR[15:8]位索引76543210名字ADDR[7:0]相关寄存器

--

M2M_DMA接收地址寄存器

(DMA_M2M_RXAH和DMA_M2M_RXAL)M2M_DMA接收地址寄存器DMA_M2M_RXAH和DMA_M2M_RXAL这两个寄存器分别位于XSFR地址为0x7EFA07和0x7EFA08的位置。当复位后,这两个寄存器的内容均为“00000000”{ADDR[15:8],ADDR[7:0]}构成16位的接收/目的地址。当执行M2M_DMA操作时,会从该地址开始写入数据位索引76543210名字ADDR[15:8]位索引76543210名字ADDR[7:0]设计实例:存储器到存储器的DMA实现

--添加isr.asm文件CSEG AT017BH;定位到程序存储器的地址0x17BJMP M2MBMM_ISR;跳转到标号M2MBMM_ISR的位置M2MBMM_ISR:;标号M2MBMM_ISRJMP 006BH;跳转到0x6B的位置END;结束设计实例:存储器到存储器的DMA实现

--修改main.c文件#include"uart.h"//包含头文件uart.hbit DmaFlag;//声明全局位类型变量DmaFlag

/*********定义全局数组DmaTxBuffer,数据源***********/u8xdataDmaTxBuffer[256];/********定义全局数组DmaRxBuffer,数据目的**********/u8xdataDmaRxBuffer[256];voidDMA_Config(void){DMA_M2M_CFG=0x80;//使能DMA_M2M中断,地址递增DMA_M2M_STA=0x00;//将DMA_M2M中断请求标志清零设计实例:存储器到存储器的DMA实现

--修改main.c文件DMA_M2M_AMT=0x7f;//设置传输总字节数:0x7f+1=128/*****DmaTxBuffer地址高8位保存到DMA_M2M_TXAH*****/DMA_M2M_TXAH=(u8)((u16)&DmaTxBuffer>>8);/*****DmaTxBuffer地址低8位保存到DMA_M2M_TXAL*****/DMA_M2M_TXAL=(u8)((u16)&DmaTxBuffer);/*****DmaRxBuffer地址高8位保存到DMA_M2M_RXAH****/DMA_M2M_RXAH=(u8)((u16)&DmaRxBuffer>>8);/*****DmaRxBuffer地址低8位保存到DMA_M2M_RXAL*****/DMA_M2M_RXAL=(u8)((u16)&DmaRxBuffer);/*****允许M2MDMA功能,且使能M2MDMA传输********/DMA_M2M_CR=0xc0;}设计实例:存储器到存储器的DMA实现

--修改main.c文件/*******定义M2M_DMA中断句柄,使用保留中断号13********/voidM2M_DMA_Interrupt(void)interrupt13{/*****判断是否完成数据从源到目的的DMA传输*******/if(DMA_M2M_STA&0x01) {/********如果完成,则将DMA_MEM中断标志清零*******/DMA_M2M_STA&=~0x01; DmaFlag=1;//标志DmaFlag设置为“1”}}设计实例:存储器到存储器的DMA实现

--修改main.c文件voidmain()//定义main主函数{u16i;//定义无符号16位整型变量i DmaFlag=0;//标志DmaFlag清零 WTST=0;//设置程序指令延时参数,最快EAXFR=1;//扩展寄存器(XSFR)访问使能CKCON=0;//提高访问XRAM速度

MCU_init();//调用函数MCU_init(),初始化MCUI/O驱动模式设计实例:存储器到存储器的DMA实现

--修改main.c文件

for(i=0;i<256;i++)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论