stm32DMA控制器的介绍_第1页
stm32DMA控制器的介绍_第2页
stm32DMA控制器的介绍_第3页
stm32DMA控制器的介绍_第4页
stm32DMA控制器的介绍_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

....DMA简介(1)DMA,全称为:DirectMemoryAccess(即直接存储器访问),DMA在外设和存储器之间、存储器和存储器之间的高速数据传输CPU初始化这个传输动作,传输动作本身是由DMADMADMA传输方式无需CPU输,也没有中断处理方式那样保留现场和恢复现场的过程,而是直接通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,能使CPU的效率大为提高。STM32最多有2个DMA控制器(DMA2仅存在大容量产品中),DMA1有7个通道(如上图所示),DMA2有5个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。例如,在通道1上有以下几个DMA请求:ADC1、TIM2_CH3、TIM4_CH1。DMADMADMA逻辑或DMA1ADC1TIM2_CH3TIM4_CH1DMA1DMA(只要有一个请求信号便会输出到通道上,意味着DMA是哪个外设的请求DMA用)。DMA通道(DMADMA)。然后,再由仲裁器根据优先级来处理各个通道的从外设(TIMxADCSPIxI2CxUSARTx)DMA请求,通过逻辑或输入到DMA控制器,这就(7DMADMA1各通道一览表:上表中的DMADMA1上的几个DMA请求信号TIM2_CH3TIM4_CH1),这几个DMA1(见下图DMADMADMA注意67DMA2(因为DMA2只有5个通道,而且不是所有型号的STM32都有DMA2)1.DMA中断状态寄存器(DMA_ISR)如果开启了DMA_ISR寄存器中所描述的事件(三个事件:传输错误、传输过半、传输完成)的中断,在达到条件后(标志位置1)就会跳到中断服务函数里面去;如果没开启中断,我们也可以通过查询这些标志位来获得当前DMA传输的状态。这里常用的是TCIFx(传输完成标志位,即标志着DMA通道传输完成与否)。上述所说的事件有以下:1.2.1.2.3.4.XX:表示数据传输了一半。通道X传输完成标志位:表示数据传输完成。X(断的话)。(DMA_IFCR对应位写一来清零)。DMA中断标志清除寄存器(DMA_IFCR)。该寄存器是用来清除寄存器DMA_ISR中相应的标志位的(通过写1来清0)。由软件清零或置位DMAxDMA_CNDTRX(x=1…7)160~65535传输的字节数目,寄存器内容在DMA0;或者当该通道配置为自动重加载模式(即循环模式)时,这个寄存器的内容将被自动重新加载为之前配置的数0。DMADMA_CCRxPSIZEMSIZE(一般它们的值是相等),8(字节)16(半字)32(字)。此时DMA_CNDTRx1、2、4。DMAxDMA_CCRx(x=1…7)该寄存器共有7个,每一个对应一条DMA通道。作用由下图所示:两个地址寄存器:作为数据传输的源或者目标。DMA简介(2)根据芯片型号的不同,stm32DMADMA1DMA2DMA17DMA25但是在同一时刻只能处理一条通道的请求(12)。DMACPU直接利用数据总线在外设和存储器之间进行数据传输CPU在数据传输过程中的消耗。DMADMADMADMA在使用DMA通道进行数据传输前,要进行以下配置:优先级配置分为软件和硬件两件配置两种,4(DMA_CCRxPL[1:0]):00:011011:最高。可见,软件设置的优先级数目比实际的DMA硬件优先级的判定就是在两个通道的软件优先级一样的情况下,比较通道号,序号低的具有更高的优先级。数据传输设置一旦DMA响应了某个外设的请求,就要开始在外设与存储器之间传输数据。源地址和目标地址DMA_CPARx外设地址DMA_CMARx寄存器中设置数据存储器地址(这两个地址谁为源地址,谁为目标地址。是由传输方向决定的)DMA_CCARxDIR在DMA_CCRx寄存器中的PSIZE和MSIZE位分别设置外设和存储器的位宽,这个位宽指的是每次DMA传输的位数(8、16、32)。一般要保持两个位宽一致,在手册中也有提到,半字传输不会出错。传输模式DMA_CNDTRx但不规定每次只能传输一个字节,具体是根据位宽决定)。根据DMA_CCRxPINCMINC(若不开启,发送方只会传输同一地址的内容;而接收方会在同一地址中一直重复覆盖内容)根据位宽对地址进行增减。循环:DMA_CCRxCIRC自动复位计数值和地址(即三个寄存器被重新赋值),重新开始传输。存储器之间的互传(单指SRAM到SRAM)DMA_CCRxMEM2MEM的(DMA_CCRxEN使能启动DMA),此时,通道xDMA_CPARxDIR存在以下两种情况: 分配给了芯片的内置外设此时,地址寄存器DMA_CPARx设数据存储器的地址)。软件启动:EN+MEM2MEM(DMA_CPARx存放的是存储器的地址)注意:这种模式不能与循环模式同时使用。DMADMA断通道上(详见中断向量表)。所以,我们可以通过配置让数据传输完成后进入中断服务函数(对应事件是传输完成),进行数据处理。如AD(DMA_ISR应位)。DMA配置叙述:程序部分讲解(库函数)过程:怎样启用DMA?首先,众所周知的是初始化,任何设备启用前都要对其进行初始化,要对模块DMAST注意:在这里没有说明中断服务函数,而我们要了解清除事件的标志位是在DMA的中断服务函数中。typedefstruct{u32DMA_PeripheralBaseAddr; //以定义DMA外设基地u32DMA_MemoryBaseAddr; //以定义DMA内存基地址u32DMA_DIR; //用来定义传输方向u32DMA_BufferSize; //用来定义总共传输的数据的大小u32DMA_PeripheralInc; //用来设定外设地址寄存器递增与否u32DMA_MemoryInc; //用来设定内存地址寄存器递增与u32DMA_PeripheralDataSize; //设定了外设数据宽度u32DMA_MemoryDataSize; //设定了外设数据宽度u32DMA_Mode; //用来定义工作模式:循环缓存模式或者正常缓存模式u32DMA_Priority; //DMAx的软件优先级u32DMA_M2M; //是否开启存储器之间的传输}DMA_InitTypeDef;上述的结构体说明了我们在使用DMA传输数据前所需要配置的东西。下面代码是一个标准DMA设置:具体的库函数的作用详见固件函数库手册。1.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;12.DMA_InitStructure.DMA_BufferSize=BufferSize;//外设地址//内存地址外设作为A的源端传输大小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;//正常模式,只传送一次;DMA_DeInit(x),是将通道x设置为缺省值(默认值)。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.指的是传输完成25.26./*GetCurrentDataCountervaluebeforetransferbegins*/27.CurrDataCounter=DMA_GetCurrDataCounter(DMA1_Channel1);28.//返回当前DMA通道x剩余的待传输数据数目29.30./*EnableDMAChannel1transfer*/31.DMA_Cmd(DMA1_Channel1,ENABLE);//使能指定的通道132.33.}DMA请求映像stm32DMA函数来实现的。见下面的介绍:DMADMADMAADCADC_DMACmd需执行:ADC_DMACmdADCDMA情况相类似,可能存在参数数目不同,详见固件函数库。扩充:扩充:ADC_DMACmd(ADC1ENABLE);//ADC1DMA请求ADC_Cmd(ADC1

温馨提示

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

评论

0/150

提交评论