DMA

一、F28379D的DMA简介

  • 具有六个DMA通道,每个通道都有各自独立的PIE中断
  • 每个DMA通道都能够被各种外设触发源触发
  • 16-bit模式和32-bit模式(SPI为16-bit)
  • 吞吐量:传输一个word需要三个周期
  • 每个CPU都有各自的DMA控制器

二、DMA Data Path

三、DMA触发源的选择(寄存器手册P625)

触发的逻辑图:

Table5-1由于太长,未列完全,可翻阅寄存器手册。

四、DMA的传输方式和传输模式

在DMA传输时,一共有两个嵌套的循环,在一次DMA传输结束后,DMA传输的数据量为:(BURST_SIZE+1)*(TRANSFER_SIZE+1)

  1. Burst Loop(内循环)

    ​ BURST_SIZE寄存器可以设置每次Burst传输words的数量,一次Burst传输最大可以传输32个16-bit words,而MODE.DATASIZE能够改变DMA通道传输的是16-bit还是32bit。每次Burst传输完成后,其地址变换为:

    SRC_ADDR_ACTIVE = SRC_ADDR_ACTIVE + SRC_BURST_STEP
    DST_ADDR_ACTIVE = DST_ADDR_ACTIVE + DST_BURST_STEP

  2. Transfer Loop(外循环)

    ​ TRANSFER_SIZE寄存器可以配置Transfer传输的burst数,TRANSFER_SIZE寄存器是16-bit的寄存器,因此可以传输大量数据。每次Transfer传输完成后,其地址变化为(前提是SRC_WRAP_SIZE要大于TRANSFER_SIZE):

    SRC_ADDR_ACTIVE = SRC_ADDR_ACTIVE + SRC_TRANSFER_STEP
    DST_ADDR_ACTIVE = DST_ADDR_ACTIVE + DST_TRANSFER_STEP

OneShot Mode(默认关闭)

​ 当OneShot Mode关闭时,每次触发后只传输一次burst,在此次burst传输完成后,DMA控制器状态机直接切换到下一个优先级正在等待的DMA通道,即使本通道传输完成后又一次被触发。该模式能够防止任何通道独自占用DMA总线。

​ 当OneShot Mode打开时,每次触发后会将一个通道的所有bursts传输完成,在该模式下,很容易造成一个通道占用DMA的大部分带宽。

Continuos Mode(默认关闭)

​ 当Continuos Mode关闭时, 当DMA完成所有通道的所有bursts之后,DMA会自动关闭,如果需要再次传输,需要重新使能。

​ 当该模式打开时,会循环传输数据,不需要再次重新使能。

五、DMA的配置

