当前位置:首页 > 单片机 > 单片机
[导读]一、背景: 需要使用STM32的DAC,例程代码中用了DMA,对DMA之前没有实际操作过,也很早就想知道DMA到底是什么,因此,看了一下午手册,代码和网上的资料,便有了此篇文章,做个记录。二、正文: DMA(Direct Memor

一、背景:

需要使用STM32的DAC,例程代码中用了DMA,对DMA之前没有实际操作过,也很早就想知道DMA到底是什么,因此,

看了一下午手册,代码和网上的资料,便有了此篇文章,做个记录。


二、正文:

DMA(Direct Memory Access),直接翻译为"直接存储器存取",数据手册对其定义为:提供在"外设和存储器

之间"或者"存储器和存储器之间"的高速数据传输,无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源

来做其他操作。

既然说了DMA是两个寄存器之间的数据直接交换,都有哪些形式的数据交换呢?

> 外设到SRAM(IIC的数据,直接放到SRAM内等);

> SRAM到外设(SRAM内的数据自动传输到DAC输出等);

> 存储器到存储器之间;

> 闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标——意味着外设间也可传输?

> 其他待发现······

STM32F103有两路DMA,12个通道,DMA1有7个,DMA2有5个,每个通道专门用来管理来自于一个或多个外设对

存储器访问的请求。既然同时有多路通道,多个请求,所以还有一个仲裁器来协调各个DMA请求的优先权,也就意味着,

当多个通道同时有请求时,只能优先权最高的先独占DMA资源,其用完后,再留给低优先权的使用。

DMA的优先权分配分为"硬优先权"和"软优先权"。

> 软优先权:通过软件配置为最高优先级/高优先级/中等优先级/低优先级;

> 硬优先权:通道号低的优先级更高。

综合来说,既先比较软优先权,软优先权高优先使用DMA,若软优先权相同,则通道号低的优先使用DMA。

DMA,既然是直接存储存取,那么只要初始化正确,就可以不用管它,它会自行做事,配置DMA又需要哪些内容可

以使其正常工作呢?以下为数据手册写的配置DMA通道x的过程(x代表通道号):

> 在DMA_CPARx寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将是数据传输的源或目标。

> 在DMA_CMARx寄存器中设置数据存储器的地址。发生外设数据传输请求时,传输的数据将从这个地址读出

或写入这个地址。

> 在DMA_CNDTRx寄存器中设置要传输的数据量。在每个数据传输后,这个数值递减。

> 在DMA_CCRx寄存器的PL[1:0]位中设置通道的优先级。

> 在DMA_CCRx寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、外设和存储器的数据宽度、

    传输一半产生中断或传输完成产生中断。

> 设置DMA_CCRx寄存器的ENABLE位,启动该通道。

DMA的工作过程既是,当DMA通道启动后,根据DMA_CCRx寄存器设置的方向(从外设到内存,或者内存到外设)

,DMA会自动将DMA_CPARx设置的外设寄存器地址内的数据传输到DMA_CMARx的地址内,或者反之,每次拿取的大

小为DMA_CCRx设置的数据值,总的数据量为DMA_CNDTRx设置的数据量。每传输一次DMA_CNDTRx的值就会减少,直

到其减为零,根据DMA_CCRx内设置的循环模式来选择接下来的操作。如果选择普通模式,那么当寄存器DMA_CNDTRx

的值减为零时,DMA传输就自动停止了,若需要继续此DMA,那需要再进行配置,重新使能对应DMA;若是选择为循环模

式的话,那么当寄存器DMA_CNDTRx的值减为零时,它会恢复成配置的初值,重新开始DMA操作。

*注意:当DMA操作为存储器到存储器模式的话,即DMA_CCRx的MEM2MEM(Memory to memory)位设置了后,那

么DMA传输不需要外设请求,就能在DMA通道使能后,立即开始传输,当DMA_CNDTRx设置的总纯数据量减为"0"时,DMA

传输也就停止,但是,其不能使用循环传输模式。

关于DMA通道的中断,数据手册说明如下:

一旦启动了DMA通道,它既可响应连到该通道上的外设的DMA请求。 当传输一半的数据后,半传输标志(HTIF)被置

1,当设置了允许半传输中断位(HTIE)时,将产生一个中断请求。在数据传输结束后,传输完成标志(TCIF)被置1,当设

置了允许传输完成中断位(TCIE)时,将产生一个中断请求。

现在则以将SRAM内的数据自动传输到DAC输出为例。以DMA初始化库函数代码为模版进行详细说明。

首先是打开对应的DMA时钟:

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1|RCC_AHBPeriph_DMA2, ENABLE);


其次,初始化DMA,DMA初始化库函数如下:

DMA_Init(DMA2_Channel4, &DMA_InitStructure);

该函数原型如下:

void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);

参数 1:DMA_Channel_TypeDef* DMAy_Channelx

为要初始化的通道号。具体值为:DMA1_Channel1->DMA1_Channel7/

                       DMA2_Channel1->DMA2_Channel5

参数 2:DMA_InitTypeDef* DMA_InitStruct.

为要初始化的DMA的详细参数,其详细结构体如下:

typedef struct

{

/* DMA通道外设地址

此处填写DAC寄存器的值 "DAC_DHR12RD_Address"。

#define DAC_DHR12RD_Address 0x40007420 // DAC寄存器的起始地址

相信很多刚接触MCU的朋友会困惑这个地址是如何来的?

其实这个就是DAC寄存器组基址"0x4007400"加上"DAC_DHR12RD"的偏移地址"0x20",

即得到地址。

*/

uint32_t DMA_PeripheralBaseAddr;

// DMA存储器地址寄存器;

// 在此处就是一个数组的地址。

uint32_t DMA_MemoryBaseAddr;

/* 数据传输方向

从外设读 "DMA_DIR_PeripheralSRC"

从存储器读 "DMA_DIR_PeripheralDST"

此处DAC输出,因此是从存储器读,配置为"DMA_DIR_PeripheralDST"。

*/

uint32_t DMA_DIR;

// 数据传输总量(手册规定大小为0~65535 bytes)。

// 此处的值既是数组大小,32bytes

uint32_t DMA_BufferSize;

/* 外设地址增量模式

> 执行外设地址增量模式 "DMA_PeripheralInc_Enable"

> 不执行外设地址增量模式 "DMA_PeripheralInc_Disable"

*/

uint32_t DMA_PeripheralInc;

/* 存储器地址增量模式

> 执行存储器地址增量模式 "DMA_MemoryInc_Enable"

> 不执行存储器地址增量模式 "DMA_MemoryInc_Disable"

*/

/* 对于地址增量模式,数据手册如是说:

外设和存储器的指针在每次传输后可以有选择地完成自动增量。当设置为增量模式时,

下一个要传输的地址将是前一个地址加上增量值,增量值取决与所选的数据宽度为

1、2或4。

以一个实际例子解释:

若是需要同时采集ADC通道11,通道12的数据到buffer里,则在使能了增量模式后,采集

到通道11数据到buffer后并且

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

从我们的直观感受来说,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
关闭
关闭