文档章节

stm32 DMA使用

kangxin1234
 kangxin1234
发布于 2015/09/08 10:40
字数 681
阅读 397
收藏 5

        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通道是要注意,各个通道都是专用的,只有对应的外设才能使用对应的通道。

工程文件链接:

工程配置函数文件



© 著作权归作者所有

kangxin1234

kangxin1234

粉丝 38
博文 51
码字总数 35417
作品 0
程序员
私信 提问
STM32 串口采用DMA方式收发

转载:http://blog.csdn.net/gdjason/article/details/51019219 一直都没有整理STM32 DMA应用,这篇文章算是抛砖引玉吧,欢迎拍砖。 本人QQ 330952038,欢迎交流学习 什么是DMA —- Directi...

zn2016
2018/01/11
0
0
STM32中关于Contex-M3寄存器说明--NVIC/SCB/SysTick

bluefish - 51CTO技术博客----------本文转自网上,如果原作看到的话请留言,我会把出处加上,谢谢! 在STM32中用到了Cortex-M3定义的三组寄存器,有关这三组寄存器的说明不在STM32的技术手册...

文剑Boy
2014/07/31
0
0
STM32F10X ADC多通道读取小教程(包含DMA)

前沿: 今天是雨水,哎可是我这还是大太阳!!! ADC采样,说白了就是采集电压,这个功能是极其重要的,通常的我们的都是对各种传感器采集电压,来进行判断,开环闭环控制,今天,向大家介绍...

qq_37389133
2018/02/19
0
0
STM32开发 -- 系统架构

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29350001/article/details/87278670 未完待续!!! STM32 主系统主要由四个驱动单元和四个被动单元构成。...

聚优致成
02/14
0
0
STM32之HAL库详解 及 手动移植

HAL库结构   说到STM32的HAL库,就不得不提STM32CubeMX,其作为一个可视化的配置工具,对于开发者来说,确实大大节省了开发时间。STM32CubeMX就是以HAL库为基础的,且目前仅支持HAL库!首先...

ZCShouCSDN
2017/02/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
4
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部