今天就跟大家聊聊有关如何进行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,或找到对应章节。
这个就是寄存器的基地址了,然后寄存器地址就是0x40013800+0x04=0x40013804
stm32 有两个dma共12个通达dma1有7个,dma2有5个。
下面是dma1的部分通道图
从这个图可见即使是同一个外设对应的DMA通道也可能不同,所以选择dma通道是要注意,各个通道都是专用的,只有对应的外设才能使用对应的通道。
看完上述内容,你们对如何进行stm32 DMA使用有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。