历史上的今天
返回首页

历史上的今天

今天是:2024年09月12日(星期四)

正在发生

2019年09月12日 | 秉火429笔记之十五 DMA--直接存储区访问

2019-09-12 来源:eefocus

1. 简介

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


从硬件层次上来说,DMA控制器是独立于Cortex-M4内核的,有点类似GPIO、USART外设一般,只是DMA的功能是可以快速移动内存数据。


STM32F4xx系列的DMA支持外设到存储器传输、存储器到外设传输和存储器到存储器传输三种传输模式。这里的外设一般指外设的数据寄存器,比如ADC、SPI、I2C、DCMI等等外设的数据寄存器,存储器一般是指片内SRAM、外部存储器、片内Flash等等。


外设到存储器传输。比如进行ADC采集时我们可以利用DMA传输把AD转换数据转移到我们定义的存储区中,这样对于多通道采集、采样频率高、连续输出数据的AD采集是非常高效的处理方法。


存储器到存储器传输就是把一个指定的存储区内容拷贝到另一个存储区空间。功能类似于C语言内存拷贝函数memcpy,利用DMA传输可以达到更高的传输效率,特别是DMA传输是不占用CPU的,可以节省很多CPU资源。


2. 功能

DMA 控制器基于复杂的总线矩阵架构,将功能强大的双 AHB 主总线架构与独立的 FIFO 结 合在一起,优化了系统带宽。 


2.1 外设通道

两个DMA控制器,同时外设繁多,为实现正常传输,DMA需要通道选择控制。每个DMA控制器具有8个数据流,每个数据流对应8个外设请求。每个外设请求都占用一个数据流通道,相同外设请求可以占用不同数据流通道。

2.2 仲裁器

简单讲,判别数据流具有优先传输的权利。


仲裁器为两个 AHB 主端口(存储器和外设端口)提供基于请求优先级的 8 个 DMA 数据流请 求管理,并启动外设/存储器访问序列。


优先级管理分为两个阶段:


● 软件:每个数据流优先级都可以在 DMA_SxCR 寄存器中配置。分为四个级别:


— 非常高优先级


— 高优先级


— 中优先级


— 低优先级


● 硬件:如果两个请求具有相同的软件优先级,则编号低的数据流优先于编号高的数据流。例如,数据流 2 的优先级高于数据流 4。


2.3 FIFO

FIFO 用于在源数据传输到目标之前临时存储这些数据。


每个数据流都有一个独立的 4 字 FIFO,阈值级别可由软件配置为 1/4、1/2、3/4 或满。为了使能 FIFO 阈值级别,必须通过将 DMA_SxFCR 寄存器中的 DMDIS 位置 1 来禁止直接 模式。


DMA传输具有FIFO模式和直接模式。


直接模式在每个外设请求都立即启动对存储器传输。在直接模式下,如果DMA配置为存储器到外设传输那DMA会见一个数据存放在FIFO内,如果外设启动DMA传输请求就可以马上将数据传输过去。


FIFO对于要求源地址和目标地址数据宽度不同时非常有用,比如源数据是源源不断的字节数据,而目标地址要求输出字宽度的数据,即在实现数据传输时同时把原来4个8位字节的数据拼凑成一个32位字数据。此时使用FIFO功能先把数据缓存起来,分别根据需要输出数据。


FIFO另外一个作用使用于突发(burst)传输。

2.4 存储器端口和外设端口

DMA控制器实现双AHB主接口,更好利用总线矩阵和并行传输。DMA控制器通过存储器端口和外设端口与存储器和外设进行数据传输。DMA控制器的功能是快速转移内存数据,需要一个连接至源数据地址的端口和一个连接至目标地址的端口。


DMA2(DMA控制器2)的存储器端口和外设端口都是连接到AHB总线矩阵,可以使用AHB总线矩阵功能。DMA2存储器和外设端口可以访问相关的内存地址,包括有内部Flash、内部SRAM、AHB1外设、AHB2外设、APB2外设和外部存储器空间。


DMA1的存储区端口相比DMA2的要减少AHB2外设的访问权,同时DMA1外设端口是没有连接至总线矩阵的,只有连接到APB1外设,所以DMA1不能实现存储器到存储器传输。

2.5 编程接口

AHB从器件编程端口是连接至AHB2外设的。AHB2外设在使用DMA传输时需要相关控制信号


3. DMA数据配置

DMA 传输模式

DMA2支持全部三种传输模式,而DMA1只有外设到存储器和存储器到外设两种模式。


在DMA_SxCR寄存器的PSIZE[1:0]和MSIZE[1:0]位分别指定外设和存储器数据宽度大小,可以指定为字节(8位)、半字(16位)和字(32位),我们可以根据实际情况设置。直接模式要求外设和存储器数据宽度大小一样,实际上在这种模式下DMA数据流直接使用PSIZE,MSIZE不被使用。


源地址和目标地址

