热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

TMS320C6474学习总结(十一)EDMA3使用说明

1.什么是EDMA3控制器?EDMA3(EnhancedDirectMemoryAccess3):增强型直接存储器访问的控制器。它是DSP中一个高效数据传输引擎,其结

1. 什么是EDMA3控制器?

       EDMA3(Enhanced Direct Memory Access 3):增强型直接存储器访问的控制器。它是DSP中一个高效数据传输引擎,其结构适合数据的高速传输。直接存储器访问是一种重要的数据访问方式,可以在没有CPU参与的情况下,由控制器完成存储空间的数据转移,适用于软件触发的页面传输(片外存储空间与片内存储空间间进行传输)、适用于事件触发的外设(串口及接口UTOPIA)。利用EDMA3控制器对多变的数据结构进行子帧的提取及排列,减轻CPU在数据传输方面的负担。

2. EDMA3的特征

       ①提供三个维度完全正交的传输方式(三个维度之间不存在相互干扰);

              EDMA3支持一维传输(A同步传输:一次触发只搬移ACNT个字节的数据)和二维传输(A-B同步传输:一次触发只搬运ACNT*BCNT个字节数据)这两种方式,不支持三维传输(A-B-C同步传输),但可以通过配置EDMA3为周期性事件触发模式,同时配置好CCNT的值,就可以实现A-B-C的三维传输。

       ②可变的独立源地址和目的地址;

              EDMA3在初始化时会设定源地址和目的地址,在EDMA3的传输过程中,其源地址和目的地址会不断往后偏移,来实现数据从源地址+偏移位置往目的地址+偏移位置端转移。

       ③支持事件同步传输、手动同步传输以及链接同步传输方式;

              事件同步传输:外设、系统或者外部产生的事件触发产生发送请求

              手动同步传输:CPU通过在对应的寄存器位(ESR/ESRH)上写1来人为触发产生发送请求

              链接同步传输:一个发送的完成来触发另一次的发送(要终止发送,可以将OPT中的LINK设为NULL)

       ④EDMA3具有64个DMA通道,8个QDMA通道,256个PaRAM参数集,每一个通道都可以与给定的事件队列和PaRAM相关联。

       ⑤EDMA3主要包括EDMA3CC(通道控制器)和EDMA3TC(传输控制器),EDMA3CC是用户控制EDMA控制器的接口,是EDMA3中用户编程的一部分。EDMA3CC包括PaRAM参数、通道控制寄存器以及中断控制寄存器。传输控制器EDMA3TC负责数据的搬移并分别向源地址和目的地址发出读写命令,源地址和目的地址是在EDMA3CC中设定的。

3. EDMA3CC主要以下几个模块

       1. PaRAM:PaRAM参数设置了数据传输的一些信息,例如源地址、目的地址、传输的数据大小,以及传输方式等信息。

       2. EDMA3事件和中断处理寄存器:实现事件和参数设置的映射,事件使能/去使能,中断使能/去使能/清除中断等。

       3. 事件队列:事件队列处于事件探测逻辑和发送请求提交逻辑之间。

       4. 内存保护寄存器:内存保护寄存器定义了DMA通道阴影区域和PaRAM区域的入口。

       5. 区域寄存器:区域寄存器允许DMA源(DMA通道和中断)被分配到独特的区域。

       6. 调试寄存器:调试寄存器允许访问可视的寄存器来读取队列状态、控制器状态和事件状态。

4. PaRAM参数集

      EDMA3共有256个PaRAM参数集,DMA和QDMA的通道传输内容(源/目的地址、数量、索引值等)都是在PaRAM中设置的。用户可以将256个PaRAM映射到任意DMA通道或QDMA通道上,来控制传输控制器进行一定数据量的搬运。

PaRAM各字段含义


字段

含义

OPT

传输配置选项

SRC

数据来源端的字节地址

ACNT

一个array中的连续字节数

BCNT

一帧中的array数

DST

