版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章DMA控制器本章讲述了DMA控制器,包括DMA的结构和主要特征、DMA的功能描述、DMA库函数和DMA应用实例。10.1DMA的结构和主要特征DMA(DirectMemoryAccess,直接存储器存取)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输,无须CPU干预,是所有现代计算机的重要特色。在DMA模式下,CPU只需向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样在很大程度上减轻了CPU资源占有率,可以大大节省系统资源。DMA主要用于快速设备和主存储器成批交换数据的场合。在这种应用中,处理问题的出发点集中到两点:一是不能丢失快速设备提供出来的数据,二是进一步减少快速设备输入/输出操作过程中对CPU的打扰。这可以通过把这批数据的传输过程交由DMA来控制,让DMA代替CPU控制在快速设备与主存储器之间直接传输数据。当完成一批数据传输之后,快速设备还是要向CPU发一次中断请求,报告本次传输结束的同时,“请示”下一步的操作要求。STM32的两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。DMA的功能框图如图10-1所示。STM32F103VET6的DMA模块具有如下特征。1)12个独立的可配置的通道(请求):DMA1有7个通道,DMA2有5个通道。2)每个通道都直接连接专用的硬件DMA请求,每个通道都支持软件触发。这些功能通过软件来配置。3)在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有4级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,以此类推)。4)独立数据源和目标数据区的传输宽度(字节、半字、全字)是独立的,模拟打包和拆包的过程。源和目的地址必须按数据传输宽度对齐。5)支持循环的缓冲器管理。6)每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志通过逻辑“或”运算成为一个单独的中断请求。7)存储器和存储器间的传输。8)外设和存储器、存储器和外设之间的传输。9)闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。10)可编程的数据传输最大数目为65536。图10-1DMA的功能框图10.2DMA的功能描述DMA控制器和Cortex-M3核心共享系统数据总线,执行直接存储器数据传输。当CPU和DMA同时访问相同的目标(RAM或外设)时,DMA请求会暂停CPU访问系统总线若干个周期,总线仲裁器执行循环调度,以保证CPU至少可以得到一半的系统总线(存储器或外设)使用时间。发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求。当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给外设一个应答信号。当从DMA控制器得到应答信号时,外设立即释放请求。一旦外设释放请求,DMA控制器同时撤销应答信号。如果有更多的请求,外设可以在下一个周期启动请求。总之,每次DMA传送由3个操作组成:1)从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址读取数据,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元。10.2.1DMA处理2)将读取的数据保存到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元。3)执行一次DMA_CNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。仲裁器根据通道请求的优先级启动外设/存储器的访问。优先权管理分两个阶段。1)软件:每个通道的优先权可以在DMA_CCRx寄存器中的PL[1:0]设置,有4个等级:最高优先级、高优先级、中等优先级、低优先级。2)硬件:如果两个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。例如,通道2优先于通道4。DMA1控制器的优先级高于DMA2控制器的优先级。
10.2.2仲裁器每个通道都可以在有固定地址的外设寄存器和存储器之间执行DMA传输。DMA传输的数据量是可编程的,最大为65535。数据项数量寄存器包含要传输的数据项数量,在每次传输后递减。1.可编程的数据量外设和存储器的传输数据量可以通过DMA_CCRx寄存器中的PSIZE和MSIZE位编程设置。10.2.3DMA通道2.指针增量通过设置DMA_CCRx寄存器中的PINC和MINC标志位,外设和存储器的指针在每次传输后可以有选择地完成自动增量。当设置为增量模式时,下一个要传输的地址将是前一个地址加上增量值,增量值取决于所选的数据宽度为1、2或4。第一个传输的地址存放在DMA_CPARx/DMA_CMARx寄存器中。在传输过程中,这些寄存器保持它们初始的数值,软件不能改变和读出当前正在传输的地址(它在内部的当前外设/存储器地址寄存器中)。当通道配置为非循环模式时,传输结束后(即传输计数变为0)将不再产生DMA操作。要开始新的DMA传输,需要在关闭DMA通道的情况下,在DMA_CNDTRx寄存器中重新写入传输数目。在循环模式下,最后一次传输结束时,DMA_CNDTRx寄存器的内容会自动地被重新加载为其初始数值,内部的当前外设/存储器地址寄存器也被重新加载为DMA_CPARx/DMA_CMARx寄存器设定的初始基地址。3. 通道配置过程下面是配置DMA通道x的过程(x代表通道号):1)在DMA_CPARx寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将是数据传输的源或目标。2)在DMA_CMARx寄存器中设置数据存储器的地址。发生存储器数据传输请求时,传输的数据将从这个地址读出或写入这个地址。3)在DMA_CNDTRx寄存器中设置要传输的数据量。在每个数据传输后,这个数值递减。4)在DMA_CCRx寄存器的PL[1:0]位中设置通道的优先级。5)在DMA_CCRx寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、外设和存储器的数据宽度、传输一半产生中断或传输完成产生中断。6)设置DMA_CCRx寄存器的ENABLE位,启动该通道。一旦启动了DMA通道,即可响应连到该通道上的外设的DMA请求。当传输一半的数据后,半传输标志(HTIF)被置1,当设置了允许半传输中断位(HTIE)时,将产生中断请求。在数据传输结束后,传输完成标志(TCIF)被置1,如果设置了允许传输完成中断位(TCIE),则将产生中断请求。4. 循环模式循环模式用于处理循环缓冲区和连续的数据传输(如ADC的扫描模式)。DMA_CCR寄存器中的CIRC位用于开启这一功能。当循环模式启动时,要被传输的数据数目会自动地被重新装载成配置通道时设置的初值,DMA操作将会继续进行。5.存储器到存储器模式DMA通道的操作可以在没有外设请求的情况下进行,这种操作就是存储器到存储器模式。如果设置了DMA_CCRx寄存器中的MEM2MEM位,在软件设置了DMA_CCRx存器中的EN位启动DMA通道时,DMA传输将马上开始。当DMA_CNDTRx寄存器为0时,DMA传输结束。存储器到存储器模式不能与循环模式同时使用。每个DMA通道都可以在DMA传输过半、传输完成和传输错误时产生中断。为应用的灵活性考虑,通过设置寄存器的不同位来打开这些中断。相关的中断事件标志位及对应的使能控制位分别为:1)“传输过半”的中断事件标志位是HTIF,中断使能控制位是HTIE。2)“传输完成”的中断事件标志位是TCIF,中断使能控制位是TCIE。3)“传输错误”的中断事件标志位是TEIF,中断使能控制位是TEIE。10.2.4DMA中断读写一个保留的地址区域,将会产生DMA传输错误。在DMA读写操作期间发生DMA传输错误时,硬件会自动清除发生错误的通道所对应的通道配置寄存器(DMA_CCRx)的EN位,该通道操作被停止。此时,在DMA_IFR寄存器中对应该通道的传输错误中断标志位(TEIF)将被置位,如果在DMA_CCRx寄存器中设置了传输错误中断允许位,则将产生中断。10.3DMA库函数DMA固件库支持10种库函数,如表10-1所示。为了理解这些函数的具体使用方法,本节将对这些函数做详细介绍。表10-1DMA库函数函数名称功能DMA_DeInit将DMA的通道x寄存器重设为缺省值DMA_Init根据DMA_InitStruct中指定的参数,初始化DMA的通道x寄存器DMA_StructInit把DMA_InitStruct中的每一个参数按缺省值填入DMA_Cmd使能或者失能指定通道xDMA_ITConfig使能或者失能指定通道x的中断DMA_GetCurrDataCounter得到当前DMA通道x剩余的待传输数据数目DMA_GetFlagStatus检查指定的DMA通道x标志位设置与否DMA_ClearFlag清除DMA通道x待处理标志位DMA_GetITStatus检查指定的DMA通道x中断发生与否DMA_ClearITPendingBit清除DMA通道x中断待处理标志位1.函数DMA_DeInit函数名:DMA_DeInit。函数原型:voidDMA_DeInit(DMA_Channel_TypeDef*DMAy_Channelx)。功能描述:DMAy_Channelx寄存器重设为缺省值。输入参数:DMAy_Channelx,DMAy的通道x,其中y可以是1或2,对于DMA1,x可以是1~7,对于DMA2,x可以是1~5。输出参数:无。返回值:无。例如:/*DeinitializetheDMA1Channe22*/DMA_DeInit(DMA1_Channe12);2.函数DMA_Init函数名:DMA_Init。函数原型:voidDMA_Init(DMA_Channel_TypeDef*DMAy_Channelx,DMA_InitTypeDef*DMA_InitStruct).功能描述:根据DMA_InitStruct指定的参数初始化DMAy的通道x寄存器.输入参数1:DMAy_Channelx,DMAy的通道x,其中y可以是1或2,对于DMAI,x可以是1~7,对于DMA2,x可以是1~5。输入参数2:DMA_InitStruct,指向结构DMA_InitTypeDef的指针,包含了DMAy通道x的配置信息。输出参数:无。返回值:无。例如:/*InitializetheDMA1ChannellaccordingtotheDMA_InitStructuremembers*/DMAInitTypeDefDMA_InitStructure;DMA_InitStructure.DMA_PeripheralBaseAddr=0x40005400;DMA_InitStructure.DMA_MemoryBaseAddr=0x20000100;DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;DNAInitStructure.DMA_BufferSize=256;DMAInitStructure,DMA_PeripheralInc-DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc-DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;DMAInitStructure,DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;DMAInitStructure,DMA_Priority=DMA_Priority_Medium;DMA_InitStructure,DMA_M2M=DMA_M2M_Disable;DMA_Init(DMA1_Channe11,&DMA_InitStructure);3.函数DMA_GetCurrDataCounte函数名:DMA_GetCurrDataCounter。函数原型:u16DMA_GetCurrDataCounter(DMA_Channel_TypeDef*DMAy_Channelx)。功能描述:返回当前DMAy通道x剩余的待传输数据数目。输入参数:DMAy_Channelx,选择DMAy通道x。输出参数:无。返回值:当前DMA通道x剩余的待传输数据数目。例如:/*GetthenumberofremainingdataunitsinthecurrentDMA1Channe12transfer*/u16CurrDataCount;CurrDataCount-DMA_GetCurrDataCounter(DMA1_Channe12);4.函数DMA_Cmd函数名:DMA_Cmd。函数原型:voidDMA_Cmd(DMA_Channel_TypeDef*DMAy_Channelx,FunctionalStateNewState)。功能描述:使能或者失能指定的通道x。输入参数1:DMAy_Channelx:选择DMAy通道x。输入参数2:NewState,DMA通道x的新状态。这个参数可以取ENABLE或者DISABLE。输出参数:无。返回值:无。例如:/*EnableDMA1Channe17*/DMA_Cmd(DMA1_Channe17,ENABLE);5.函数DMA_GetFlagStatus函数名:DMA_GetFlagStatus。函数原型:FlagStatusDMA_GetFlagStatus(uint32_tDMAy_FLAG)。功能描述:检查指定的DMAy通道x标志位设置与否。输入参数:DMAyFLAG,待检查的DMAy通道x标志位。输出参数:无。返回值:DMA_FLAG的新状态(SET或者RESET)。例如:/*TestiftheDMA1Channe16halftransferinterruptflagissetornot*/FlagStatusStatus;Status=DMA_GetFlagStatus(DMA1_FLAG_HT6);6.函数DMA_ClearFlag函数名:DMA_ClearFlag。函数原型:voidDMA_ClearFlag(u32DMAy_FLAG)。功能描述:清除DMAy通道x待处理标志位。输入参数:DMAyFLAG,待清除的DMA标志位,使用操作符“|”可以同时选中多个DMA标志位。输出参数:无。返回值:无。例如:/*CleartheDMA1Channe13transfererrorinterruptpendingbit*/DMA_ClearFlag(DMA1_FLAG_TE3);7.函数DMA_ITConfig函数名:DMA_ITConfig。函数原型:voidDMA_ITConfig(DMA_Channel_TypeDef*DMAy_Channelx,u32DMA_IT,FunctionalStateNewState)。功能描述:使能或者失能指定的DMAy通道x中断。输入参数1:DMAyChannelx,选择DMAy通道x。输入参数2:DMA_IT,待使能或者失能的DMA中断源,使用操作符“|”可以同时选中多个DMA中断源。输入参数3:NewState:DMA通道x中断的新状态,这个参数可以取ENABLE或者DISABLE。输出参数:无。返回值:无。DMA_IT输人参数DMA_IT使能或者失能DMAy通道x的中断。可以取表10-12中的一个或者多个取值的组合作为该参数的值。表10-12DMA_IT值DMA_IT描述DMA_IT_TC传输完成中断屏蔽DMA_IT_HT传输过半中断屏蔽DMA_IT_TE传输错误中断屏蔽例如:/*EnableDMA1Channe15completetransferinterrupt*/DMA_ITConfig(DMA1_Channe15,DMA_IT_TC,ENABLE);8.函数DMA_GetITStatus函数名:DMA_GetITStatus。函数原型:ITStatusDMA_GetITStatus(uint32_tDMAy_IT)。功能描述:检查指定的DMAy通道x中断发生与否。输入参数:DMAy_IT,待检查的DMAy的通道x中断源。输出参数:无。返回值:DMA_IT的新状态(SET或者RESET)。10.4DMA应用实例本节讲述一个从存储器到外设的DMA应用实例。先定义一个数据变量,存于SRAM中,通过DMA的方式传输到串口的数据寄存器,然后通过串口把这些数据发送到计算机显示出来。DMA的应用广泛,可完成外设到外设、外设到内存、内存到外设的传输,以使用中断方式为例,其基本使用流程由3部分构成,即NVIC设置、DMA模式及中断配置、DMA中断服务。
1.NVIC设置NVIC设置用来完成中断分组、中断通道选择、中断优先级设置及使能中断的功能,流程图如图4-5所示。2.DMA模式及中断配置DMA模式及中断配置用来配置DMA工作模式及开启DMA中断,流程图如图10-2所示。DMA使用的是AHB总线,使用函数RCC_AHBPeriphClockCmd()开启DMA时钟。10.4.1DMA配置流程某外设的DMA通道外设基地址是由该设备的外设基地址加上相应数据储存器的偏移地移地址(0x4c)得到的0x4001244C,即为ADC1的DMA通道外设基地址。如果使用内存,则基地址为内存数组地址。传输方向是针对外设说的,即外设为源或目标。缓冲区大小可以为0~65536。对于外设,应禁止地址自增;对于存储器,则需要使用地址自增。数据宽度都有3种选择,即字节、半字和字,应根据外设特点选择相应的宽度。传输模式可选普通模式(传输一次)或者循环模式,内存到内存传输时,只能选择普通模式。以上参数在DMA_Init()函数中有详细描述,这里不再赘述。图10-2DMA模式与中断配置流程图3.DMA中断服务进入定时器中断后需根据设计完成响应操作,DMA中断服务流程图如图10-3所示。启动文件中定义了定时器中断的入口,对于不同的中断请求,要采用相应的中断函数名。进入中断后首先要检测中断请求是否为所需中断,以防误操作。如果是所需中断,则进行中断处理,中断处理完成后清除中断标志位,避免重复处于中断。图10-3DMA中断服务程序流程图存储器到外设模式使用USART1功能,具体电路设置参考图8-5,无需其他硬件设计。10.4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 药物合成拟胆碱药
- 2026年北京市第四中学八年级英语单元测试卷及答案
- 2026年人教版高中生物必修七生物信息学单元测试卷及答案
- 2026年江苏省苏教版初中二年级生物月经病同步练习题及答案
- 人教版高中生物必修第三册第8章习题及答案
- 股票上市规则培训
- 课程名称VB60程序设计
- 现代教学理念和课堂教学
- 耳穴压籽临床运用教学
- 西师大版五下分数和小数的互化课件之二
- 2025人教版高一化学全册知识点归纳总结(复习资料)
- 电风扇清洗安装课件
- 核反应堆核级机械设备检修工职业技能鉴定经典试题含答案
- 智慧健康养老智能产品应用
- 口腔科诊疗中晕厥的预防与处置
- JJF1033-2023计量标准考核规范
- 《健康体适能》课件
- 2024年大学试题(哲学)-科学技术哲学考试近5年真题集锦(频考类试题)带答案
- 电力配网工程各种材料重量表总
- DL-T 5117-2021水下不分散混凝土试验规程-PDF解密
- 萍乡市污水处理厂二期扩建项目环境影响报告表
评论
0/150
提交评论