​ 在该示例中,是将在RAMGS0处的数据DMA传送至在RAMGS1处。即Mem-To-Mem的传送方式。使用的是软件触发。

  1. 首先是配置DMA中断:

    EALLOW;
    PieVectTable.DMA_CH1_INT = &dma_finish_isr;
    EDIS;IER |= M_INT7;PieCtrlRegs.PIECTRL.bit.ENPIE = 1;    // Enable the PIE block
    PieCtrlRegs.PIEIER7.bit.INTx1 = 1;    //查找PIE Map映射即可知道PIE组7,第一个中断就是DMAch1中断
    EINT;
    ERTM;
    
  2. 配置DMA

    #pragma DATA_SECTION(g_ulSrcBuf0, "ramgs0");
    #pragma DATA_SECTION(g_ulDstBuf1, "ramgs1");
    #define MEM_BUFFER_SIZE 1024
    Uint32 g_ulSrcBuf0[MEM_BUFFER_SIZE];
    Uint32 g_ulDstBuf1[MEM_BUFFER_SIZE];volatile Uint32 *DMADest;
    volatile Uint32 *DMASource;void DMA_Init()
    {// Initialize DMADMAInitialize();// Configure DMA Channel 1 (16-bit datasize)DMADest   = g_ulDstBuf1;                 DMASource = (volatile Uint32 *)g_ulSrcBuf0;DMACH1AddrConfig32bit(DMADest,DMASource);//配置目标地址和源地址/***************************16-bit word 传输配置**********************************///Will set up to use 16-bit datasize, pointers are based on 16-bit words//每次burst配置成传输32个16bit word,每个word传输完成后,源地址和目标地址都递增1DMACH1BurstConfig(31,1,1);     //每次Teransfer传输MEM_BUFFER_SIZE*2/32个burst,每次burst传输完成后源地址和目标地址递增1DMACH1TransferConfig((MEM_BUFFER_SIZE*2/32-1),1,1);   DMACH1WrapConfig(0xFFFF,0,0xFFFF,0);//第一个参数是外部触发源,由于该示例是软件触发,因此为0x0,其他的选择可参考寄存器手册P625//其他参数定义,可参考库函数里面的介绍DMACH1ModeConfig(0x0,PERINT_ENABLE,ONESHOT_ENABLE,CONT_DISABLE,SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_ENABLE);/***************************32-bit word 传输配置**********************************/DMACH1BurstConfig(31,2,2);     //每次Teransfer传输MEM_BUFFER_SIZE*2/32个burst,每次burst传输完成后源地址和目标地址递增2DMACH1TransferConfig((MEM_BUFFER_SIZE*2/32-1),2,2);   DMACH1WrapConfig(0xFFFF,0,0xFFFF,0);//第一个参数是外部触发源,由于该示例是软件触发,因此为0x0,其他的选择可参考寄存器手册P625//其他参数定义,可参考库函数里面的介绍DMACH1ModeConfig(0x0,PERINT_ENABLE,ONESHOT_ENABLE,CONT_DISABLE,SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,THIRTYTWO_BIT,CHINT_END,CHINT_ENABLE);
    }
    
  3. 在CMD文件中添加相关定义

    //在CMD的section中添加如下定义
    ramgs0 : > RAMGS0, PAGE = 1
    ramgs1 : > RAMGS1, PAGE = 1
    
  4. 启动DMA

    //打开DMA通道1传输
    StartDMACH1();//进行软件触发
    EALLOW;
    DmaRegs.CH1.CONTROL.bit.PERINTFRC = 1;
    EDIS;
    
  5. DMA传输完成中断函数

    __interrupt void dma_finish_isr(void)
    {PieCtrlRegs.PIEACK.all = PIEACK_GROUP7;//User Code
    }
    

注意:

  • 在定义数组时,必须要添加下面这两行

    #pragma DATA_SECTION(g_ulSrcBuf0, “ramgs0”);
    #pragma DATA_SECTION(g_ulDstBuf1, “ramgs1”);

    这是为了将g_ulSrcBuf0和g_ulDstBuf1分别定义在ramgs0和ramgs1处,不然的话,可能会将数组自动定义在其他区域,而由上面的第一张图的DMA数据传输路径可知,只有GS0-GS15RAMs和DMA总线相连,定义在其他区域,无法进行DMA传输

  • 在软件触发传输完成时,若要再次进行传输,必须再次打开DMA通道,同时再次软件触发,不然无法完成传输。

  • 在该示例中,是定义了两个uint32_t的数组,容量为1024,在传输数据为16-bit word时,如果每次burst传输的数量设置为32,则每次Transfer传输的burst次数应该设置为1024*2/32次,且地址指针都因该递增1,这样才能全部正常传输完成。但在32-bit 传输下,若想要全部传输完成,每次burst传输的数量和传输burst的次数与16-bit一样,只是地址变成递增2而已。有点迷惑,个人猜想,在手册里介绍每次burst传输的最大数据量为32*16-bit word,可能在32-bit模式下,每次burst传输的时16个32bit的数据。

