DMA概述STM32的DMA结构和特点STM32DMA寄存器STM32DMA初始化配置STM32DMA应用举列第九章STM32的DMA9.1DMA概述DMA的概念:DirectMemoryAccess,即直接存储器访问。其作用是无需经过CPU而进行数据传输。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,能使CPU的效率大为提高。DMA控制器(DMAC)可代替CPU驱动产生数据访问的地址,并执行数据的读/写操作。9.1DMA概述DMA传输的三大要素:传输源:DMA控制器从传输源读出数据;传输目标:DMA控制器将数据传输的目标;触发信号:用于触发一次数据传输的动作,执行一个单位的数据传输。DMA传输过程的四个步骤:DMA请求:CPU对DMAC初始化,并向I/O接口发出操作命令,I/O接口提出DMA请求;DMA响应:DMAC对DMA请求判别优先级及屏蔽,向总线仲裁器提出总线请求。CPU执行完当前总线周期即可释放总线控制权。此时9.1DMA概述总线仲裁器输出总线应答信号,表示DMA已经响应,通过DMAC通知I/O接口开始DMA传输。DMA传输:DMAC获得总线控制权后,CPU立即挂起或只执行内部操作,由DMAC输出读/写命令,直接控制RAM与I/O接口进行DMA传输。DMA结束:当完成规定的数据传输操作后,DMAC释放总线控制权,并向I/O接口发出结束信号。DMA主要由硬件实现,是外设和内存之间交换数据是主要方式之一。9.2STM32的DMA结构和特点STM32有2个DMA控制器,共12个通道:DMA1有7个通道,DMA2有5个通道。其中DMA2仅存在大容量产品中。每个通道可管理来自于一个或多个外设对存储器访问的请求。由一个仲裁器协调各个DMA请求的优先权。STM32的DMA特征:传输源和传输目标可分别是存储器和/或片上外设,也可同为存储器,或同为片上外设一次数据传输的单位为:8、16、32位数据传输的触发信号由硬件确定不能更改9.2STM32的DMA结构和特点STM32的DMA具有以下特点:每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。在七个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),假如在相等优先权时由硬件决定(请求0优先于请求1,依此类推)。独立的源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包过程。源和目标地址必须按数据传输宽度对齐。9.2STM32的DMA结构和特点支持循环的缓冲器管理每个通道都有3个事件标志(DMA半传输,DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。存储器和存储器间的传输外设和存储器,存储器和外设的传输可编程的数据传输数目:最大为65536闪存、SRAM、外设的SRAM、APB1APB2和AHB外设均可作为访问的源和目标。9.2STM32的DMA结构和特点STM32DMA传送由3个操作组成:取数据存数据执行一次DMA_CNDTRx寄存器递减操作从外设(TIMx、ADC、SPIx、I2Cx和USARTx)产生的DMA请求,通过逻辑或输入到DMA控制器,这就意味着同时只能有一个请求有效。外设的DMA请求,可以通过设置相应的外设寄存器中的控制位,被独立地开启或关闭。9.2STM32的DMA结构和特点DMA1各通道请求一览表9.3STM32DMA寄存器DMA共有六个相关的寄存器1)DMA中断状态寄存器(DMA_ISR)如果开启了DMA_ISR中的中断,在达到条件后就会跳到中断服务函数中,即使没开启,也可通过查询这些位来获得当前DMA传输的状态。TCIFx是通道DMA传输完成与否的标志。该寄存器为只读寄存器,所以在这些位被置位后,只能通过其他的操作来清除。2)DMA中断标志清除寄存器(DMA_IFCR)该寄存器的各位是用来清除DMA_ISR的对应位,通过写0清除。DMA_ISR被置位后,9.3STM32DMA寄存器必须通过向该寄存器对应位写入0来清除。3)DMA通道x配置寄存器(DMA_CCRxx=1~7)该寄存器控制着DMA的很多信息,包括数据宽度、外设及存储器的宽度、通道优先级、增量模式、传输方向、中断允许、使能等都是通过该寄存器来设置。所以DMA_CCRx是DMA传输的核心控制寄存器。4)DMA通道x传输数量寄存器(DMA_CNDTRx)该寄存器控制DMA通道x的每次所要传输的数量,其范围为0~65535。且该寄存器的值会随着传输的进行而减少,当该寄存器的9.3STM32DMA寄存器值为0时,表示此次数据传输已结束。因此可通过该寄存器的值知道当前DMA传输的进度。5)DMA通道x外设地址寄存器(DMA_CPARx)该寄存器用来存储STM32外设地址,如使用串口1,则该寄存器必须写入0x40013804(即&USART1_DR)。若使用其他外设,就修改成相应外设地址。6)DMA通道x存储器地址寄存器(DMA_CMARx)该寄存器和DMA_CPARx类似,存放存储器的地址。如使用SendBuf[5200]数组来做存储器,则在DMA_CMARx中写入&SendBuff即可。9.4STM32DMA初始化配置DMA通道的配置步骤:1)设置外设地址在DMA_CPARx寄存器中设置外设地址。发生外设数据传输请求时,该地址将作为DMA传输的源或目标地址。2)设置存储器地址在DMA_CMARx寄存器中设置存储器地址,发生外设数据传输请求时,传输数据将从该地址读出或写入。3)设置传输数据量在DMA_CNDTRx寄存器中设置要传输的9.4STM32DMA初始化配置数据量,该寄存器的数值将在DMA启动后递减,每次新的DMA传输,都重新向该寄存器写入要传输的数据量。4)设置通道的配置信息在DMA_CCRx中设置通道优先级、数据传输方向、循环模式、外设和存储器的增量模式、外设和存储器的数据宽度,以及DMA半传输、DMA传输完成和DMA传输出错是否产生中断。5)使能DMA_CCRx中的ENABLE位,启动DMA通道传输。9.4STM32DMA初始化配置6)一旦启动DMA通道,就可响应连接到该通道上的外设DMA请求。7)当传输一半数据后,半传输标志(HTIF)置1,当数据传输结束后,传输完成标志(TCIF)置1,可产生中断请求。9.5STM32DMA应用举列程序功能:利用DMA通道6将CPU内部的FLASH中32位数据缓冲区内的内容传送到RAM中规定的缓冲区程序分析:1.系统初始化与配置voidRCC_Configuration(void){/*使能端口C、D时钟,使能DMA1时钟*/RCC_DeInit();RCC_HSEConfig(RCC_HSE_ON);……RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);}9.5STM32DMA应用举列2.变量定义#includestm32f10x_lib.h/*SettheVectorTablebaselocationat0x20000000*/#defineVECT_TAB_RAM/*DMA传输目的地址,定位于RAM*/#defineBufferSize32u32DST_Buffer[BufferSize];ErrorStatusHSEStartUpStatus;BitActionTransferStatus=Bit_RESET;/*DMA传输源地址,定位于FLASH*/vu16CurrDataCounterBegin=0,CurrDataCounterEnd=0;uc32SRC_Const_Buffer[BufferSize]={0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20,9.5STM32DMA应用举列0x21222324,0x25262728,0x292A2B2C,0x2D2E2F30,0x31323334,0x35363738,0x393A3B3C,0x3D3E3F40,0x41424344,0x45464748,0x494A4B4C,0x4D4E4F50,0x51525354,0x55565758,0x595A5B5C,0x5D5E5F60,0x61626364,0x65666768,0x696A6B6C,0x6D6E6F70,0x71727374,0x75767778,0x797A7B7C,0x7D7E7F80};voidRCC_Configuration(void);voidNVIC_Configuration(void);voidDMA_Configuration(void);voidGPIO_Configuration(void);BitActionBuffercmp(uc32*pBuffer,u32*pBuffer1,u16BufferLength);3.DMA的配置对DMA1的通道6进行初始化9.5STM32DMA应用举列voidDMA_Configuration(void){DMA_InitTypeDefDMA_InitStructure;DMA_DeInit(DMA1_Channel6);DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)SRC_Const_Buffer;DMA_InitStructure.DMA_MemoryBaseAddr=(u32)DST_Buffer;DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize=BufferSize;DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Enable;DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;9.5STM32DMA应用举列DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Word;DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Word;DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;DMA_InitStructure.DMA_Priority=DMA_Priority_High;DMA_InitStructure.DMA_M2M=DMA_M2M_Enable;DMA_Init(DMA1_Channel6,&DMA_InitStructure);/*EnableDMA1Channel6TransferCompleteinterrupt*/DMA_ITConfig(DMA1_Channel6,DMA_IT_TC,ENABLE);/*GetCurrentDataCountervaluebeforetransferbegins*/CurrDataCounterBegin=DMA_GetCurrDataCounter(DMA1_Channel6);/*EnableDMA1Channel6transfer*/DMA_Cmd(DMA1_Channel6,ENABLE);}9.5STM32DMA应用举列4.GPIO的配置voidGPIO_Configuration(void){/*PD2--L1PC12--L2PC11--L3PC10--L4*/GPIO_InitTypeDe