当前位置:首页 > 模拟 > 模拟技术
[导读]转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,

1.什么是DMA,有什么作用?

因此:转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,

只要给两种外设提供一条数据通路,直接让数据由A拷贝到B 不经过CPU的处理


什么是DMA,DMA 流如何控制 ?

DMA就是基于以上设想设计的,它的作用就是解决大量数据转移过度消耗CPU资源的问题。有了DMA使CPU更专注于更加实用的操作–计算、控制等。

DMA用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可供其它操作使用。

我们用一个现实例子来做个类比。有一家冶炼公司,每天要不断的从矿场拉矿石进入厂区冶炼,以前通过公路运送的,但是这个公路除了他家的货运车以外,还有其他车,所以一般堵车严重,交通事故频发,影响工厂生产,货运成为该公司提高产能的一大瓶颈。公司思量再三,决定出资在矿场和公司间修建一条专用铁路来运矿石。虽然修建这条铁路价格昂贵,但是修好后,运送矿石的效率大大提高,公司迅速扩大产能,很快得到回报。同时原来运送矿石这条公路,也不堵车了。这条铁路的作用其实和DMA类似。

本文通过STM32F4对DMA相关原理做个介绍。

STM32F4共有2个 DMA 控制器,每个控制器均有8个数据流,每一个 DMA 控制器都用于管理一个或多个外设的存储器访问请求。每个数据流总共可以有多达 8 个通道(或称请求)。每个通道都有一个仲裁器,用于处理 DMA 请求间的优先级。

2.DMA传输过程简述

DMA传输过程说起来很简单,每个DMA有2个端口:外设端口和存储器端口,通过这两个端口可以单向传输数据。

DMA1外设端口通过AHB总线连接到外设,存储器端口通过AHB总线连接到存储器, DMA1传输方向有二种:从外设向存储器传输数据,从存储器向外设传输数据。

DMA2外设端口通过AHB总线连接到外设以及存储器,存储器端口通过AHB总线连接到存储器。DMA2传输方向有三种:从外设向存储器传输数据,从存储器向外设传输数据,存储器向存储器传输数据。

ARM Cortex-M 处理器的存储系统使用32位寻址,共有4GB地址空间。ROM、RAM、外设以及处理器内的调试支持部件的地址均映射在这4GB存储空间内。所以不论哪种传输方向,DMA数据传输的本质是将数据从4GB空间内的一个地址传输到另一个地址上。

两个DMA各有1个4字(1字=4字节)大小的缓冲区(FIFO),用于数据在传输到目标之前,临时存储这些数据。缓冲区有一个可配置的阈值(可配置为1/4、1/2、3/4 或满),用来决定何时将缓冲区(FIFO)中数据发送到存储器(当从外设向存储器传输数据)或何时将存储器内的数据发送到缓冲区(FIFO)(从存储器向外设传输数据)。当从外设向存储器传输数据时,缓冲区(FIFO)内数据量达到阈值时,会将缓冲区(FIFO)数据发送到目标地址上。当从存储器向外设传输数据时,缓冲区内的数据量小于等于缓冲区(FIFO)阈值时,会使用存储器内的数据填充满FIFO。

通过DMA传输数据,需要以下信息:

DMA外设端口和存储器端口的数据宽度。所谓数据宽度是指从端口发送或从端口接收的数据是多少位的。我们在编写程序时,有时候有这样的需求(特别是在外设与存储器间传输数据),从一个地址将A个N位的数据传输到另一个地址,重合组合成B个M位的数据。用DMA传输数据时,通过配置其外设端口和存储器端口的数据宽度可完美解决此问题。DMA中数据宽度可配置为字节、半字(2字节)和字(4字节)。通过DMA_SxCR寄存器的 PSIZE(配置外设端口数据宽度) 和 MSIZE(配置内存端口数据宽度) 位配置。传输的数据量。所谓数据量是指具体要传输多少个数据。有两种控制传输数据量的方法:(1)连接外设并且要传输的数据数据量未知时,可通过外设发送数据传输的结束信号停止传输,但此种方法需要外设具有SDIO接口。(2) 在已知需要传输的数据量时,通过设置需要传输的数据量。要传输的数据量在使能DMA数据流之前写入DMA_SxNDTR 寄存器。在两边数据宽度不一致情况下,DMA_SxNDTR中的数据量等于外设端的数据量。每传输一次后,DMA_SxNDTR中值递减1,递减为0时,DMA停止传输。通常情况下,使用第2中方法来控制数据量。数据传输地址。所谓数据传输地址是指从什么地址发送数据,从什么地址接收数据。外设端口和存储器端口各自有自己的数据传输地址,分别通过寄存器DMA_SxPAR 和DMA_SxM0AR/ DMA_SxM1A(DMA_SxM1AR仅在双缓冲区模式下有效)来设置数据传输地址。2.1.DMA普通传输过程

