浅谈STM32的DMA模块的使用 By Jack Chang

原创 2015年07月08日 12:30:03

什么是STM32的DMA?其全称是:Direct Memory Access;根据ST公司提供的相关信息,DMA是STM32中一个独立与Cortex-M3内核的模块,有点类似与ADC、PWM、TIMER等模块;主要功能是通信“桥梁”的作用,可以将所有外设映射的寄存器“连接”起来,这样就可以高速问各寄存器,其传输不受CPU的支配,传输还是双向的;例如,从“表面”上看,它可以将flash中的数据与储存器中变量建立通讯,还可以将一外设的积存器或缓冲器与另外设的寄存器或缓冲器建立双向通讯,有点像把外设硬件之间用“导线”连接在一起了。其间的通讯不占CPU资源,访问速度高,对于实时性强的应用将是一个很好的选择;当然,对于实时性非常强的,建议还是采用专用的DSP芯片。

过程:怎样启用DMA?首先,众所周知的是初始化,任何设备启用前都要对其进行初始化,要对模块初始化,还要先了解该模块相应的结构及其函数,以便正确的设置;由于DMA较为复杂,我就只谈谈DMA的基本结构和和常用函数,这些都是ST公司提供在库函数中的。

下面代码是一个标准DMA设置,当然实际应用中可根据实际情况进行裁减:

DMA_DeInit(DMA_Channel1);

上面这句是给DMA配置通道,根据ST提供的资料,STM3210Fx中DMA包含7个通道(CH1~CH7),也就是说可以为外设或memory提供7座“桥梁”(请允许我使用桥梁一词,我觉得更容易理解,哈哈,别“拍砖”呀!);

DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;

上面语句中的DMA_InitStructure是一个DMA结构体,在库中有声明了,当然使用时就要先定义了;DMA_PeripheralBaseAddr是该结构体中一个数据成员,给DMA一个起始地址,好比是一个buffer起始地址,数据流程是:外设寄存器à DMA_PeripheralBaseAddàmemory中变量空间(或flash中数据空间等),ADC1_DR_Address是我定义的一个地址变量;

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;

上面这句很显然是DMA要连接在Memory中变量的地址,ADC_ConvertedValue是我自己在memory中定义的一个变量;

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

上面的这句是设置DMA的传输方向,就如前面我所说的,DMA可以双向传输,也可以单向传输,这里设置的是单向传输,如果需要双向传输:把DMA_DIR_PeripheralSRC改成DMA_DIR_PeripheralDST即可。

DMA_InitStructure.DMA_BufferSize = 2;

上面的这句是设置DMA在传输时缓冲区的长度,前面有定义过了buffer的起始地址:ADC1_DR_Address ,为了安全性和可靠性,一般需要给buffer定义一个储存片区,这个参数的单位有三种类型:Byte、HalfWord、word,我设置的2个half-word(见下面的设置);32位的MCU中1个half-word占16 bits。

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

上面的这句是设置DMA的外设递增模式,如果DMA选用的通道(CHx)有多个外设连接,需要使用外设递增模式:DMA_PeripheralInc_Enable;我的例子里DMA只与ADC1建立了联系,所以选用DMA_PeripheralInc_Disable

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

上面的这句是设置DMA的内存递增模式,DMA访问多个内存参数时,需要使用DMA_MemoryInc_Enable,当DMA只访问一个内存参数时,可设置成:DMA_MemoryInc_Disable。

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

上面的这句是设置DMA在访问时每次操作的数据长度。有三种数据长度类型,前面已经讲过了,这里不在叙述。

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

与上面雷同。在此不再说明。

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

上面的这句是设置DMA的传输模式:连续不断的循环模式,若只想访问一次后就不要访问了(或按指令操作来反问,也就是想要它访问的时候就访问,不要它访问的时候就停止),可以设置成通用模式:DMA_Mode_Normal

DMA_InitStructure.DMA_Priority = DMA_Priority_High;

