浅谈 STM32 的 DMA 模块的使用
By Jack Chang
Thu Jun 5 2008 18:30:49
E-mail:zhang-weihong@126.com QQ:179748613
前言:接触 MCU 的编程已经有几年的历史,刚开始是从 PLC(C 语言的)学习与应用,后来有学习
了 8bits 的 AVR 单片机,对 MCU 有一定的了解;最近接触了 STM32 的 Chip,发现其优点不只是单单宣传
的 32bits 的 MCU 的速度,而且在编程的风格上也有了较大的变化(与我原有的编程习惯);特别是有一
个与 CPU 并行运行的模块:DMA,对它印象深刻。现在就和大家一起讨论学习这个 Module,谈谈我在学习
中一些感悟和大家一起分享;如有对 DMA 理解和应用上的错误和偏差,欢迎“拍砖”和提出更正,虾米
在此感谢大家了。哈哈!
什么是 STM32 的 DMA?其全称是:Direct Memory Access;根据 ST 公司提供的相关信息,DMA 是 STM32
中一个独立与 Cortex-M3 内核的模块,有点类似与 ADC、PWM、TIMER 等模块;主要功能是通信“桥梁”
的作用,可以将所有外设映射的寄存器“连接”起来,这样就可以高速问各寄存器,其传输不受 CPU 的
支配,传输还是双向的;例如,从“表面”上看,它可以将 flash 中的数据与储存器中变量建立通讯,
还可以将一外设的积存器或缓冲器与另外设的寄存器或缓冲器建立双向通讯,有点像把外设硬件之间用
“导线”连接在一起了。其间的通讯不占 CPU 资源,访问速度高,对于实时性强的应用将是一个很好的
选择;当然,对于实时性非常强的,建议还是采用专用的 DSP 芯片。
过程:怎样启用 DMA?首先,众所周知的是初始化,任何设备启用前都要对其进行初始化,要对
模块初始化,还要先了解该模块相应的结构及其函数,以便正确的设置;由于 DMA 较为复杂,我就只谈
谈 DMA 的基本结构和和常用函数,这些都是 ST 公司提供在库函数中的。
1、 下面代码是一个标准 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
评论0