DMA有一个使能信号,通过使能信号来控制DMA工作,在使用DMA时,首先需要使能DMA。

针对于不同的传输方向,其传输过程略有不同。

从外设向存储器传输数据

DMA使能后,等待外设发出DMA请求信号,DMA收到请求,数据从外设端口数据传输地址(DMA_SxPAR)存储到DMA缓冲区(FIFO)内,当缓冲区(FIFO)内数据量达到缓冲区(FIFO)阈值后,缓冲区(FIFO)内数据移出到内存端口数据传输地址(DMA_SxM0AR)指定的存储器地址中,同时每传输一个数据,DMA_SxNDTR内的值会减1,DMA_SxNDTR值递减为0,DMA传输停止。从存储器向外设传输数据

DMA使能后,立即会将内存端口数据传输地址(DMA_SxM0AR)指定的数据移动到DMA缓冲区(FIFO)内,完全填满DMA缓冲区(FIFO),等待外设端口DMA请求信号,每次发生外设请求,缓冲区内的数据以外设端口宽度指定的数据量移出到外设端数据传输地址(DMA_SxPAR)指定的目标地址上,同时每传输一个数据,DMA_SxNDTR内的值会减1,DMA_SxNDTR值递减为0,DMA停止传输。当DMA缓冲区(FIFO)内数据量小于等于缓冲区阈值时,会使用存储器内的数据再次填充满FIFO。2.2.DMA指针递增传输过程

DMA的外设端口和内存端口各自有一个指针递增参数,可以单独设置是否启用。如果启用了指针递增,则每传输一次,相应端口的数据传输地址递增(递增数等于相应端口地址宽度的字节数),指向下一个地址,下次DMA传输会使用这个新地址来发送或接收数据。

2.3.DMA循环传输过程

DMA还有一个循环模式参数用来设置是否启用循环模式。在循环模式下,当DMA_SxNDTR递减为0后,外设端口、存储器端口的数据传输地址以及DMA_SxNDTR中的值会自动加载初始值后,开始新一轮的循环传输。

2.4.DMA双缓冲区传输过程

DMA在循环模式下,还可以设置为双缓冲区模式。在双缓冲区模式下,存储器端口可以利用DMA_SxM0AR和 DMA_SxM1AR 2个寄存器设置两个数据传输地址。DMA可以利用两个数据传输地址交替传输数据。我们使能指针递增情况下,将两个缓冲区首地址分别装入DMA_SxM0AR和 DMA_SxM1AR,这样在一个缓冲区传输数据的时候,可以对另一个缓冲区内的数据进行处理。

以上只是粗略简述整个传输过程,具体详细信息,后面具体描述。

3.STM32F4 DMA的主要特性

双 AHB 主总线架构,一个用于存储器访问,另一个用于外设访问。每个 DMA 控制器有 8 个数据流,每个数据流有多达8个通道(或称请求)每个数据流有单独的四级32位先进先出存储器缓冲区 (FIFO),可用于 FIFO 模式或直接模式:

—— FIFO 模式下,可通过软件将阈值级别选取为 FIFO 大小的 1/4、1/2 或 3/4。当FIFO中的数据量达到FIFO阈值时,才会将FIFO中的数据送出FIFO,进入外设或储存器端口。

—— 直接模式下,FIFO失去作用,不对数据进行缓存,每个 DMA 请求会立即启动对数据的传输。当在直接模式(禁止 FIFO)下将 DMA请求配置为以存储器向外设传输数据时,DMA 仅会将一个数据从存储器预加载到内部 FIFO,从而确保一旦外设触发 DMA 请求时则立即传输数据。通过硬件可以将每个数据流配置为:

—— 支持外设到存储器、存储器到外设和存储器到存储器传输的常规通道

—— 也支持在存储器方双缓冲的双缓冲区通道DMA 数据流请求之间的优先级可用软件编程(4 个级别:非常高、高、中、低),在软件优先级相同的情况下可以通过硬件决定优先级(例如,请求 0 的优先级高于请求 1)要传输的数据项的数目可以由 DMA 控制器或外设管理:

—— DMA 流控制器下,要传输的数据项的数目是 1 到 65535,可用软件编程

