温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何进行stm32 DMA使用

发布时间:2022-01-05 19:32:29 来源:亿速云 阅读:128 作者:柒染 栏目:互联网科技

今天就跟大家聊聊有关如何进行stm32 DMA使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

        stm32 DMA外设简介:

            DMA (Direct  Memory  Access),直接存储器存取,是一种可以大大减轻CPU 工作量的数据存取方式,因而被广泛地使用。在硬件系统中,主要由 CPU(内核)、外设、内存(SRAM)、总线等结构组成,数据经常要在内存与外设之间转移,或从外设 A转移到外设B。DMA可以不同过CPU直接将数据由外设传输到内存或由内存到外设。其实具体表现就是在外设的寄存器和内存变量之间建立一个通道,使他们的数据更新同步,就像是同一个变量一样。

        stm32 DMA外设也有对应的传输完成中断。

        下面以在USART1的数据寄存器到内存变量建立一个单向DMA通道为例,说明一下DMA的用法啊。USART1->到变量。

        USART1配置就是一般配置,只有一点要注意:就是一定要使能USART1外设的DMA功能。

USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);//一定要记得使能对应外设的DMA功能,因为这个纠结了半天。。。。

        DMA配置:

define USART1_DR_Base 0x40013804

uint8_t TxBuff;

void DMA_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;

	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);	//开启DMA时钟

 	/*设置DMA源:内存地址&串口数据寄存器地址*/
    DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;	   

	/*内存地址(要传输的变量的指针)*/
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)(&TxBuff);
	
	/*方向:从外设到内存*/		
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;	
	
	/*传输大小DMA_BufferSize=SENDBUFF_SIZE*/	
    DMA_InitStructure.DMA_BufferSize = 1;
	
	/*外设地址不增*/	    
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 
	
	/*内存地址不增*/
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;	
	
	/*外设数据单位*/	
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
	
	/*内存数据单位 8bit*/
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;	 
	
	/*DMA模式,循环*/
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ;	 
	
	/*优先级:中*/	
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  
	
	/*禁止内存到内存的传输	*/
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
	
	/*配置DMA1的5通道*/		   
    DMA_Init(DMA1_Channel5, &DMA_InitStructure); 	   
	
	DMA_Cmd (DMA1_Channel5,ENABLE);					//使能DMA

	USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);//记得一定要使能对应外设的DMA功能,因为这个搞了半天。。。。

}

      DMA的配置还是比较简单的,就外设寄存器地址如何找到呢,也就是代码中的那个宏。在数据手册中找呗。

在这里可以找寄存器的偏移地址。然后找基地址,在PDF中搜索memory map,或找到对应章节。

如何进行stm32 DMA使用

这个就是寄存器的基地址了,然后寄存器地址就是0x40013800+0x04=0x40013804

stm32 有两个dma共12个通达dma1有7个,dma2有5个。

下面是dma1的部分通道图如何进行stm32 DMA使用

从这个图可见即使是同一个外设对应的DMA通道也可能不同,所以选择dma通道是要注意,各个通道都是专用的,只有对应的外设才能使用对应的通道。

看完上述内容,你们对如何进行stm32 DMA使用有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI