历史上的今天
今天是:2024年12月10日(星期二)
2018年12月10日 | STM32_DMA 标准初始化设置解释
2018-12-10 来源:eefocus
DMA 全称是:Direct Memory Access;根据 ST 公司提供的相关信息,DMA是STM32中一个独立于 Cortex-M3 内核的模块,有点类似于 ADC、PWM、TIMER 等模块;主要功能是起通信“桥梁”的作用,可以将所有外设映射的寄存器“连接”起来,这样就可以高速访问各寄存器,其传输不受 CPU 的支配,传输还是双向的;例如,从“表面”上看,它可以将 flash 中的数据与储存器中变量建立通讯,还可以将某一个外设的寄存器或缓冲器与另一个外设的寄存器或缓冲器建立双向通讯,有点像把外设硬件之间用“导线”连接在一起了。其间的通讯不占 CPU 资源,访问速度快,对于实时性强的应用将是一个很好的选择。下面代码是一个标准 DMA 设置,当然实际应用中可根据实际情况进行裁减:
//开启时钟,否则初始化无效。
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA_Channel1);
上面这句是给 DMA 配置通道,根据 ST 提供的资料,STM3210Fx 中 DMA 包含 7 个通道(CH1~CH7),也就是说可以为外设或 memory 提供 7 座“桥梁”;
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
DMA_PeripheralBaseAddr 是 DMA_InitStructure 结构体中一个数据成员,给 DMA 一个起始地址,好比是一个 buffer 起始地址,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_Cmd(DMA_Channel1,ENABLE);
使能启动。
要使 DMA 与外设建立有效连接,这不是 DMA 自身的事情,是各个外设的事情,每个外设都有 一个 xxx_DMACmd(XXXx,Enable )函数,如果使 DMA 与 ADC 建立有效联系,就使用ADC_DMACmd(ADC1,Enable); (这里我启用了 ADC 中的 ADC1 模块)。
史海拾趣
|
[url=http://www.cinzy.com/soft/COMdbg.rar]便携串口调试助手 精品[/url] 串口调试软件中的一员,不同的是此版本纯API编写,运行高效稳定,只有5K,体系非常小巧,功能强大,非常值得收藏 5-20更新到0.2RC 修改几处内部逻辑使程序运行更快重新压缩使程 ...… 查看全部问答> |
|
DSP是一种高性能的数字信号处理器。由于其具有快速的计算能力和强大的信息处理能力,因此被广泛地应用到工业自动化、国防科研等领域中。与常规单片机相比,DSP的内部结构和时序发生了很大的变化。所以单片机适用的接口芯片,DSP并不一定适用。对于非常 ...… 查看全部问答> |
|
小弟又有问题了...在使用MPLAB ICD3调试的时候,会跳出此错误:查看ICD3 user‘s guide,有关提示如下:依照提示重新启动了目标板、ICD3等,还是提示错误,请各位高手指教,非常感谢!… 查看全部问答> |
|
“橡皮人”在都市职场逐渐走红,他们“没有神经,没有痛感,没有效率,没有反应。整个人犹如橡皮做成的,不接受任何新生事物和意见、对批评表扬无所谓、没有耻辱和荣誉感的职场人们”。 初入职场,谁都曾豪情万丈踌 ...… 查看全部问答> |
|
紧急求助: 设计电源转换 由27V 转换为5V, 该DC/DC模块的容性负载时1000UF, 转换成5V 后,连接 5V到3.3V 的非隔离型DC/DC, 这个DC/DC的容性负载是30 ...… 查看全部问答> |