DMA数据流x外设地址DMA_SxPAR(x为0~7)寄存器用来指定外设地址,它是一个32位数据有效寄存器。DMA数据流x存储器0地址DMA_SxM0AR(x为0~7) 寄存器和DMA数据流x存储器1地址DMA_SxM1AR(x为0~7) 寄存器用来存放存储器地址,其中DMA_SxM1AR只用于双缓冲模式,DMA_SxM0AR和DMA_SxM1AR都是32位数据有效的。


当选择外设到存储器模式时,即设置DMA_SxCR寄存器的DIR[1:0] 位为“00”,DMA_SxPAR寄存器为外设地址,也是传输的源地址,DMA_SxM0AR寄存器为存储器地址,也是传输的目标地址。对于存储器到存储器传输模式,即设置DIR[1:0] 位为“10”时,采用与外设到存储器模式相同配置。而对于存储器到外设,即设置DIR[1:0]位为“01”时,DMA_SxM0AR寄存器作为为源地址,DMA_SxPAR寄存器作为目标地址。


流控制器

流控制器主要涉及到一个控制DMA传输停止问题。


。DMA传输在DMA_SxCR寄存器的EN位被置1后就进入准备传输状态,如果有外设请求DMA传输就可以进行数据传输。很多情况下,我们明确知道传输数据的数目,比如要传1000个或者2000个数据,这样我们就可以在传输之前设置DMA_SxNDTR寄存器为要传输数目值,DMA控制器在传输完这么多数目数据后就可以控制DMA停止传输。


DMA数据流x数据项数DMA_SxNDTR(x为0~7)寄存器用来记录当前仍需要传输数目,它是一个16位数据有效寄存器,即最大值为65535。这个值在程序设计是非常有用也是需要注意的地方。我们在编程时一般都会明确指定一个传输数量,在完成一次数目传输后DMA_SxNDTR计数值就会自减,当达到零时就说明传输完成。


如果某些情况下在传输之前我们无法确定数据的数目,那DMA就无法自动控制传输停止了,此时需要外设通过硬件通信向DMA控制器发送停止传输信号。这里有一个大前提就是外设必须是可以发出这个停止传输信号,只有SDIO才有这个功能,其他外设不具备此功能


循环模式

循环模式相对应于一次模式。一次模式就是传输一次就停止传输,下一次传输需要手动控制,而循环模式在传输一次后会自动按照相同配置重新传输,周而复始直至被控制停止或传输发生错误。


传输类型

DMA传输类型有单次(Single)传输和突发(Burst)传输。突发传输就是用非常短时间结合非常高数据信号率传输数据,相对正常传输速度,突发传输就是在传输阶段把速度瞬间提高,实现高速传输,在数据传输完成后恢复正常速度,有点类似达到数据块“秒传”效果。为达到这个效果突发传输过程要占用AHB总线,保证要求每个数据项在传输过程不被分割,这样一次性把数据全部传输完才释放AHB总线;而单次传输时必须通过AHB的总线仲裁多次控制才传输完成。


直接模式

默认情况下,DMA工作在直接模式,不使能FIFO阈值级别。


直接模式在每个外设请求都立即启动对存储器传输的单次传输。直接模式要求源地址和目标地址的数据宽度必须一致,所以只有PSIZE控制,而MSIZE值被忽略。突发传输是基于FIFO的所以直接模式不被支持。另外直接模式不能用于存储器到存储器传输(一旦配置存储器到存储器模式,则硬件自动配置为FIFO模式)。


在直接模式下,如果DMA配置为存储器到外设传输那DMA会见一个数据存放在FIFO内,如果外设启动DMA传输请求就可以马上将数据传输过去。


双缓存

设置DMA_SxCR寄存器的DBM位为1可启动双缓冲传输模式,并自动激活循环模式。双缓冲不应用与存储器到存储器的传输。双缓冲模式下,两个存储器地址指针都有效。


双缓冲模式应用在需要解码程序的地方是非常有效的。如MP3


DMA中断


达到半传输:DMA数据传输达到一半时HTIF标志位被置1,如果使能HTIE中断控制位将产生达到半传输中断;


传输完成:DMA数据传输完成时TCIF标志位被置1,如果使能TCIE中断控制位将产生传输完成中断;


传输错误:DMA访问总线发生错误或者在双缓冲模式下试图访问“受限”存储器地址寄存器时TEIF标志位被置1,如果使能TEIE中断控制位将产生传输错误中断;


FIFO错误:发生FIFO下溢或者上溢时FEIF标志位被置1,如果使能FEIE中断控制位将产生FIFO错误中断;


直接模式错误:在外设到存储器的直接模式下,因为存储器总线没得到授权,使得先前数据没有完成被传输到存储器空间上,此时DMEIF标志位被置1,如果使能DMEIE中断控制位将产生直接模式错误中断。


注: 实例见官方ADC DMA例程等


推荐阅读

史海拾趣

Cavium Networks公司的发展小趣事