—— 外设流控制器下,要传输的数据项的数目未知并由源或目标外设控制,外设通过硬件发出传输结束的信号独立的源和目标传输宽度(字节、半字、字):源和目标的数据宽度不相等时,DMA 自动封装/解封必要的传输数据来优化带宽。这个特性仅在 FIFO 模式下可用,在直接模式下,数据宽度必须相等。对源和目标的增量或非增量寻址支持 4 个、8 个和 16 个节拍的增量突发传输。突发增量的大小可由软件配置,通常等于外设 FIFO 大小的一半每个数据流都支持循环缓冲区管理 5 个事件标志(DMA 半传输、DMA 传输完成、DMA 传输错误、DMA FIFO 错误、直接模式错误),进行逻辑或运算,从而产生每个数据流的单个中断请求4.DMA功能说明

每个DMA均有两个传输端口:存储器传输端口和外设传输端口,这两个端口间可以单向传输数据,任何一方均可作为发送方,另一方作为接收方。DMA2的外设端口还可连接存储器,实现存储器到存储器的传输。

DMA_SxCR 寄存器中的 DIR[1:0]控制传输方向。

源传输和目标传输在整个 4 GB 区域(地址在 0x0000 0000 和 0xFFFF FFFF 之间)都可以寻址外设和存储器。

源和目标端口数据宽度可配置。通过DMA_SxCR 寄存器的 PSIZE 和 MSIZE 位可分别控制外设端口和存储器端口宽度,可配置为字节、半字(2字节)和字(4字节)。当数据宽度分别是半字或字时,写入DMA_SxPAR 或 DMA_SxM0AR/M1AR 寄存器的外设或存储器地址必须分别在字或半字地址边界对齐。例如当数据宽度为字时,写入 DMA_SxPAR 或 DMA_SxM0AR/M1AR地址必须是4的倍数。

DMA_SxPAR (外设地址配置寄存器)或 DMA_SxM0AR(内存地址配置寄存器0)/ DMA_SxM1AR(内存地址寄存器1——只在双缓冲区模式下有效)用来存放外设或内存数据传输地址。DMA_SxPAR 寄存器中设置外设端口寄存器地址,外设事件发生后,数据会从此地址移动到外设端口或从外设端口移动到此地址。在 DMA_SxMA0R 寄存器(在双缓冲区模式的情况下还有 DMA_SxMA1R 寄存器)中设置存储器地址。外设事件发生后,将从此存储器读取数据或将数据写入此存储器。

4.3.通道选择——DMA_SxCR 寄存器中的 CHSEL[2:0]控制

每个数据流都与1个 DMA 请求相关联,此 DMA 请求可以从 8 个可能的通道请求中选出。

来自外设的 8 个请求(TIM、ADC、SPI、I2C 等)独立连接到每个通道,具体的连接取决于产品实现情况。

选择DMA1的数据流6的通道5,则意味着UART8_RX外设请求。

如果我们需要通过TIM3_CH2通道发出DMA请求,则应选择数据流5的通道5。则在TIM2定时器中使能捕获/比较DMA请求使能(寄存器TIM2_DIER中断使能寄位CC2DE置1),则在发生输入捕获事件或者输出比较事件时,会通过DMA1数据流5通道5发出请求DMA请求。

DMA的使用也没有那么邪乎,很符合大家常规的一个思考。基本可以浓缩为当发生一个啥事的时候,需要某个人A给另一个人B捎个口信,让B知道是啥信息。套用个场景就是狗蛋来到旺财家门口让旺财妈知会一下,想和旺财一起出门玩(事件发生:狗蛋来找旺财玩),旺财妈妈朝屋里大喊一声:“旺财狗蛋喊你出门玩嘞!”(信息直接传递),然后旺财就知道了狗蛋来找他玩这件事。DMA的数据传输长度类似就是旺财妈那句话的断句,她可以一口气直接喊:“旺财狗蛋喊你出门玩嘞“,也可以喊:“旺财!狗蛋~ 喊你!出门~玩嘞!“这样两个字两个字的喊,虽然话是两个字的往外蹦,但是整体意思也是完整传达到了。那么这个说法可以套用到一个UART接收DMA传输,设置好事件条件是UART收到数据,那么就把UART外设数据寄存器(收到的数据)按照一个byte的长度直接发送到事先指定的RAM内存位置。

综上可以看出DMA的使用配置最重要的内容就是触发条件,然后谁把信息告诉谁,每次传递多少数据。如下的范例代码,是配置了ADC每次完成采样后,能够将采样到的数据依次偏移放置在制定的数组种。

下面的代码主要关注的是结构体 DMA_InitStructure的配置。如下代码,可以看到触发条件是完成ADC采样后,ADC数据寄存器中的值就会直接通过DMA更新至指定的数组中,并且会自动完成数组中的指针偏移。在实际的使用中就能达到一次配置后,存放ADC数据的数组就会自动一直在刷新对应通道的ADC数值了。

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

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