精华内容
下载资源
问答
  • S3C2440 - DMA传输(以字符传输为例)

    千次阅读 2015-12-20 10:10:33
    一、使用DMA的优点DMA支持的请求源 1、DMA优点是其进行数据传输时不需要CPU的干涉,可以大大提高CPU的工作效率。 2、DMA在大容量数据传输中非常重要,比如图像数据传输,SD卡数据传输,USB数据传输等。 3、S3...

    一、使用DMA的优点及DMA支持的请求源

    1、DMA优点是其进行数据传输时不需要CPU的干涉,可以大大提高CPU的工作效率。

    2、DMA在大容量数据传输中非常重要,比如图像数据传输,SD卡数据传输,USB数据传输等。

    3、S3C2440有四个DMA,每个DMA支持的工作方式基本相同,但支持的DMA请求源可能略有不同。如下为四个DMA通道分别支持的DMA请求源:

    Ch0:    nXDREQ0,      UART0,      SDI,            Timer,         USB EP1

    Ch1:    nXDREQ1,      UART1,      I2SSDI,       SPI0,          USB EP2

    Ch2:    I2SSDO,          I2SSDI,      SDI,            Timer,         USB EP3

    Ch3:    UART1,           SDI,            SPI1,          Timer,         USB EP4

    那么怎么使用DMA呢,S3C2440内部集成了DMA控制器,我们只需要简单的配置一下寄存器就可以实现DMA的传输了。


    二、DMA配置步骤及要点: (参考点击打开链接

    1. 数据从哪里来,到哪里去?

    使用DMA首先我们要知道数据的流向,DISRCx寄存器是DMA初始源寄存器,存放了数据的源地址。DIDSTx是DMA的初始目的寄存器,存放数据的目的地址。

    2. 数据走的什么总线?地址是否是固定的?
    我们还要知道源与目的数据存储设备在什么总线上(AHB系统总线,一般是高速的比如内存,APB外围总线,低速的比如SD,UART;具体走什么总线可以在datasheet上查到);以及数据传输结束以后起始地址还原到发送前的起始地址呢,还是在现在的末尾+1做为新的起始地址。这些设置在DISRCCx与DIDSTCx两个寄存器里面配置。
    3. 数据以什么方式传输?源与目的是什么设备?要不要自动重载?
    需要确定数据的传输方式有请求还是握手,根据上面的总线确定与什么时钟同步(HCLK,PCLK),是单元传输还是突发传输,是以字节传输还是字传输,是否重载。是单服务(只发送一次)还是多服务(不停循环发送),以及数据的传送大小。选择源与目的设备。最后还要确定中断是不是传输结束发生(CURR_TC记数是不是0)。这些都在DCONx中设置。

    4. 怎么开始传输DMA和停止DMA,这些在DMASKTRIG中设置。


    三、操作实例(以DMA传输一段字符到控制台为例)

    /*
    *版权所有(C)2015,ZJU
    *
    *文件名称:dma.c
    *内容摘要:关于DMA的配置
    *其它说明:开发板型号:	TX2440
    *	   注意Uart_Init中,设置UCON0寄存器时TX的方式要设置为DMA模式
    *当前版本:V1.0
    *作    者:Frank	
    *完成日期:2015.12.19
    *
    */
    
    #define  DISRC0		(*(volatile unsigned long *)0x4B000000)	//DMA 0 initial source register
    #define  DISRCC0	(*(volatile unsigned long *)0x4B000004)	//DMA 0 initial source control register
    #define  DIDST0		(*(volatile unsigned long *)0x4B000008)	//DMA 0 initial destination register
    #define  DIDSTC0	(*(volatile unsigned long *)0x4B00000C) //DMA 0 initial destination control register
    #define  DCON0		(*(volatile unsigned long *)0x4B000010)	//DMA 0 control register
    #define  DMASKTRIG0	(*(volatile unsigned long *)0x4B000020)	//DMA 0 mask trigger register
    #define  UTXH0		  (volatile unsigned long *)0x50000020 	//UART channel 0 transmit buffer register
    
    char *buf = "Hello World!";
    
    
    /*******************************************************************
    *函数名称:Dma_Init()
    *功能描述:DMA初始化函数
    *其他说明:
    *创建日期:2015.12.19
    *******************************************************************/
    void Dma_Init(void)		
    {
    	//初始化源地址
    	DISRC0 = (unsigned int)buf;
    	DISRCC0 = (0 << 1) | (0 << 0);		//DMA起始地址在AHB总线(Memory), 地址递增
    	
    	//初始化目的地址
    	DIDST0 = (unsigned int)UTXH0;		//目的地址为 UTXH0
    	DIDSTC0 = (1 << 1) | (1 << 0);		/*DMA目的地址在APB总线(UART0), 地址不
    						 变(因为要发送的字符总是传到UTXH0)*/
    	DCON0 = (1 << 24) | (1 << 23) | (1 << 22) | (12 << 0);	//设置DMA请求源及工作模式
    	
    }
    
    
    /*******************************************************************
    *函数名称:Dma_Start()
    *功能描述:DMA启动函数
    *其他说明:
    *创建日期:2015.12.19
    *******************************************************************/
    void Dma_Start(void)
    {
    	DMASKTRIG0 = (1 << 1);			//启动DMA通道	
    }
    
    

    需要注意的几点是:

    ①没有使用DMA中断;

    ②使用的是Demand模式,实测发现Handshake模式也是可以的(推荐);

    ③在Uart_Init中,要将UCON0寄存器设置为发送采用DMA模式(开始就是没有设置,所以一直无法看到实验现象);

    ④源地址和目的地址要使用unsigned int强制转换为整数放进寄存器中;





    展开全文
  • 引言 USB通用串行总线(Universal Serial Bus)是被PC机广泛采用的一种总线,目前...特别是随着USB2.0高速传输协议的出现,其数据传输速度达到了480Mb/s,使得USB接口方式的虚拟仪器系统成为今天低成本虚拟仪器系统

    引言

    USB通用串行总线(Universal Serial Bus)是被PC机广泛采用的一种总线,目前已经在计算机主板上大量集成,成为一种标准配置接口。它的即插即用、真正的热插拔、可总线供电、高性能和系统造价低等一系列的优点,使得USB接口得到了广泛的应用。特别是随着USB2.0高速传输协议的出现,其数据传输速度达到了480Mb/s,使得USB接口方式的虚拟仪器系统成为今天低成本虚拟仪器系统的主流。本文设计了基于USB2.0高速传输的数据采集系统,整个数据传输过程完全采用DMA方式,达到了较高的数据传输速度。

    1、系统介绍

    系统总体结构如图1所示。采用Philips公司的微控制器LPC2888作为系统核心控制器。前端数据采集模块由一片CPLD实现对数据采集和触发控制的功能。当系统和计算机成功连接进入工作状态后,LPC2888从USB接口接收来自应用程序的控制命令,然后通过控制CPLD对数据采集模块采样通道、采样速率和触发模式进行配置后启动数据采集。CPLD控制模数转换器获取采样数据,同时配合LPC2888通用DMA控制器的接口时序将采样数据以DMA方式传输到LPC2888内部缓存。最后由USB高速设备接口将采样数据从LPC2888内部缓存传输到计算机,在计算机中实现数据记录、数据处理和波形显示等功能。

    11.jpg

    图1 系统总体结构图

    1.1 LPC2888微控制器

    LPC2888是一款基于ARM7TDMI内核的微控制器,带有8kB高速缓存,最高工作时钟频率60MHz。在结构上增加了多通道通用DMA控制器(GPDMA)。它支持存储器到存储器,存储器到外设,外设到存储器和外设到外设的DMA传输。本系统采用GPDMA控制器实现数据从前端数据采集模块到内部缓存的DMA传输。同时,LPC2888集成有USB高速设备控制器。它完全兼容USB2.0协议,支持USB高速传输,理论最高传输速度480Mb/s,其内部结构如图2所示。USB设备控制器直接挂接在LPC2888系统内部核心总线AHB上,可以方便地与ARM控制器内核及外部存储器交换数据。其内部包含一个DMA引擎,当USB接口运行在DMA模式时,DMA引擎作为AHB总线上的主机,在ARM内部缓存和USB设备控制器缓存之间传递数据,传输过程不需要控制器内核程序的参与,所以能够达到较高的数据传输速度。

    22.jpg

    图2 USB高速设备控制器内部结构图

    1.2 数据采集模块

    数据采集模块主要由信号调理电路、模数转换电路、触发控制电路和CPLD构成。模数转换器采用美国模拟器件公司(ADI)推出的快速12位双通道模数转换器AD9238。单双通道选择和采样频率控制通过CPLD控制逻辑来实现。

    2、数据传输过程DMA方式的设计与实现

    系统中数据传输过程包含两个环节,一个是从CPLD到LPC2888内部缓存,另一个是从LPC2888内部缓存通过USB接口到计算机。两个环节都采用DMA方式传输数据,两个环节之间的协调通过GPDMA控制器产生的半满、全满中断来实现。整个数据传输过程完全采用DMA的传输方式,从而可以消除因微控制器固件程序执行较慢而造成的对数据传输速度的影响。

    2.1 从CPLD到LPC2888内部缓存的DMA传输

    CPLD从AD9238获得两个12位的转换结果,经过位数变换后送到32位的数据信号线。数据信号线直接连接到LPC2888的P0口(32位)。由于CPLD内部没有数据缓存过程,所以为了保证不丢失采样点,从CPLD到LPC2888内部缓存的DMA传输必须保证连续性和实时性。为此,系统采取了如下解决方案:

    1) 在LPC2888内部RAM中开辟两块相同大小的缓存空间:buffer1和buffer2。将通用DMA控制器的通道3和通道5分别配置为从P0口到buffer1和buffer2的DMA通道。

    2) 配置DMA通道3和通道5为外部信号控制模式,由CPLD作为DMA数据传输过程的主机。

    3) DMA通道3和通道5采用交替工作的方式,由CPLD控制逻辑实现。

    CPLD与LPC2888之间的硬件连接如图3所示。其中DMAEn是DMA通道的外部使能控制信号,其上升沿启动一次DMA操作。DMAReq是DMA数据同步信号,该信号控制数据节拍,每次DMA操作传输4096个数据。IO口P2.0和P2.1分别为启动停止和采样模式选择控制信号线,实现LPC2888对CPLD的控制。系统采用Verilog HDL语言描述CPLD控制逻辑,从CPLD到LPC2888内部缓存的DMA传输时序如图4所示。

    44.jpg

    图3 CPLD与ARM接口

    44.jpg

    图4 GPDMA传输时序图

    2.2 USB高速设备接口的DMA传输

    USB高速设备控制器支持16个物理端点,其中4个端点支持DMA方式。本设计中选用三个端点:EP0、EP2和EP3。控制端点EP0工作在控制传输模式,用于接收USB主机的SETUP令牌包、响应主机的标准设备请求、完成USB设备的枚举过程。EP2配置为OUT(输出)模式,用于接收来自应用程序的控制命令。EP3配置为IN(输入)模式,采用批量传输工作方式,负责将采样结果传输到PC机。从LPC2888内部缓存到计算机的DMA传输由USB高速设备控制器内部的DMA引擎和EP3批量传输配合完成。为了达到较高的数据传输速度,EP3批量传输采用自动传输模式。DMA引擎将LPC2888内部缓存数据传输到USB设备控制器内部FIFO缓存中,当FIFO获得的数据达到设定的大小时将自动封包由EP3传输到PC机。同时,当FIFO中数据为空时,控制器将自动启动DMA引擎继续传输数据。该环节的DMA传输过程完全由USB高速设备控制器硬件实现,程序中只需更改DMA源地址寄存器并设置使能控制寄存器即可启动一次DMA传输。

    2.3 两个DMA传输环节的协调

    系统中利用GPDMA控制器产生的半满和全满中断信号协调两个DMA对同一个缓存空间的操作,实现了LPC2888对整个数据传输过程的协调控制。当DMA通道3工作时,采样数据从CPLD传输到buffer1,同时USB高速设备控制器对buffer2中的数据进行DMA操作;当DMA通道5工作时,采样数据传输到buffer2,USB高速设备控制器对buffer1中的数据进行操作。如图5中LPC2888程序流程所示。

    55.jpg

    图5 LPC2888程序流程

    3、上位机软件设计

    系统上位机软件包括两个部分:设备驱动程序和系统应用程序。开发USB设备的一个关键问题在于设备驱动程序的编写。传统的开发工具是微软公司提供的设备驱动开发工具包:Windows DDK(Device Driver Kits),以及由第三方公司基于DDK开发的驱动程序开发工具包:WinDriver或DriverWorks。DDK基于汇编语言的编程方式和内核模式的调用,对于没有深厚的操作系统原理和编程水平的人员来说,任务相当艰巨。本文使用美国国家仪器NI (National Instruments)公司开发的NI-VISA(Virtual Instrument Software Architecture)控制USB设备,直接配置VISA生成设备驱动程序,避开了以往开发USB设备驱动程序的复杂性,同时直接使用虚拟仪器软件设计平台LabWindows CVI开发系统应用程序,缩短了开发周期。

    3.1 使用NI-VISA开发USB设备驱动程序

    NI-VISA是NI公司开发的一种用来与各种仪器总线进行通信的高级应用编程接口。VISA总线I/O软件是一个综合软件包,它不受平台、总线和环境的限制,可用来对USB、GPIB、串口、PCI、VXI、PXI和以太网系统进行配置、编程和调试。使用VISA可以很容易地实现计算机应用程序和USB设备之间的连接,降低了设备驱动的开发难度。

    VISA提供了两类函数供应用软件调用,USB INSTR设备与USB RAW设备。USB INSTR设备是符合USBTMC(USB测试测量类)协议的USB设备,可以通过使用USB INSTR类函数控制,通信时无需配置NI-VISA;而USB RAW设备是指除了明确符合USBTMC规格的仪器之外的任何USB设备,通信时要配置NI-VISA。经过配置后,VISA自动创建好设备驱动文件:inf文件和PNF文件。当相应的USB设备连接到计算机时,操作系统将自动安装该设备驱动并识别该设备。

    3.2 系统应用程序设计

    使用NI-VISA开发的USB设备可以在LabVIEW和LabWindows CVI中直接调用,其中有相应的VI子节点和库函数对设备进行操作。本系统采用LabWindows CVI开发数据采集系统应用程序。对设备的操作遵循下面的原则:首先打开设备,然后可以对设备进行读写、设置设备属性等操作,最后要关闭设备。目前应用程序设置有两种工作模式:示波器模式和连续采集存储模式。示波器模式每隔一定的时间间隔启动一次采集,采用模拟电平触发,采样长度固定,采样结果波形实时显示。连续采集存储模式启动采集后,系统将采样结果实时地存储到数据文件中。停止采集后,应用程序打开数据文件对采样结果进行波形显示、数据处理等操作。系统应用程序界面如图6所示。

    4、系统测试结果

    本文对该系统主要从以下四个方面进行了测试。

    1)将CPLD内部逻辑设定为传输固定数据,如0xAA55。系统在连续采集存储模式下工作,获得数据文件。采用二进制文件编辑软件UltraEdit查看数据文件,其中所有采样点结果均为0xAA55。验证了数据传输过程的正确性。

    2)将CPLD内部逻辑设定为传输每次增1的数据,获得采样数据文件进行查看。得到采样点结果为递增的数据,每次增量为1。验证了数据传输过程没有丢失采样点,保证了数据传输过程的可靠性。

    3)将CPLD内部逻辑设定为传输AD采样结果。系统工作在示波器模式下,实时查看采样结果波形。调整输入模拟信号幅值、频率和波形,分别得到相应的采样结果波形。验证了AD转换环节的正确性。图6所显示被采样信号为250Hz正弦信号,峰峰值5V,采样速率1MS/s。

    66.jpg

    图6 系统应用程序界面

    4)USB接口数据传输速度测试。这里采用总线分析测试软件Bus Hound测试系统的数据传输速度。该软件可以观察USB设备的工作情况,读取当前USB设备输入输出数据量的大小、数据传输速度和设备属性等信息,并且在运行过程中不会对设备的工作产生影响。测试时首先运行Bus Hound软件,启动系统工作在连续采集存储模式,然后可以在Bus Hound中得到系统的数据传输速度。经测试,系统最高数据传输速度为16MB/s(128Mb/s)。图7所示为Bus Hound软件界面和数据传输速度测试结果。

    77.jpg

    图7 软件Bus Hound的界面与速度测试结果

    5、结论

    本文使用嵌入式微控制器LPC2888和CPLD成功地完成了基于USB高速传输的数据采集系统。系统利用CPLD配合GPDMA控制器实现了从数据采集模块到LPC2888内部缓存的DMA数据传输,利用USB设备控制器DMA引擎配合端点批量传输实现了从缓存到计算机的DMA传输,并通过中断对两个环节进行协调实现了整个数据传输过程的DMA传输。经测试,系统有效数据传输速度达128Mb/s。

    在USB设备驱动应用程序的开发上,本文尝试了一种新方法。配置NI-VISA生成驱动程序,在LabWindows CVI中进行应用程序设计,通过VISA控制USB设备。实践证明:使用该方法开发的系统稳定可靠,不需要开发者了解驱动程序内核,开发难度低,是一种简单、快速开发USB接口应用系统的好方法。

    参考文献

    [1] 李华.USB仪器将成测量仪器主流.国外电子测量技术,2005,10:1~5.

    [2] 郭云鹏,吴卫华,张珺捷.虚拟仪器技术与发展展望.中国科技信息,2005,18:92~101.

    [3] NXP Semiconductors. LPC2880/LPC2888 data sheet. Version 02,2006,9.

    [4] NXP Semiconductors. LPC2880/LPC2888 User manual. Version 02,2007,5.

    [5] 苏兰兰,施伟峰.基于VISA技术的高速USB数据采集系统.机电设备,2007,4:36~39.

    [6] 余志荣,杨莉.基于NI-VISA与LabVIEW的USB接口应用设计.单片机与嵌入式系统应用,2007,1:66~69.

    [7] National Instruments. USB Instrument Control Tutorial. 2007,6.

    [8] 刘思久,赵蔚.实现USB2.0高速数据传输问题的探讨.计算机工程与应用.2007,43:75-77.


    展开全文
  • 一、为什么要用DMA? DMA 全称:Direct MemoryAccess 就是可以直接内存存取; 正是它可以直接操作内存所以具备以下优点: 而无需经过CPU去操作内存...二.DMA有几种传输数据方式: (1)内存到 内存之间;...

    一、为什么要用DMA?

    DMA  全称:Direct MemoryAccess 就是可以直接内存存取;

    正是它可以直接操作内存所以具备以下优点:

    而无需经过CPU去操作内存的存取,这样可以解放CPU出来干其他的事情;

    因为他可以进行存储器时间的数据传输,而不需经过cpu,所以大大加快了数据传输速度—是一种高速的数据传输;

     

    二.DMA有几种传输数据方式:

    (1)内存到 内存之间的;即:SRAMßà SRAM

    (2)内存到 外设之间的;  (例如:串口收到的数据 从数据寄存器 à 内存)

    (3)  外设到内存之间的;

     

    三.传输的数据宽度是怎样的,数据是什么样的形式传输?DMA 能传输多大的数据量?

    A. 数据源地址到数据目的地址 传输宽度或者说传输数据的形式,有几种:1)字节;2)半字;3)全字 [1字节=8bit  1半字=2字节=16位   1全字=2半字=4字节=32位]

    B.传输的最大数据量是65536

     

    我们来看一下stm32f103ve的数据手册第九章DMA 大概的了解一下DMA的特性: 

    四、怎样配置软件来使用DMA?

    (1)配置dma

    /*****************************************************************  
    *函数名称:  Dma_Init  
    *功能描述: 利用DMA 把内存的数据 传输到flash 达到高速传输的目的
    *   
    *输入参数:无 
    *返回值  :无
    *其他说明:无
    *当前版本:v1.0  
    *作者     :尹宣 
    *完成时间:2013年12月1日 
    *修改日期        版本号        修改人        修改内容 
    *-----------------------------------------------------------------  
    *  
    ******************************************************************/  
    void Dma_Init(void)
    {
      DMA_InitTypeDef  DMA_InitStructure;
        
      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        /* DMA channel6 configuration */
      DMA_DeInit(DMA1_Channel1);
      DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)SRC_Const_Buffer;            //外设地址
      DMA_InitStructure.DMA_MemoryBaseAddr = (u32)DST_Buffer;                    //内存地址
      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                           //外设作为DMA的源端     DMA_DIR_PeripheralDST;   //外设作为目的地址 
      DMA_InitStructure.DMA_BufferSize = BufferSize;                            //传输大小
      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;            //外设地址增加
      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                    //内存地址自增使能
      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;    //内存存储方式:字节  DMA_MemoryDataSize_Word;//字(32位)
      DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
      DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;        //DMA_Mode_Normal 正常模式,只传送一次;  DMA_Mode_Circular:循环模式,不停的传送;
      DMA_InitStructure.DMA_Priority = DMA_Priority_High;
      DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;
      DMA_Init(DMA1_Channel1, &DMA_InitStructure);

      /* Enable DMA Channel1 Transfer Complete interrupt */
      DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
        
      /* Get Current Data Counter value before transfer begins */
      CurrDataCounter= DMA_GetCurrDataCounter(DMA1_Channel1);
        
      /* Enable DMA Channel6 transfer */
      DMA_Cmd(DMA1_Channel1, ENABLE);
        
    }

    2.设置DMA优先级

    /*****************************************************************  
    *函数名称:  NVIC_Config  
    *功能描述:    配置DMA的中断优先级
    *   
    *输入参数:无 
    *返回值  :无
    *其他说明:无
    *当前版本:v1.0  
    *作者     :尹宣 
    *完成时间:2013年12月1日 
    *修改日期        版本号        修改人        修改内容 
    *-----------------------------------------------------------------  
    *  
    ******************************************************************/  
    void NVIC_Config(void)
    {
        NVIC_InitTypeDef NVIC_InitStructure;
        
        /* Configure one bit for preemption priority -------------------------------- */
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

         /* Enable DMA channel1 IRQ Channel */
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
    }

    3.在stm3210x_it.c 文件中添加 DMA中断处理函数

    /*******************************************************************************
    * Function Name  : DMAChannel1_IRQHandler
    * Description    : This function handles DMA Stream 1 interrupt request.
    * Input          : None
    * Output         : None
    * Return         : None
    *******************************************************************************/
         
    void DMA1_Channel1_IRQHandler(void)
    {  
        /* Test on DMA Channel1 Transfer Complete interrupt */
      if(DMA_GetITStatus(DMA1_IT_TC1))        //DMA1_IT_TC1:通道1传输完成中断
      {
        /* Get Current Data Counter value after complete transfer */
       CurrDataCounter= DMA_GetCurrDataCounter(DMA1_Channel1);     //返回当前DMA通道1 剩余的待传输的数据数目
        /* Clear DMA Channel1 Half Transfer, Transfer Complete and Global interrupt pending bits */
        DMA_ClearITPendingBit(DMA1_IT_GL1);        //清中断1全局中断
      }
        
    }

    4主函数部分:

    int main(void)
    {   
    //     int count;
        uint32 judge;
        
        NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x00);  // NVIC_VectTab_FLASH=0x08000000
    //     RCC_Config();
         SysTick_Init();
        GPIO_Config();
        USART1_Init(19200);    
         
         NVIC_Config();
        
        FLASH_SetLatency(FLASH_Latency_1);            //延时2个时钟周期
        /* Enable Prefetch Buffer --使能预取指缓存*/
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
        Dma_Init();
        /* Get Current Data Counter value before transfer begins */
        CurrDataCounter = DMA_GetCurrDataCounter(DMA1_Channel1);    //返回当前DMA通道x, 剩余待传输数据数目
        
         while( CurrDataCounter!=0) ;
        judge = memcmp(SRC_Const_Buffer,DST_Buffer,BufferSize);
        
        if(0==judge)
        {
            USART1_SendData(" Same !!!\r\n",sizeof(" Same !!!\r\n"));
        }
        else
        {
            USART1_SendData(" different !!!\r\n",sizeof(" different !!!\r\n"));
        }

        Delay_ms(1);
        
    }

    五、测试验证

    1.我们先看看看下图

    看点0:

    问1:

             使用内存窗口观测SRC_Const_Buffer和DST_Buffer所在的位置,可以发现SRC_Const_Buffer

    地址为0x08001B24,,即Flash中;DST_Buffer地址为0x2000002c,即RAM中;

     

    答1:

    不能改变其值得变量(包括全局和局部)都是存储在FLASH中的,能改变的都储存在SRAM中

    SRC_Const_Buffer  的定义:uc32 SRC_Const_Buffert

    搜索了一下uc32的出处----

    typedef const uint32_tuc32;  /*!< Read Only */  

      

    DST_Buffer 的定义:u32DST_Buffer[BufferSize];

    搜索了一下u32的出处----

     Typedef uint32_t   u32;  

    看点1:断点设置开始DMA传输前,

    CurrDataCounter = DMA_GetCurrDataCounter(DMA1_Channel1);可以读出待传输的数据长度为0x20=32 跟我我们定义的待传输的数据长度是一样的;

    看点2:开始传输前,目的数组DST_Buffer里面的全部为空即为:0x00;

    2.传输完成时,CurrDataCounter 值已经为0,即待传输数据为0;同时目的数组 DST_Buffer 已经有数据,我们用对比了一下源数组 和目的数组 相同则返回0; 证实了是相同的;


    --------------------- 
    作者:yx_l128125 
    来源:CSDN 
    原文:https://blog.csdn.net/yx_l128125/article/details/17122523 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • STM32 DMA

    2020-02-10 19:15:34
    什么是DMA: ...DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据通路,能使 CPU 效率大为提高 STM32 DMA特...

    什么是DMA:
    DMA即直接存储器访问,DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。
    DMA的优点:
    DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高
    STM32 的 DMA特性:
    1.每个通道都直接连接专用的硬件 DMA 请求,每个通道都同样支持软件触发。这些功能通过软件来配置。
    2.在七个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),假如在相等优先权时由硬件决定(请求 0 优先于请求 1,依此类推) 。
    3.独立的源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。
    4.支持循环的缓冲器管理
    5.每个通道都有 3 个事件标志(DMA 半传输DMA 传输完成和 DMA 传输出错),这 3 个事件标志逻辑或成为一个单独的中断请求。
    6.存储器和存储器间的传输
    7. 外设和存储器,存储器和外设的传输
    8. 闪存、SRAM、外设的 SRAM、APB1 APB2 和 AHB 外设均可作为访问的源和目标。
    9. 可编程的数据传输数目:最大为 65536
    DMA控制器的组成
    对数据传送过程中进行控制的硬件称为DMA控制器(DMA接口)。当I/O设备需要进行数据传送时,通过DMA控制器向CPU提出DMA传送请求,CPU响应之后让出系统总线,由DMA控制器接管总线进行数据传送。
    1.接受外设发出的DMA请求,并向CPU发出总线请求。
    2.CPU响应总线请求,发出总线响应信号,接管总线控制权,进入DMA操作周期。
    3.确定传送数据的主存单元地址及长度,并能自动修改主存地址计数和传送长度计数。
    4.规定数据在主存和外设间的传送方向,发出读写等控制信号,执行数据传送操作。
    5.向CPU发送DMA操作的结束。
    DMA的数据传送分为预处理、数据传送和后处理3个阶段。使用DMA,最重要的就是配置数据的传输,主要分为三点:1.传输的方向2.传输的数量3.传输的模式
    传输方向:存储器——>外设,外设——>存储器,存储器——>存储器,
    传输的数量:由DMA_CNDTR寄存器配置,一次最多只能传输 65535 个数据。而且源和目标的数据宽度必须一致
    传输的模式:单次传输,循环传输
    DMA传输的三步:
    1. 从外设数据寄存器或者从DMA_CMARx寄存器指定地址的存储器单元执行加载操作。
    2. 存数据到外设数据寄存器或者存数据到DMA_CMARx寄存器指定地址的存储器单元。
    3. 执行一次DMA_CNDTRx寄存器的递减操作。该寄存器包含未完成的操作数目。
    DMA配置步骤:
    1.使能 DMA 时钟
    2.初始化 DMA 通道 4 参数
    3.使能串口 DMA 发送
    4.使能 DMAX 通道 X,启动传输。

    展开全文
  • 以太网接口因其具有标准开放、易于扩展、低成本等优点而在工业中得到了广泛应用。...通过使用DMA方式提升以太网接口性能,并用PING包试验的方式进行了验证。结果表明,通过使用DMA可以显著地提升以太网接口性能
  • S3C2410下DMA的使用

    2013-11-22 15:37:32
    DMA优点是其进行数据传输时不需要CPU干涉,可以大大提高CPU工作效率。 DMA大容量数据传输中非常重要,比如图像数据传输,SD卡数据传输,USB数据传输等等。 S3C2410有四个DMA,每个DMA支持工作方式基本相同,但...
  •  在FPGA中实现一个PCIe接口时,为了确保系统效率,系统抖动,数据时钟开销以及必须满足端到端总带宽需求,设计师必须考虑数据传输的方式。将一个散/聚DMA(SGDMA)与一个PCIe接口结合起来,通过从本地处理器上卸载...
  • DMA和IO端口

    2021-04-04 09:19:44
    使用DMA(直接存储器的访问)模块的目的在于提高效率,它的优点在于DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU的...
  • s3c2440 DMA

    2018-02-10 16:20:50
    DMA优点是其进行数据传输时不需要CPU干涉,可以大大提高CPU工作效率。DMA大容量数据传输中非常重要,比如图像数据传输,SD卡数据传输,USB数据传输等等。S3C2410有四个DMA,每个DMA支持工作方式基本相同,但支持...
  • ARM PL330 DMA控制器开发

    千次阅读 2013-07-12 07:57:26
    一、DMA介绍 DMA作为一种CPU与外设传输数据的技术,现在广泛用于各种计算机架构中,它最大...在华清远见的FS_S5PC100平台上通过PL330 DMA控制器实现了内存到内存、内存到串口、串口到串口等多种DMA传输方式
  • ARM PL330 DMA控制器开发(1)

    千次阅读 2014-11-28 16:49:43
    一、DMA介绍 DMA作为一种CPU与外设传输数据的技术,现在广泛用于各种计算机架构中,它最大的优点就是无需CPU干涉下,完成数据从内存到外设... DMA控制器实现了内存到内存、内存到串口、串口到串口等多种DMA传输方式
  • 使用DMA(直接存储器的访问)模块的目的在于提高效率,它的优点在于DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU的...
  • 裸机系列——DMA工作

    2011-04-17 15:52:00
    转至:http://blog.csdn.net/cybertan/archive/2009/10/19/4697516.aspx<br />DMA优点是其进行数据传输时不需要CPU干涉,可以大大提高CPU工作效率。 DMA大容量数据传输中非常重要,比如图像数据传输...
  • 直接存储器存取 (DMA) 是计算机应用系统中用于提高数据传输速率和微处理...采用流水线结构设计,支持硬件握手模式和链表描述符传输方式,具有传输速度快和编程灵活的优点,适用于网络通信、多媒体处理等多种应用领域.
  • s3c2440学习系列6(dma 续)

    千次阅读 2009-10-19 11:39:00
    DMA优点是其进行数据传输时不需要CPU干涉,可以大大提高CPU工作效率。DMA大容量数据传输中非常重要,比如图像数据传输,SD卡数据传输,USB数据传输等等。S3C2410有四个DMA,每个DMA支持工作方式基本相同,但支持...
  • STM32之CubeL4(二)---USART + DMA + HAL

    千次阅读 2019-09-03 23:20:56
    一般情况下,设备之间通信方式可以分成并行通信和串行通信两种,它们区别是: 通信方式 并行通信 串行通信 传输原理 数据各个位同时传输 数据按位顺序传输 优点 传输速度快 占用引脚资源少 缺点 ...
  • 7.4 I/O方式

    2020-09-27 15:08:57
    受到寄存器限制,一次只能传输一个字数据 3.例题 4.程序查询主要特点、优点和缺点 1.主要特点:CPU有“踏步等待现象”,CPU与I/O串行工作 2.优点:接口设计简单、设备量少 3.缺点:CPU在信息传送...
  • 靠定时器产生通信时序的WS2812B驱动程序,相较于靠spi产生通讯信号的方案,具有准确和稳定的优点,数据传输使用DMA模式,最少占用处理器资源
  • 该高速数据信号模拟器利用 PLX9054作为 PCI总线接口芯片,用 FPGA(现场可编程门阵列)作为系统控制核心,采用先入先出( FIFO)技术、DMA(直接存储器存取)数据传输方式,以及高速 D/A(数/模)转换器完成高速模拟信号输出,...
  • USB接口采用DMA方式,由接口芯片ISP1581和单片机P89C61X2来完成;主机显示端采用DirectX技术实现视频显示。 文中详细讨论了USB接口实现、固件编程和DirectX视频显示等技术,并给出了系统原理图、PCB图、关键代码...
  • 【RocketMQ】6.RocketMQ 存储特点

    千次阅读 2016-12-14 10:42:57
    6.1 零拷贝原理 Consumer 消费消息过程,使用了...缺点:不能很好利用 DMA 方式,会比 sendfile 多消耗 CPU,内存安全性控制复杂,需要避免 JVM Crash问题。 2. 使用 sendfile 方式 优点:可以利用 DMA 方式,消耗
  • INTERRUPT CONTROLLER

    2016-03-18 14:25:00
    查询方式的优点是硬件开销小不需要额外的硬件支持只是通过软件不断的轮询,使用起来也就比较简单,但在此方式下,CPU要不断地查询外设的状态,当外设未准备好时,CPU就只能循环的等待,不能执行其他程序,这样就浪费...
  • OpenGL---PBO

    2020-08-11 10:24:42
    2、 高效并不在于传输更快,而在于与硬件相关的异步调用方式,调用之后CPU即返回执行其它操作(使用DMA方式的传输、由OpenGL直接控制) 3、在单个PBO情况下并不能得到很好的效果,毕竟传输过程仍然存在(但速度可能...
  • DMA工作时,由DMA 控制器(DMAC)向内存发出地址和控制信号,进行地址修改,对传送字个数计数,并且以中断方式向CPU 报告传送操作结束。 目的:减少大批量数据传输时CPU 开销。 优点:1. 操作均由硬件电路...
  • PBO

    千次阅读 2013-06-12 14:01:41
    PBO(Pixel Buffer Object),将...2、 高效并不在于传输更快,而在于与硬件相关的异步调用方式,调用之后CPU即返回执行其它操作(使用DMA方式的传输、由OpenGL直接控制) 3、在单个PBO情况下并不能得到很好的效果,毕

空空如也

空空如也

1 2 3
收藏数 43
精华内容 17
关键字:

dma传输方式的优点