STM32学习问题记录(5)--DMA

DMA是直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU任何干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。( 手册官方解释)简而言之就是在使用DMA的时候,CPU是可以做其他事情的,stm32中DMA分为DMA1和DMA2,分别可以管理多个外设,因此不能张冠李戴,每个DMA都有相应通道,外设对于的通道也不能混淆,所以在这贴上对应图片,方便学习:
DMA1相应外设及外设通道:

DMA2相应外设及外设通道:



void USART1_DMA_Config(void)
{
		DMA_InitTypeDef DMA_InitStructure;  //创建结构体
		RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  //开启DMA时钟,本代码是USART1,所以开启DMA1
		DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;   //数据源头,就是USART数据的第一位地址	   
		DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;   //内存地址,要传输的指针变量
		DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;    //传输方向,从内存到外设	
		DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;    //传输的总数据位数
		DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不增
		DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;	  //内存地址自增
		DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //DMA外设传输的单位位数
		DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;	  //DMA传输的内存位数
		//DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;  //已经屏蔽,指传输一次
		DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;	 //循环传输
		DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  //传输优先级,若多个外设请求DMA,根据优先级判定,在这为中
		DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;	//禁止内存到内存的传输
		DMA_Init(DMA1_Channel4, &DMA_InitStructure); 	  //看上图,USART属于DMA1的14通道
		DMA_Cmd (DMA1_Channel4,ENABLE);			//使能DMA1		
		//DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);   //已经屏蔽,指DMA完成一次发送产生中断
}
第一次使用代码粘贴,每一句都有注释,我感觉比较详细,希望能为学习提供帮助。DMA的配置就这么些,是不是也比较简单呢!

猜你喜欢

转载自blog.csdn.net/vca821/article/details/80511951