数据目的端的字节地址

SRCBIDX

源BCNT索引值,用于指示传输帧中,

数据源的阵列array的间隔

DSTBIDX

目的BCNT索引值,用于指示传输帧中,

数据目的端的阵列array的间隔

LINK

当前PaRAM耗尽时,用于LINK的PaRAM的地址

BCNTRLD

A同步传输时,BCNT耗尽时的重载值

SRCCIDX

源CCNT索引值,用于指示传输帧中,

数据源的帧间的间隔

DSTCIDX

目的CCNT索引值,用于指示传输帧中,

数据目的端的帧间的间隔

CCNT

一个传输块中的帧数

5. DMAQDMA的区别

       DMA和QDMA通道的不同之处在于使用的触发条件不同。DMA的触发方式有三种:主动触发、事件触发以及链接触发。而QDMA的触发方式是自动触发和链接触发模式,自动触发是指只要配置了PaRAM参数就会自动触发,链接触发与DMA比较类似。QDMA只能发送一维Array的数据格式,而DMA可以发送一维、二维和三维的数据格式。

4. 配置EDMA3发送的主要步骤

       1. DMA通道的初始化:

              a. 通道选择,包括通道类型选择以及通道号选择,特别是事件触发时,不同的事件绑定了不同的通道号(在主动触发方式下,可以任意选择通道号,但如果是事件触发模式,必须使用触发事件对应的通道号)。

                #define g_Edma3ChanNUM     20

                 #define g_PaRAMNum         30

/*EDMA364DMA通道,8QDMA通道,可任意选择通道号,但主要不要冲突*/

/*PaRAM共有256个参数集,可任意映射至DMA通道和QDMA通道,注意不要冲突*/

              b. 通道映射,配置DCHMAP寄存器,指定PaRAM参数地址映射到使用的通道号

      *(Edma3_DCHMAP0 + 4 * g_Edma3ChanNUM) = g_PaRAMNum <<5;

 /*PaRAM 30 映射到DMA通道20 */

此处寄存器中显示可以配置0-511PaRAM,但实际上只有256PaRAM

              c. EDMA通道分区设置,EDMA3通道控制器寄存器分为全局寄存器、全局区域寄存器和阴影区域寄存器,如果将某个通道设置为阴影区域,那么后续操作必须使用阴影区域的寄存器(一般不用阴影区域,可以不用配置)。

              d. 阴影区域通道使能,打开相应的DMA通道中断使能;

/*如果使用的通道为阴影区域,则需要置位对应阴影通道的使能寄存器*/

              e. 将选择的EDMA通道设置到需要的队列上,每个队列的优先级是不同的。

                               *Edma3_DMAQNUM0 = 0x44444444; 

/*将选择的通道设置到队列4上,EDMA3CC共有8个队列,每个队列深度是16个事件,也就是说一个队列可以配置16个通道的队列号*/

       2. PaRAM参数配置

              根据搬移的数据类型,参照PaRAM各字段含义,将PaRAM的参数写入与使用通道绑定的PaRAM中。

                                  *t_PARAM_ADDR ++ = 0x0010000C;       //写入OPT

                                  *t_PARAM_ADDR++ = (UINT)0x00801000;        //写入SRC

                                  *t_PARAM_ADDR++ = (16<<16) + 16;        //写入BCNT ACNT

                                 *t_PARAM_ADDR++ = (UINT)0x00802000;      //写入DST

                                *t_PARAM_ADDR++ = (16<<16) + 16;        //写入STBIDX   SRCBIDX

                                *t_PARAM_ADDR++ = 0x0001FFFF;     //写入BCNTRLD   LINK

                                *t_PARAM_ADDR++ = 0x0000000;        //写入DSTCIDX   SRCCIDX

                                *t_PARAM_ADDR++ = 0x00000001;           //写入Rsvd   CCNT

 

       3. 中断配置

              PaRAM中的OPT字段中应该使能相应的中断,另外需要通过设置IESR/IESRH使能中断相应。

       4. 触发传输

              a. 事件触发,通道如果触发源是事件,即当外部事件发生时,EDMA3自动传输一次数据。

              b. 手动传输,通过CPU手动配置ESR寄存器触发

                         *Edma3_ESR = 0x1<//触发传输

              c. 链接触发,当上一个通道的传输完成码等于下一DMA通道时,上一通道传输完成将触发下一通道传输数据。

       5. 等待完成

              a. 在中断复位函数中等待,如果按照3中的设置,那么当传输完成后,EDMA3会给CPU产生中断,中断函数中必须将IPR/IPRH清零,方便下次实用性相同的标志位。

              b. 轮询寄存器,如果未使能中断相应,那么可以等待相应的IPR/IPRH位置1,表示传输完成,IPR/IPRH必须清零,方便下次使用相同的标志位。

 

 

 

