当前位置:首页 > 单片机 > 单片机
[导读]DMA,全称为:DirectMemoryAccess,即直接存储器访问。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,能使CPU的效率大为提

DMA,全称为:DirectMemoryAccess,即直接存储器访问。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,能使CPU的效率大为提高。

DMA设置的一般步骤可以总结为如下几个步骤:

1.DMA时钟使能

2.DMA设置复位

3.设置DMA基地址,内存地址,输出方向参数

4.设置DMA数据大小,优先级,使用通道参数

5.DMA工作方式初始化

6.使能DMA

7.编写中断处理函数

前端采集模块的DMA使用主要用于ADC采集结果的传输和USART串口的数据发送传输。根据《stm32中文参考手册》的DMA请求一览表,选用了DMA1的通道1作为ADC1的数据传输通道,以及DMA1通道4作为和USART串口的数据发送传输通道。此处采用了单个DMA复用多通道的设计,是因为DMA速度足以完成这些任务,而且留下其他DMA资源以便项目以后可以扩展,达到节省资源的目的。


USART使用DMA发送数据配置和使能代码


//DMA1的各通道配置

//这里的传输形式是固定的,这点要根据不同的情况来修改

//从存储器->外设模式/8位数据宽度/存储器增量模式

//DMA_CHx:DMA通道CHx

//cpar:外设地址

//cmar:存储器地址

//cndtr:数据传输量

voidDMA_USART_Config(DMA_Channel_TypeDef*DMA_CHx,u32cpar,u32cmar,u16cndtr)

{

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA传输

DMA_DeInit(DMA_CHx);//将DMA的通道1寄存器重设为缺省值

DMA1_MEM_LEN=cndtr;

DMA_InitStructure.DMA_PeripheralBaseAddr=cpar;//DMA外设ADC基地址

DMA_InitStructure.DMA_MemoryBaseAddr=cmar;//DMA内存基地址

DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;//数据传输方向,从内存读取发送到外设

DMA_InitStructure.DMA_BufferSize=cndtr;//DMA通道的DMA缓存的大小

DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设地址寄存器不变

DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//内存地址寄存器递增

DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//数据宽度为8位

DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;//数据宽度为8位

DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;//工作在正常缓存模式

DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;//DMA通道x拥有中优先级

DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//DMA通道x没有设置为内存到内存传输

DMA_Init(DMA_CHx,&DMA_InitStructure);//根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器

}

//开启一次DMA传输

voidDMA_USART_Enable(DMA_Channel_TypeDef*DMA_CHx)

{

DMA_Cmd(DMA_CHx,DISABLE);//关闭USART1TXDMA1所指示的通道

DMA_SetCurrDataCounter(DMA_CHx,DMA1_MEM_LEN);//DMA通道的DMA缓存的大小

DMA_Cmd(DMA_CHx,ENABLE);//使能USART1TXDMA1所指示的通道

}


ADC使用DMA传送多通道数据配置和使能代码

//DMA1的各通道配置

//这里的传输形式是固定的,这点要根据不同的情况来修改

//从存储器->外设模式/8位数据宽度/存储器增量模式

//DMA_CHx:DMA通道CHx

//cpar:外设地址

//cmar:存储器地址

//cndtr:数据传输量

voidDMA_ADC_Config(DMA_Channel_TypeDef*DMA_CHx,u32cpar,u32cmar,u16cndtr)

{

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA传输

DMA_DeInit(DMA_CHx);//将DMA的通道1寄存器重设为缺省值

DMA_InitStructure.DMA_PeripheralBaseAddr=cpar;//DMA外设ADC基地址

DMA_InitStructure.DMA_MemoryBaseAddr=cmar;//DMA内存基地址

DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//内存作为数据传输的目的地

DMA_InitStructure.DMA_BufferSize=cndtr;//DMA通道的DMA缓存的大小

DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设地址寄存器不变

DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//内存地址寄存器递增

DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//数据宽度为16位

DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//数据宽度为16位

DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//工作在循环缓存模式

DMA_InitStructure.DMA_Priority=DMA_Priority_High;//DMA通道x拥有高优先级

DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//DMA通道x没有设置为内存到内存传输

DMA_Init(DMA_CHx,&DMA_InitStructure);//根据DMA_InitStruct中指定的参数初始化DMA的通道

}

//开启一次DMA传输

voidDMA_ADC_Enable(DMA_Channel_TypeDef*DMA_CHx)

{

DMA_Cmd(DMA_CHx,DISABLE);//关闭USART1TXDMA1所指示的通道

DMA_Cmd(DMA_CHx,ENABLE);//使能USART1TXDMA1所指示的通道

}


这里需要注意的是USART使用DMA发送数据需要每一次都重新使能,即每发送一次数据使能一下。


而ADC使用DMA传送多通道数据则只需要使能一次就可以自动循环工作,只需从数组空间读取ADC数据。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

从我们的直观感受来说,DMA并不是一个复杂的东西,要做的事情也很单纯直白。因此Linux kernel对它的抽象和实现,也应该简洁、易懂才是。不过现实却不甚乐观(个人感觉),Linux kernel dmaengine...

关键字: Linux dma

  引言   根据世界卫生组织公布的数据,全世界目前有3 000多万人目盲,其中约有18%是中国人。针对盲人行动不便的情况,本文介绍了一种基于超声相控阵的盲人避障系统。   本文

关键字: stm32f103 超声相控阵 导盲系统

  随着IPTV和多媒体业务的迅速发展,用户对接入带宽的要求不断增加,目前的铜线接入技术很难满足用户对高带宽、双向传输、及安全性方面的要求。在2010年以前,FTTB是中国主流的FTTx建网模式

关键字: stm32f103 张力传感器

  吉利dma项目进展   为进一步扩大市场份额和开拓大客户市场,吉利汽车拟在梅山岛新建整车生产工业园,本项目总用地面积约1888亩,项目位于宁波市北仑区东南海滨的梅山岛。地块北侧为七星

关键字: dma 吉利

  吉利品牌包含BMA乘用车在内的三大项目此前已宣布落户成都,预计整车总产能将达60万台。近日网通社从成都市发改委获悉,吉利正推进成都BMA/PMA、宁波梅山DMA基地建设项目,未来将投产多款吉

关键字: dma 吉利

引言 随着互联网技术、无线通信技术以及生物传感器技术的进一步发展,可供病人在医院、家庭等环境中使用的可穿戴健康监测预警系统已成为国内外研究人员关注的热点。 本文设计了一种应用互联

关键字: stm32f103 互联网 脉搏监测

致力于亚太地区市场的领先半导体元器件分销商---大联大控股宣布,其旗下友尚推出基于意法半导体(ST)STM32F103与德州仪器(TI)CC2564的智能车载双模蓝牙方案WLT2564S。该车载

关键字: stm32f103 蓝牙

2016年8月16日,致力于亚太地区市场的领先半导体元器件分销商---大联大控股宣布,其旗下友尚推出基于意法半导体(ST)STM32F103与德州仪器(TI)CC2564的智能车载双模蓝牙方案W

关键字: cc2564 stm32f103 大联大友尚

什么是8位微控制器STM8L050?它有什么作用?2019年1月16日 - 意法半导体推出了全新的8位微控制器STM8L050的推出,以提升低成本、低功耗8位微控制器(MCU)的功能集成度。作为超高能效的STM8L系列的...

关键字: dma MCU stm8l050

这是一篇指导驱动工程师如何使用DMA API的文档。

关键字: CPU dma
关闭
关闭