TMS320F28379D——DMA相关推荐

  1. 基于uFUN开发板的心率计(一)DMA方式获取传感器数据

    前言 从3月8号收到板子,到今天算起来,uFUN到手也有两周的时间了,最近利用下班后的时间,做了个心率计,从单片机程序到上位机开发,到现在为止完成的差不多了,实现很简单,uFUN开发板外加一个Puls ...

  2. linux dma拷贝数据到用户态,图解:零拷贝Zero-Copy技术大揭秘

    1.前言 像大白这种调包侠,深知不懂底层技术点就如同空中楼阁,再这样下去面阿里p10是没希望了. 想到这里,我开始慌了,所以今天和大家一起学习个底层技术点-零拷贝Zero-Copy. Linux系统中 ...

  3. 单片机I/O控制方式(UART中断和DMA中断的区别)

    目录 1.程序循环检测方式 2.中断驱动方式 3.直接内存访问方式 单片机I/O设备的控制方式主要有三种:程序循环检测.中断驱动和直接内存访问. 1.程序循环检测方式 程序循环检测方式的基本思路是:在 ...

  4. stm32的rxne和idle中断_HAL库的STM32F767的DMA通过IDLE中断接收数据但不能访问

    仿真能看到接收缓冲区数组中的数据,但不能访问,如果不访问,再开启DMA接收能正常接收,并且在仿真状态下也能查看.只要访问一次这个数组,下一次开启DMA接收后就不能接收数据了. 原代码如下: if(rx ...

  5. dma工作时cpu工不工作_CPU如何工作?

    dma工作时cpu工不工作 CPU, also known as the microprocessor is the heart and/or brain of a computer. Lets De ...

  6. 百度成立小度蓝牙联盟,DMA+小度App打造蓝牙语音风口

    人机交互经历了三个阶段键鼠.触屏和语音交互.在国外,谷歌.亚马逊.苹果等巨头的竞争已经到达白热化状态:在国内,百度的DuerOS正是这方面的一位大玩家. 在技术发展的各个时代中,提前入局的厂商,必然能 ...

  7. linux zynq ps dma,Zynq PS侧DMA驱动

    Linux中,驱动必然会有驱动对应的设备类型.在linux4.4版本中,其设备是以设备树的形式展现的. PS端设备树的devicetree表示如下 324 dmac_s: dmac@f8003000 ...

  8. dma接收双缓存 stm32_容易被大多数人忽视的STM32串口DMA问题

    讨论三个问题: 1.什么叫串口DMA 请求: 2.串口简要复习: 3.串口DMA发送流程. 第一 什么叫串口DMA 请求(战舰STM32开发板) 说这个问题之前先简单回顾DMA的基本特性.先导出原子哥 ...

  9. linux音频驱动dma数据,Linux音频驱动简述

    3.2 mixer接口 int register_sound_mixer(structfile_operations *fops, int dev); 上述函数用于注册1个混音器,第1个参数fops即 ...

最新文章

  1. ML之ECS:利用ECS的PAI进行傻瓜式操作机器学习的算法
  2. 鸿蒙os下载到电脑上,鸿蒙系统pc版下载2.0
  3. JSP调用request方法获取请求相关信息
  4. 第一周周报(3月15-3月21)
  5. SQL Server里查看当前连接的在线用户数
  6. Java NIO学习篇之缓冲区ByteBuffer详解
  7. 联合国儿童基金会投资六家区块链初创企业,目标是解决“全球性挑战”
  8. PHPExcel读取excel文件
  9. 开始学习编写用于 Windows SideShow 设备的小工具【转】
  10. Visual Studio 水晶报表Crystal Reports
  11. php图片大马加后门,一次对php大马的后门的简单分析
  12. 2020年 2月 省市区sql(一)
  13. linux图形显卡驱动r600,R600/R700八款显卡Mesa开源驱动性能简测
  14. 立锜1.2V~5.5V稳压芯片RT9078-33GJ5
  15. 【iOS】通过URL Scheme启动app(收集了常用的app的URL Scheme)
  16. matlab 高级绘图函数
  17. part1:企业微信发送消息API调试
  18. 算法LeetCode解题(C++)-15. 四数之和(难度:中等)
  19. Python操纵Word神器——python-docx大全(含插入pptx图表)
  20. 从零开始搭建oj(ubuntu)

热门文章

  1. demo对接php,喜马拉雅数据API 接入 demo PHP版 API
  2. 程序员:面试时,我特么都不敢说我是写公众号的
  3. 那些有趣的网站系列(七)
  4. 微信小程序实现附近医院、加油站、景点和地图路线导航功能(超详细)(附源码)
  5. MATLAB算法实战应用案例精讲-【自动驾驶】精准定位RTK(最终篇)
  6. android获取区域内像素坐标,Android利用BitMap获得图片像素数据的方法
  7. 沈师附属艺术学校计算机,沈阳师范大学附属学校(沈师附中)基本情况介绍
  8. 稀疏光流python_稀稀疏疏是什么意思
  9. 软件工程师应具备的素质
  10. 计算机网络【java面试题】