随着通信网络的不断升级和转型,Cavium Networks 看到了市场的巨大潜力。在2008年,尽管全球经济风暴肆虐,但 Cavium Networks 依然保持着强劲的增长势头。同年11月,公司宣布收购 W&W Communications 公司,这一举措进一步拓展了 Cavium Networks 的业务范围,增强了其在网络通信领域的竞争力。通过收购,Cavium Networks 获得了更多的技术资源和市场份额,为其后续的发展提供了有力的支持。

谷峰(GOFORD)公司的发展小趣事

为了进一步提升市场竞争力,GStek积极寻求与产业链上下游企业的战略合作。公司与知名功率元件供应商NIKO-SEM微电子集团建立了长期稳定的合作关系,共同推动电源管理技术的创新与发展。此外,GStek还积极整合产业链资源,优化供应链管理,确保产品质量的稳定性和供货的及时性。这些措施不仅提升了GStek的综合竞争力,也为其未来的发展奠定了坚实的基础。

Gumstix公司的发展小趣事
检查电路中是否有异物导致短路,清理异物并修复受损部分。
Custom Components Inc公司的发展小趣事

Custom Components Inc(简称CCI)公司的发展历程始于一个技术突破。在公司成立的初期,CCI的研发团队成功开发了一种新型的电子元件,这种元件在性能和成本上均优于市场上的同类产品。这一技术突破立即引起了行业的关注,多家电子设备制造商纷纷向CCI抛出橄榄枝,希望建立长期合作关系。

随着市场需求的不断增长,CCI逐步扩大了生产规模,并通过技术创新不断提升产品质量。同时,公司还积极开拓国际市场,与海外客户建立了稳定的业务往来。凭借卓越的产品性能和良好的市场口碑,CCI逐渐在电子行业中崭露头角。

杰力(EMC)公司的发展小趣事

为了确保产品质量和客户满意度,杰力建立了一套完善的质量管理体系。公司从原材料采购、生产制造到产品检测等各个环节都实行严格的质量控制和管理。同时,杰力还引进了先进的检测设备和技术手段,对产品质量进行全面检测和评估。这些措施使得杰力的产品在质量上得到了有效保障,并赢得了客户的信赖和好评。

联智(Celfras)公司的发展小趣事

江西联智集成电路有限公司(简称联智)自2016年成立以来,始终致力于无线充电技术的研发和创新。公司凭借其先进的无线充电TX/RX芯片解决方案,迅速在行业内崭露头角。联智不仅拥有由多名高校博士和高级研发人员组成的核心研发团队,还在中国及韩国设立了研发中心,确保技术的领先性和市场竞争力。

问答坊 | AI 解惑

基于FPGA的PCI总线接口设计

摘 要 :PCI是一种高性能的局部总线规范,可实现各种功能标准的PCI总线卡。本文简要介绍了PCI总线的特点、信号与命令,提出了一种利用高速FPGA实现PCI总线接口的设计方案。 关键词 :PCI总线;信号;命令;协议 在现代数据采集及处理系统中,ISA ...…

查看全部问答>

插补算法

插补算法!!!!!!!!!!!!!!!!…

查看全部问答>

DA如何检查

本帖最后由 paulhyde 于 2014-9-15 09:07 编辑 如何简单的检查一个DA电路是否正常工作???  …

查看全部问答>

enet_tcp发送问题

TCP发送只能在回调函数中才能发送吗?可不可以像串口函数一样主动的发送数据而不依赖于接收或者回调函数?…

查看全部问答>

求助:Stellaris ICDI电路调试外部芯片出现问题

各位大侠,我在用EKK-LM3S8962板上的ICDI电路调试LM3S9B96电路板时,刚开始,下载一切正常,下载后,9B96 片子程序运行也很正常。突然间,点击下载程序按钮时,出现了图片所示的提示,然后就无法下载程序了。刚开始以为9B96片子坏了呢,后来用了ULI ...…

查看全部问答>

认识一下PADS 9.3

PADS 9.3 的功能亮点 1)DxDesigner 和 Symbol Editor 已经完全支持公制单位的设计和符号创建。 2)PADS ES suite 增加了 DxDataBook 功能。3)PADS Logic, Layout, Router 新增 PADS Archiver 项目归档功能。 4)PADS Logic 完全开放智能PDF功能 ...…

查看全部问答>

自己焊了块STM32最小系统板,串口识别问题

我第一次玩贴片,没焊好啊, 淘宝买的 空板, 想锻炼焊工,焊好的贵不少呢,这样省钱 只有个  十几块的 烙铁, 第一次悲剧了,芯片脚 歪了,无奈,用烙铁想拆下来 可惜没那 能力,就 干脆 多 拖 几次 , 就 抱侥幸心理 ,目测有一排 ...…

查看全部问答>

比较器 - 振荡来自何处?

作者: TI 专家 Bruce Trump翻译: TI信号链工程师 David Zhao (赵大伟) 比较器是一个简单的概念-在输入端对两个电压进行比较。输出为高或者低。因此,在转换的过程中为什么存在振荡?当转换电平缓慢改变的时候,这个现象经常会发生。常常是由于输入 ...…

查看全部问答>