附表:EDMA3通道同步事件对照表

EDMA3 Channel Synchronization Events


Channel

Event

30

TCP2_A Receive Event

0

HPI/PCI-to-DSP Event

31

TCP2_A Transmit Event

1

Timer 0 Lower Counter Event

32

UTOPIA Receive Event

2

Timer 0 Higher Counter Event

33

TCP2_B Receive Event

3-8

None

34

TCP2_B Transmit Event

9

Embedded Trace Buffer (ETB) is Half Full

35-39

None

10

Embedded Trace Buffer (ETB) is Full

40

UTOPIA Transmit Event

11

Embedded Trace Buffer (ETB) Acquisition is Complete

41-43

None

12

MCBSP0 Transmit Event

44

I2C Receive Event

13

MCBSP0 Receive Event

45

I2C Transmit Event

14

MCBSP1 Transmit Event

46-47

None

15

MCBSP1 Receive Event

48

GPIO Event 0

16

Timer1 Lower Counter Event

49

GPIO Event 1

17

Timer1 Higher Counter Event

50

GPIO Event 2

18

None

51

GPIO Event 3

19

RapidIO Interrupt 0

52

GPIO Event 4

20

RapidIO Interrupt 1

53

GPIO Event 5

21

RapidIO Interrupt 2

54

GPIO Event 6

22

RapidIO Interrupt 3

55

GPIO Event 7

23

RapidIO Interrupt 4

56

GPIO Event 8

24

RapidIO Interrupt 5

57

GPIO Event 9

25

RapidIO Interrupt 6

58

GPIO Event 10

26-27

None

59

GPIO Event 11

28

VCP2 Receive Event

60

GPIO Event 12

29

VCP2 Transmit Event

61

GPIO Event 13

30

TCP2_A Receive Event

62

GPIO Event 14

31

TCP2_A Transmit Event

63

GPIO Event 15

 


推荐阅读
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
  • 本文详细介绍了Python中列表的创建、访问、修改、排序及遍历等基本操作,帮助初学者快速掌握列表这一重要数据结构。 ... [详细]
  • 解析SQL查询结果的排序问题及其解决方案
    本文探讨了为什么某些SQL查询返回的数据集未能按预期顺序排列,并提供了详细的解决方案,帮助开发者理解并解决这一常见问题。 ... [详细]
  • 哈密顿回路问题旨在寻找一个简单回路,该回路包含图中的每个顶点。本文将介绍如何判断给定的路径是否构成哈密顿回路。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 本文详细介绍了C语言的起源、发展及其标准化过程,涵盖了从早期的BCPL和B语言到现代C语言的演变,并探讨了其在操作系统和跨平台编程中的重要地位。 ... [详细]
  • 深入解析for与foreach遍历集合时的性能差异
    本文将详细探讨for循环和foreach(迭代器)在遍历集合时的性能差异,并通过实际代码示例和源码分析,帮助读者理解这两种遍历方式的不同之处。文章内容丰富且专业,旨在为编程爱好者提供有价值的参考。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
author-avatar
echo7111436
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有