stm32--DMA控制器的介绍

上传人:卷*** 文档编号:120800468 上传时间:2022-07-18 格式:DOCX 页数:13 大小:511.18KB
返回 下载 相关 举报
stm32--DMA控制器的介绍_第1页
第1页 / 共13页
stm32--DMA控制器的介绍_第2页
第2页 / 共13页
stm32--DMA控制器的介绍_第3页
第3页 / 共13页
点击查看更多>>
资源描述
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祈求,其她外设的状况相类似,也许存在参数数目不同,详见固件函数库。扩大:ADC_DMACmd(ADC1, ENABLE);/ 使能ADC1的DMA祈求ADC_Cmd(ADC1, ENABLE);/使用之前一定要校准ADC_ResetCalibration(ADC1);/ Reset Calibration =复位校准while(ADC_GetResetCalibrationStatus(ADC1);ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1);ADC_SoftwareStartConvCmd(ADC1, ENABLE);
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 考试试卷


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!