




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
DMA简介(1)DMA,全称为:Direct Memory Access(即直接存储器访问),DMA 用来提供在外设和存储器之间、存储器和存储器之间的高速数据传输。当 CPU 初始化这个传输动作,传输动作本身是由DMA控制器 来实行和完成。DMA传输对于高效能嵌入式系统算法和网络是很重要的,因为DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,而是直接通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。STM32 最多有 2 个 DMA 控制器(DMA2 仅存在大容量产品中),DMA1 有 7 个通道(如上图所示),DMA2 有 5个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。 例如,在通道 1 上有以下几个DMA请求:ADC1、 TIM2_CH3、 TIM4_CH1。由上可知,每一条独立的DMA通道都对应着若干个可以产生DMA请求的内置外设,这些DMA请求信号通过逻辑或后输出到对应的DMA通道上,如通道1就是由ADC1、 TIM2_CH3和 TIM4_CH1产生的DMA请求信号通过逻辑或后输出到通道1上,所以每一条通道任意一个时刻只能输出一个DMA请求(由于逻辑或是只要有一个请求信号便会输出到通道上,意味着在出现两个或以上的DMA请求信号的情况下无法分别到底是哪个外设的请求,因此,我们在使用某一条通道时,应尽可能做到只有一个外设的DMA请求或者时分复用)。仲裁器是用来协调各个 DMA 通道的优先级(这里我们所说的优先级指的是DMA通道的优先级,而不是来自外设的DMA请求的优先级)。然后,再由仲裁器根据优先级来处理各个通道的从外设(TIMx、ADC、SPIx、I2Cx 和 USARTx)产生的 DMA 请求,通过逻辑或输入到DMA 控制器,这就意味着同时只能有一个请求有效(从7个通道输出的请求信号只有一个有效)。外设的 DMA 请求可以通过设置相应的外设寄存器中的控制位,被独立地开启或关闭。下表是 DMA1 各通道一览表:上表中的各个DMA通道所对应的DMA请求信号的逻辑或,如下图所示,例如:在通道 1 上的几个DMA请求信号(ADC1、 TIM2_CH3、 TIM4_CH1),这几个DMA请求是通过逻辑或后输出到通道 1 的(见下图),这样我们在同一时间,就只能使处理其中一个DMA请求,其他通道也是类似的情况。DMA寄存器注意: 下面所列举的所有寄存器中,所有与通道6和通道7相关的位,对DMA2都不适用(因为DMA2只有5个通道,而且不是所有型号的STM32都有DMA2)1.DMA 中断状态寄存器(DMA_ISR)如果开启了 DMA_ISR 寄存器中所描述的事件(三个事件:传输错误、传输过半、传输完成)的中断,在达到条件后(标志位置1)就会跳到中断服务函数里面去;如果没开启中断,我们也可以通过查询这些标志位来获得当前 DMA 传输的状态。这里常用的是TCIFx(传输完成标志位,即标志着DMA通道传输完成与否)。上述所说的事件有以下:1. 通道X传输错误标志位 :表示传输过程出现错误。2. 通道X半传输标志位 :表示数据传输了一半。3. 通道X传输完成标志位 :表示数据传输完成。4. 通道X全局中断标志位 :上述三个事件任意一个有效,该位都会置位,产生中断请求(若开了中断的话)。注意:这个寄存器为只读寄存器,所以在这些位被置位之后,只能通过其他的操作来清零(在DMA_IFCR对应位写一来清零)。2.DMA 中断标志清除寄存器(DMA_IFCR)。 该寄存器是用来清除寄存器DMA_ISR中相应的标志位的(通过写1来清0)。由软件清零或置位3. DMA通道x传输数量寄存器:DMA_CNDTRX (x=17)用低16位来表示要传输的字节数量:可以是065535。通道开启后该寄存器变为只读,指示剩余的待传输的字节数目,寄存器内容在每次DMA传输后递减。数据传输结束后,寄存器的内容或者变为0;或者当该通道配置为自动重加载模式(即循环模式)时,这个寄存器的内容将被自动重新加载为之前配置的数值。当寄存器的内容为0时,无论通道是否开启,都不会发生任何数据传输。注意:每次DMA传输的字节数是由通道配置寄存器DMA_CCRx中的PSIZE和MSIZE共同决定的(一般它们的值是相等),可以是8位(字节)、16位(半字)或者32位(字)。此时DMA_CNDTRx中相应减少的值为1、2、4。4. DMA通道x配置寄存器:DMA_CCRx(x=17) 该寄存器共有7个,每一个对应一条DMA通道 。作用由下图所示:5. 两个地址寄存器:作为数据传输的源或者目标。DMA简介(2)根据芯片型号的不同,stm32 中最多可以配置两个独立的DMA控制器,分别为DMA1和DMA2。他们中的每条通道都分别连接到了不同的外设,其中DMA1有7个通道,DMA2有5个通道,尽管通道之间独立,但是在同一时刻只能处理一条通道的请求(12条中的一条)。DMA的特点:是在脱离CPU的情况下直接利用数据总线在外设和存储器之间进行数据传输。解放了CPU在数据传输过程中的消耗。DMA的工作机制:类似于中断响应。当外设的DMA事件产生后就产生DMA请求,DMA控制器根据优先级选择相应DMA通道的请求,执行数据传输。在使用DMA通道进行数据传输前,要进行以下配置:1.优先级配置分为软件和硬件两件配置两种,软件配置有4种优先级的等级(在DMA_CCRx中设置PL1:0):00:低 ;01:中; 10:高; 11:最高。可见,软件设置的优先级数目比实际的DMA通道数目少,所以硬件优先级的判定就是在两个通道的软件优先级一样的情况下,比较通道号,序号低的具有更高的优先级。2.数据传输设置一旦DMA响应了某个外设的请求,就要开始在外设与存储器之间传输数据。这时,要提供数据传输所用的源地址和目标地址,其中DMA_CPARx寄存器中设置外设地址,在DMA_CMARx寄存器中设置数据存储器地址(这两个地址谁为源地址,谁为目标地址。是由传输方向决定的),然后在DMA_CCARx寄存器的DIR中设置传输的方向。在DMA_CCRx寄存器中的PSIZE 和MSIZE位分别设置外设和存储器的位宽,这个位宽指的是每次DMA传输的位数(8、16、32)。一般要保持两个位宽一致,在手册中也有提到,半字传输不会出错。3.传输模式一般一次请求会连续的传输一串数据,这是通过设置DMA_CNDTRx设置传输数据量,每传输一个字节数据将会递减1(但不规定每次只能传输一个字节,具体是根据位宽决定)。根据DMA_CCRx寄存器中所设置的PINC和MINC标志位设定是否开启增量模式(若不开启,发送方只会传输同一地址的内容;而接收方会在同一地址中一直重复覆盖内容)。在开启了增量的条件下,将会根据位宽对地址进行增减。循环:DMA_CCRx寄存器中的CIRC设置是否开启循环模式,如果开启将会在一次请求传输完毕之后,自动复位计数值和地址(即三个寄存器被重新赋值),重新开始传输。4.存储器之间的互传(单指SRAM到SRAM)存储器之间的互传是通过设置DMA_CCRx寄存器中的MEM2MEM位来使能的(但前提是DMA_CCRx寄存器中的EN位使能启动DMA通道),满足上述两个条件,DMA控制器将马上开始传输数据。此时,通道x的外设地址寄存器DMA_CPARx暂时用来存放其中之一的存储器地址,传输方向也是根据DIR位来决定。所以,存在以下两种情况:1. 硬件请求:DMA通道将硬件请求分配给了芯片的内置外设(此时,地址寄存器DMA_CPARx存放外设数据存储器的地址)。2. 软件启动:存储器之间互传属于软件启动,满足EN位置位+MEM2MEM位置位,便可以传输数据。(此时,地址寄存器DMA_CPARx存放的是存储器的地址)。注意: 这种模式不能与循环模式同时使用。5.DMA的中断请求如下图所示,产生DMA中断的事件有三个,分别是传输过半、传输完成、传输错误,都连接在一个中断通道上(详见中断向量表)。所以,我们可以通过配置让数据传输完成后进入中断服务函数(对应事件是传输完成),进行数据处理。如AD采样传输到存储器之后,进行软件滤波,均值等,当然也可以用查询方式(查询DMA_ISR中的相应位)。DMA配置叙述:程序部分讲解(库函数)过程:怎样启用DMA?首先,众所周知的是初始化,任何设备启用前都要对其进行初始化,要对模块初始化,还要先了解该模块相应的结构及其函数,以便正确的设置;由于DMA较为复杂,我就只谈谈DMA的基本结构和和常用函数,这些都是ST公司提供在库函数中的。注意:在这里没有说明中断服务函数,而我们要了解清除事件的标志位是在DMA的中断服务函数中。typedef struct u32 DMA_PeripheralBaseAddr; / 以定义DMA外设基地址u32 DMA_MemoryBaseAddr; /以定义DMA内存基地址u32 DMA_DIR ; /用来定义传输方向u32 DMA_BufferSize; /用来定义总共传输的数据的大小u32 DMA_PeripheralInc; /用来设定外设地址寄存器递增与否u32 DMA_MemoryInc; /用来设定内存地址寄存器递增与否 u32 DMA_PeripheralDataSize; /设定了外设数据宽度u32 DMA_MemoryDataSize; /设定了外设数据宽度u32 DMA_Mode; /用来定义工作模式:循环缓存模式或者正常缓存模式 u32 DMA_Priority; /设定DMA通道x的软件优先级u32 DMA_M2M; /是否开启存储器之间的传输 DMA_InitTypeDef; 上述的结构体说明了我们在使用DMA传输数据前所需要配置的东西。下面代码是一个标准DMA设置: 具体的库函数的作用详见固件函数库手册。如:函数DMA_DeInit(通道x),是将通道x设置为缺省值(默认值)。1. voidDma_Init(void)2. 3. DMA_InitTypeDefDMA_InitStructure;4. 5. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);6.7. /*DMAchannel1configuration*/8. DMA_DeInit(DMA1_Channel1);9. DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)SRC_Const_Buffer;/外设地址 10. DMA_InitStructure.DMA_MemoryBaseAddr=(u32)DST_Buffer;/内存地址11. DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC; /外设作为DMA的源端 12. DMA_InitStructure.DMA_BufferSize=BufferSize; /传输大小13. DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Enable;/外设地址增加14. DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;/内存地址自增使能 15. DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Word;16. DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Word;17. DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;/正常模式,只传送一次;18. DMA_InitStructure.DMA_Priority=DMA_Priority_High;19. DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;20. DMA_Init(DMA1_Channel1,&DMA_InitStructure);21. 22. /*EnableDMAChannel1TransferCompleteinterrupt*/23. DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);24. /使能指定的通道的具体事件的中断,DMA_IT_TC指的是传输完成25. 26. /*GetCurrentDataCountervaluebeforetransferbegins*/27. CurrDataCounter=DMA_GetCurrDataCounter(DMA1_Channel1);28. /返回当前DMA通道x剩余的待传输数据数目29. 30. /*EnableDMAChannel1transfer*/31. DMA_Cmd(DMA1_Channel1,ENABLE);/使能指定的通道132. 33. 外设的DMA请求映像我们知道stm32的内置外设是可以产生硬件的DMA请求信号的,那么是怎么产生的呢?其实是通过库函数来实现的。见下面的介绍:要使DMA与外设建立有效连接,这不是DMA自身的事情,是各个外设的事情,每个外设都有 一个xxx_DMACmd(XXXx,Enable )函数,如果要使DMA与ADC建立有效联系,就使用 ADC_DMACmd函数,那么只需执行 : ADC_DMACmd(参数1,参数2);/使能或者失能指定的ADC的DMA请求,其他外
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 石油钻采设备调试工艺考核试卷及答案
- 橡胶成型工艺优化考核试卷及答案
- 齿轮精铣抛光修整工艺考核试卷及答案
- 小学生健康教育知识试题及答案
- 电子商务运营与管理练习题及答案
- 木材干燥防虫蛀工艺考核试卷及答案
- 雕塑焊接技术考核试卷及答案
- 牛只饲养饲养场管理工艺考核试卷及答案
- 2025年社会工作师综合能力中级试题及答案
- 铅锌矿浮选设备设备除锈工艺考核试卷及答案
- 住建局条文解读新规JGJT46-2024《施工现场临时用电安全技术标准》
- 叉车装卸货合同范例
- 电力设备运行与维护管理手册
- 工程审计课程设计
- 附件2:慢病管理中心评审实施细则2024年修订版
- 食品安全制度管理目录
- (正式版)SH∕T 3548-2024 石油化工涂料防腐蚀工程施工及验收规范
- 医院科研诚信课件
- 小学校园安全知识
- 智慧体育公园项目可行性研究报告
- 儿童视角下幼儿园班级主题墙创设的策略研究
评论
0/150
提交评论