您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第8章-直接存储器存取DMA2
退出嵌入式单片机原理及应用电气工程学院仪器科学与工程系1ARM嵌入式系统概述2STM32单片机结构和最小系统3基于标准外设库的C语言程序设计基础4STM32通用输入输出GPIO5STM32外部中断6STM32通用定时器7STM32通用同步/异步收发器USART8直接存储器存取DMA9STM32的模数转换器ADC10STM32的集成电路总线I2C11STM32的串行外设接口SPI第8章直接存储器存取DMA8.1DMA简介8.2STM32的DMA结构8.3DMA相关寄存器8.4DMA的工作过程8.5DMA应用设计退出8.1DMA简介DMA用来提供外设与外设之间、外设与存储器之间、存储器与存储器之间的高速数据传输,无需CPU干预,数据可以通过DMA快速传输,节省CPU的资源。在实现DMA传输时,由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题,即DMA传输前,CPU把总线控制权交给DMA控制器,在结束DMA传输后,DMA控制器立即把总线控制权交回CPU。8.2STM32的DMA结构STM32最多拥有两个DMA控制器,DMA1控制器拥有7个独立的可配置通道,DMA2有5个独立的可配置通道,每个通道用来管理来自于一个或多个外设对存储器访问的请求。STM32F103RBT6只有DMA1控制器。8.2STM32的DMA结构每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推)。独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。STM32的DMA主要特性如下:8.2STM32的DMA结构支持循环的缓冲器管理每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。可编程的数据传输数目:最大为65535STM32的DMA主要特性如下(续):8.2STM32的DMA结构DMA1模块的通道和外设的对照表使用DMA的通道的时候,每一个通道对应的外设是不一样的,需要根据相应的外设来选择DMA的通道DMA是AHB总线上的设备,它有2个AHB端口:一个是从端口,用于配置DMA,一个是主端口,用于设备间数据传输。两个AHB/APB桥在AHB和两个APB总线间提供同步连接。APB1操作速度限于36MHz,APB2操作速度限于72MHz。8.2STM32的DMA结构循环优先调度NVIC和Cortex-M3处理器实现了高性能低延时中断调度。所有的Cortex-M3指令既可以在单周期内执行,也可以在总线周期上被中断。循环优先级调度能够确保CPU在必要的时候每两个总线周期就去访问其它总线。多层结构和总线挪用多层结构允许两个主要设备并行执行数据传输。使用总线挪用存取机制,CPU访问和DMA通过APB总线存取外设可以并行工作。DMA总线挪用机制使得总线利用效率更高,减少软件执行时间。在Cortex-M3哈佛架构下提高数据的并行性,减少执行时间,优化DMA效率。总线矩阵有两个主要特征:循环优先调度、多层结构和总线挪用。8.3DMA相关寄存器DMA的功能是通过操作两类寄存器实现的:一类是具有DMA功能的相关外设寄存器,主要用来设置外设开启DMA功能,例如在通用定时器中的DMA/中断使能寄存器(TIMx_DIER)、DMA控制寄存器(TIMx_DCR)和连续模式的DMA地址寄存器(TIMx_DMAR);通用异步/同步收发器USART中的控制寄存器3(USART_CR3)。另一类是DMA相关寄存器,用来设置DMA的具体工作方式。DMA中断状态寄存器(DMA_ISR)DMA中断标志清除寄存器(DMA_IFCR)DMA通道x配置寄存器(DMA_CCRx)(x=1…7)DMA通道x传输数量寄存器(DMA_CNDTRx)(x=1…7)DMA通道x外设地址寄存器(DMA_CPARx)(x=1…7)DMA通道x存储器地址寄存器(DMA_CMARx)(x=1…7)。8.3DMA相关寄存器1.DMA中断状态寄存器(DMA_ISR)该寄存器保存着DMA中断的状态,偏移地址00H,复位值为00000000H,其格式如下:8.3DMA相关寄存器1.DMA中断状态寄存器(DMA_ISR)该寄存器保存着DMA中断的状态,偏移地址00H,复位值为00000000H,其格式如下:8.3DMA相关寄存器2.DMA中断标志清除寄存器(DMA_IFCR)该寄存器用来清除DMA中断标志,偏移地址04H,复位值为000000H,其格式如下:8.3DMA相关寄存器2.DMA中断标志清除寄存器(DMA_IFCR)该寄存器用来清除DMA中断标志,偏移地址04H,复位值为000000H,其格式如下:8.3DMA相关寄存器3.DMA通道x配置寄存器(DMA_CCRx)(x=1...7)该寄存器用来配置DMA工作模式[31:15]:保留,始终读为00MEM2MEM:1:存储器到存储器模式,0:非存储器到存储器模式PL[1:0]:通道优先级(Channelprioritylevel)这些位由软件设置和清除:00:低,01:中,10:高,11:最高MSIZE[1:0]:存储器数据宽度(Memorysize)这些位由软件设置和清除。00:8位,01:16位,10:32位,11:保留MINC:存储器地址增量模式(Memoryincrementmode)0:不执行存储器地址增量操作1:执行存储器地址增量操作PINC:外设地址增量模式(Peripheralincrementmode)0:不执行外设地址增量操作1:执行外设地址增量操作CIRC:循环模式(Circularmode)0:不执行循环操作1:执行循环操作8.3DMA相关寄存器3.DMA通道x配置寄存器(DMA_CCRx)(x=1...7)该寄存器用来配置DMA工作模式1118.3DMA相关寄存器4.DMA通道x传输数量寄存器(DMA_CNDTRx)(x=1...7)该寄存器用来配置DMA传输数据量8.3DMA相关寄存器5.DMA通道x外设地址寄存器(DMA_CPARx)(x=1...7)该寄存器用来配置DMA通道外设地址8.3DMA相关寄存器6.DMA通道x存储器地址寄存器(DMA_CMARx)(x=1...7)该寄存器用来配置DMA通道存储器地址8.4DMA的工作过程1.DMA传送2.仲裁器3.DMA通道4.错误管理5.DMA请求映射8.4DMA的工作过程1.DMA传送DMA传输三要素:传输源:DMA控制器从传输源读出数据;传输目标:数据传输的目标地址;触发信号:用于触发一次数据传输的动作,执行一个单位的传输源至传输目标的数据传输;用于控制数据传输的时机。8.4DMA的工作过程1.DMA传送(过程)(1)IO设备准备好后,向DMAC发出DMA请求;(2)DMAC向CPU发出总线请求;(3)CPU向DMAC发出总线响应,总线控制权由DMAC接管(图中阴影所示)。(4)DMAC向IO设备发出DMA响应,按事先设置的初始地址和传送字节数,依次发送地址和寄存器(或I/O)读写命令,实现RAM和IO设备直接交换数据,直至传送完毕。(5)DMA传送结束,撤销向CPU的总线请求,总线响应和DMA响应随即失效,CPU重新控制总线。8.4DMA的工作过程2.仲裁器仲裁器根据通道请求的优先级来启动外设/存储器的访问。优先权管理分2个阶段:软件:每个通道的优先权可以在DMA_CCRx寄存器中设置,有4个等级:最高优先级─高优先级─中等优先级─低优先级硬件:如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。如,通道2优先于通道4。注意:在大容量产品和互联型产品中,DMA1控制器拥有高于DMA2控制器的优先级8.4DMA的工作过程3.DMA通道每个通道都可以在有固定地址的外设寄存器和存储器地址之间执行DMA传输。DMA传输的数据量最大65535。包含要传输的数据项数量的寄存器,在每次传输后递减。可编程的数据宽度:外设和存储器的传输数据宽度可以通过DMA_CCRx寄存器中的PSIZE和MSIZE位编程。指针增量:设置DMA_CCRx寄存器中的PINC和MINC标志位,外设和存储器的指针在每次传输后自动增量修改。增量值取决于所选的数据宽度。第一个传输的地址是存放在DMA_CPARx/DMA_CMARx寄存器中地址。在传输过程中,这些寄存器保持不变,软件不能改变和读出当前正在传输的地址。8.4DMA的工作过程当通道配置为非循环模式时,传输结束后(即传输计数变为0)将不再产生DMA操作。要开始新的DMA传输,需要在关闭DMA通道的情况下,在DMA_CNDTRx寄存器中重新写入传输数目。在循环模式下,最后一次传输结束时,DMA_CNDTRx寄存器的内容会自动地被重新加载为其初始数值,内部的当前外设/存储器地址寄存器也被重新加载为DMA_CPARx/DMA_CMARx寄存器设定的初始基地址。8.4DMA的工作过程4.错误管理在DMA读写操作中一旦发生总线错误,硬件会自动的清除发生错误的通道所对应的通道配置寄存器(DMA_CCRx)的EN位,该通道操作被停止,此时DMA_ISR寄存器中对应该通道的传输错误中断标志位(TEIF)被置位,如果设置了传输错误中断,则产生中断。8.4DMA的工作过程5.DMA请求映射从外设(TIMx,ADC,SPIx,I2Cx和USARTx)产生的7个请求,通过逻辑或输入到DMA控制器。每个通道对应不同的外设。外设DMA请求可以通过软件设置相应外设寄存器中的控制位,独立的开启或关闭。8.5DMA应用设计8.5.1DMA常用库函数8.5.2DMA使用流程8.5.3DMA数据传输应用实例8.5DMA应用设计8.5.1DMA常用库函数库函数:DMA_DeInit函数DMA_Init函数DMA_StructInit函数DMA_Cmd函数DMA_ITConfig函数DMA_GetCurrDataCounter函数DMA_GetFlagStatus函数DMA_ClearFlag函数DMA_GetITStatus函数DMA_ClearITPendingBit函数8.5DMA应用设计DMA_InitTypeDefDMA_InitStructure;8.5DMA应用设计DMA_PeripheralBaseAddr该参数用以定义DMA外设基地址。DMA_MemoryBaseAddr该参数用以定义DMA内存基地址。DMA_DIR参数规定了外设是作为数据传输的目的地,还是数据来源。DMA_BufferSize参数用来设置一次传输数据量的大小。DMA_PeripheralInc用来设定外设地址寄存器是否递增。8.5DMA应用设计DMA_MemoryInc用来设定内存地址寄存器递增与否。DMA_PeripheralDataSize设定了外设数据宽度。DMA_MemoryDataSize设定了内存数据宽度。8.5DMA应用设计DMA_Mode设置了DMA的工作模式(循环、正常)。DMA_Priority设定DMA通道x的软件优先级,它一共有4个优先级DMA_M2M设置是否是内存到内存的模式传输。8.5DMA应用设计DMA_Init(DMA1_Channel6,&DMA_InitStructure);8.5DMA应用设计DMA_ITConfig(DMA1_Channel6,DMA_IT_TC,ENABLE);8.5DMA应用设计CurrDataCounterBegin=DMA_GetCurrDataCounter(DMA1_Channel6);8.5DMA应用设计DMA_Cmd(DMA1_Channe
本文标题:第8章-直接存储器存取DMA2
链接地址:https://www.777doc.com/doc-5262318 .html