上面的这句是设置DMA的优先级别:可以分为4级:VeryHigh,High,Medium,Low.

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

上面的这句是设置DMA的2个memory中的变量互相访问的

DMA_Init(DMA_Channel1,&DMA_InitStructure);

前面那些都是对DMA结构体成员的设置,在次再统一对DMA整个模块做一次初始化,使得DMA各成员与上面的参数一致。

/*DMA Enable*/

DMA_Cmd(DMA_Channel1,ENABLE);

版权声明:本文为博主原创文章,未经博主允许不得转载。

stm32 ADC全解(单次,连续DMA传输)

学习STM32的ADC转换,在开发板上写程序调试。 四个任务: 四个任务: 1.AD以中断方式(单次)采集一路 2.AD以中断方式连续采集四路 3.ADC多路采集,D...
  • qq_33114231
  • qq_33114231
  • 2016年09月26日 19:44
  • 3011

STM32-DMA学习笔记

DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM 与I/O设备开辟一...
  • zzwdkxx
  • zzwdkxx
  • 2013年06月04日 22:46
  • 26323

对于stm32中dma的理解

一.dma常识. 1.作用:实现片内数据之间的高速传输。即是能够不占用cpu实现数据传输。 2.模式:外设到存储器传输、存储器到外设传输和存储器到存储器传输三种传输模式。 3.stm32中的dm...
  • STM_32starter
  • STM_32starter
  • 2017年02月27日 18:51
  • 2002

浅谈STM32的DMA模块的使用

下面就以我的一个实例来和大家一起学习。这个实例仿真是成功的,我使用的是IAR Embedded Workbench IDE(v4.42) 和Manley Mini-kit评估板+ST-Link...
  • u011318735
  • u011318735
  • 2013年12月22日 20:56
  • 697

浅谈STM32的DMA模块的使用

前言:接触MCU的编程已经有几年的历史,刚开始是从PLC(C语言的)学习与应用,后来有学习了8bits的AVR单片机,对MCU有一定的了解;最近接触了STM32的Chip,发现其优点不只是单单宣传的3...
  • u011318735
  • u011318735
  • 2013年12月17日 11:26
  • 498

浅谈 STM32 硬件I2C的使用 (中断方式 无DMA 无最高优先级)

作者:小吖的杂物屋 转自:http://racede.me/talk_about_stm32_i2c_peripheral.html 引子 STM32的硬件I2C很多人都对它望而却步。因为很...
  • whw8007
  • whw8007
  • 2013年06月24日 15:41
  • 1774

浅谈 STM32 硬件I2C的使用 (中断方式 无DMA 无最高优先级)

转载出处 http://racede.me/talk_about_stm32_i2c_peripheral.html 使用前请先充分验证该方法及相关代码 2016.02.03 引子 ...
  • wyfzgybd
  • wyfzgybd
  • 2016年12月21日 09:33
  • 295

STM32 DMA使用浅谈

浅谈STM32的DMA模块的使用               -----转贴http://szvcn.blog.163.com/blog/static/1867963200862922147743/...
  • xuyuefei1988
  • xuyuefei1988
  • 2013年08月24日 21:32
  • 842

STM32 使用DMA处理ADC 学习笔记!!

ADC: 1.STM32内部的ADC模块有三个ADC1,ADC2,ADC3,他们彼此独立,所以可以进行同步采样。 2ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生,要在RCC_CF...
  • wangsenmm
  • wangsenmm
  • 2013年08月20日 22:06
  • 11458

STM32 使用HAL库做串口的DMA发送和中断接收

HAL库使用太死板HAL串口中断接收HAL库使用起来太不灵活,限制太多,后面如有时间,将使用寄存器和HAL库混合操作的方式。 如使用串口中断接收,在接收到数据后,库里做了关闭接收非空中断RXNEIE...
  • queqiongtao
  • queqiongtao
  • 2017年12月17日 22:57
  • 153
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅谈STM32的DMA模块的使用 By Jack Chang
举报原因:
原因补充:

(最多只允许输入30个字)