DSP28335 中DMA的配置和使用

本文根据下面的链接整理而成:

http://bbs.21ic.com/icview-690422-1-1.html

http://blog.csdn.net/wu159632/article/details/7543599

http://bbs.21ic.com/icview-800778-1-1.html

依次来看:

一、官网例程

DMACH1BurstConfig(3,1,10);//
DMACH1TransferConfig(9,1,0);//
DMACH1WrapConfig(1,0,0,1);//

cnsxgh回复:

楼主这个例子应该是ADC-DMA里面的。那根据楼主这个程序,应该只有3个通道。假设是ADC1,ADC2,ADC3,ADC4。
相应的目标地址是DMA[0]-DMA[30]。
DMACH1BurstConfig(3,1,10);//这里,BURST3个字,表示ADC有四个通道。源地址步长是1,表示源地址指针ADC1完了就是ADC2再完了就是ADC3
//目标地址步长是10,表示ADC1的数据挪到DMA[0],ADC2的数据挪到DMA[10],ADC3的数据挪到DMA[20].
DMACH1TransferConfig(9,0,1);//9,表示了一共采10次。
DMACH1WrapConfig(0,0,0,1);//第一个0,表示一Transfer后,就要进行地址回绕,第二个0,回绕步长不增长。第四个,1,表示目标地址回绕后增加1.即第二轮采采集时,ADC1->DMA[1],ADC2->DMA[11],ADC3->DMA[21]

二、用帧数、帧内个数来解释

DMA(Direct Memory Access),即直接存储器存取,是一种快速传送数据的机制。它的优点在于一旦控制器初始化完成,数据开始传送,DMA就可以脱离CPU,独立完成数据传送。不需要依于CPU的大量中断负载,从而节省大量的CPU资源。

TMS320F28335具有6通道DMA,而且每个通道具有独立的PIE中断。DMA的触发源种类有很多,可以配置为ADC、MCBSPs、外部中断、CPU定时器、ePWM1-6 ADCSOCA and ADSOCB和软件等出发方式。DMA可以对L4-L7 16Kx16 SARAM、XINTF外部接口、ADC、MCBSPs、ePWM1-6/HRPWM1-6映射到Peripheral Frame 3空间的寄存器进行数据操作。工作方式可以配置为32位或者16位。吞吐量最高为4时钟/字。需要注意的是,当DMA对MCBSPs进行数据操作时,只能配置为16位工作模式,而且最大的吞吐量为5时钟/字。具体原因参考一下TI的数据手册。下面以TI的例程为例详细讲解一下DMA配置。

28335 DMA的配置主要是一下几个函数,可以在DSP2833x_DMA.c找到。

函数及配置详解:

void DMACHxAddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source)

参数解析:配置DMA的数据目的地址和源地址(跟函数中参数的排序相同,下同)。

void DMACHxBurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep)

参数解析:配置每帧大小、帧内源地址增加偏移和帧内源地址增加偏移。地址增加偏移就是指传输一个字(或帧)之后地址增量。

void DMACHxTransferConfig(Uint16 tsize, int16 srctstep, int16 deststep)

参数解析:配置每次触发DMA转移多少帧、帧间源地址增加偏移和帧间源地址增加偏移。

void DMACHxWrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep)

参数解析:配置源地址偏移总量、重载的源地址、目的地址偏移总量、重载的目的地址。也就是说在源地址(或者目的地址)偏移量超过所设置的偏移总量的时候重载所设置的新的源地址(或者目的地址)。我是这么理解的。

void DMACHxModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte)

参数解析:配置触发源选择、触发源使能、ONESHOT使能、继续模式使能、外设同步使能、同步对象选择(源同步还是目的同步)、溢出中断使能、工作方式选择(16位还是32位)、产生中断模式选择(开始还是结束)、产生中断使能。

三、用脉冲个数及帧来解释

void DMACH1AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source)
    
   源地址有两个,一个A为用于传输时(随每个字节递增),另一个B作为返回的备份(当一帧结束后,重新装载入A)
    
   目的地址有两个,一个A为用于传输时(随每个字节递增),另一个B作为返回的备份(当一帧结束后,重新装载入A)
    
   每次启动DMA相应通道,都会把B装载入A
        void DMACH1BurstConfig(Uint16 bsize, int16
srcbstep, int16 desbstep)
        Bsize: 每一个脉冲传递的字的个数,实际脉冲数为bsize+1
    
   Srcbstep:每传递一个字后,源地址A增量
        Desbstep:每传递一个字后,目的地址A增量

void DMACH1TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep)
 
      Tsize:每一帧的脉冲个数,脉冲递减到0时(即一帧传递完成,也是DMA传递完成),产生DMA中断。实际帧数为tsize+1
    
   Srctstep:每个脉冲的最后一个字传递结束后,源地址A增量
    
   Deststep:每个脉冲的最后一个字传递结束后,目的地址A增量

void DMACH1WrapConfig(Uint16
srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep)
    
   Srcwsize:当已经传递的脉冲数为srcwsize+1的整数倍时,源地址(B)增加srcwstep(常为0),并装载入源地址A
    
   Deswsize:当已经传递的脉冲数为deswsize+1的整数倍时,目的地址(B)增加deswstep(常为0),并装载入目的地址A

void DMACH1ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot,
Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize,
Uint16 chintmode, Uint16 chinte)
        Persel:选择触发DMA的外设中断源
    
   Perinte:外设中断使能,
    
   Oneshot:使能时,外设产生一次中断,就能够把一帧传递完。禁止,外设产生一次中断,只能传递一个脉冲
    
   Cont:使能时,每次DMA结束后,需要再次启动DMA时,就不需要调用void StartDMACH1(void)。禁止时,重启DMA,需要调用void
StartDMACH1(void)
        Datasize:设置每个字是16位或者32位
    
   Chintmode:设置DMA中断是在DMA启动或者结束时产生
        Chinte:DMA相应通道的中断使能(外设级)。
    
   注:Perinte和Chinte同时使能时,才能进入DMA通道中断
    
   仅Perinte使能,可以传输数据,但是不进入通道的中断程序

void StartDMACH1(void)
    
   首次启动DMA,若Cont为禁止,每次DMA结束后,需要再次启动DMA时需要调用
    
   只开启相应用于触发的外设级中断,不开启PIE对应位,则能够触发DMA而不触发CPU的中断程序
    
   经过DMACH1ModeConfig配置的中断,DMA会自动清除相应外设级的中断标志位,不用程序清除。

三个一结合,就看明白了。

时间: 2024-08-26 00:16:42

DSP28335 中DMA的配置和使用的相关文章

在Web.config或App.config中的添加自定义配置

.Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持.最近看到一些项目中还在自定义xml文件做程序的配置,所以忍不住写一篇用系统自定义配置的随笔了. 如果你已经对自定义配置了如指掌,请忽略这篇文章.? 言归正传,我们先来看一个最简单的自定义配置 <?xml version="1.0" encoding="utf-8" ?> <configuration>

MyBatis框架中Mapper映射配置的使用及原理解析(七) MapperProxy,MapperProxyFactory

从上文<MyBatis框架中Mapper映射配置的使用及原理解析(六) MapperRegistry> 中我们知道DefaultSqlSession的getMapper方法,最后是通过MapperRegistry对象获得Mapper实例: public <T> T getMapper(Class<T> type, SqlSession sqlSession) { final MapperProxyFactory<T> mapperProxyFactory =

Django中的URL配置和模板

Django中的URL配置 : 实例: Python代码   urlpatterns = patterns('', # Example: # (r'^myweb/', include('myweb.foo.urls')), # Uncomment the admin/doc line below and add 'django.contrib.admindocs' # to INSTALLED_APPS to enable admin documentation: # (r'^admin/doc

MyBatis框架中Mapper映射配置的使用及原理解析(三) 配置篇 Configuration

从上文<MyBatis框架中Mapper映射配置的使用及原理解析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder> 我们知道XMLConfigBuilder调用parse()方法解析Mybatis配置文件,生成Configuration对象. Configuration类主要是用来存储对Mybatis的配置文件及mapper文件解析后的数据,Configuration对象会贯穿整个Mybatis的执行流程,为Mybatis的执行过程提供必要的配

MyBatis框架中Mapper映射配置的使用及原理解析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder

在 <MyBatis框架中Mapper映射配置的使用及原理解析(一) 配置与使用> 的demo中看到了SessionFactory的创建过程: SqlSessionFactory sessionFactory = null; String resource = "mybatisConfig.xml"; try { sessionFactory = new SqlSessionFactoryBuilder().build(Resources .getResourceAsRea

Xcode 中 Git 的配置与使用

Xcode 中 Git 的配置与使用主要围绕下面几个问题展开阐述: 问题1,如何在Xcode中创建本地代码库,并添加和提交代码到本地代码库? 问题2,如何在Xcode中提交推送给远程服务器代码库? 问题3,如何在Xcode中克隆远程服务器代码库到本地? 问题4,如何使用Xcode获取远程代码库数据,并解决冲突问题? 一.如何在Xcode中创建本地代码库,并添加和提交代码到本地代码库? 创建代码库有两种方式: 方式1:新建工程的时候创建 1. 勾选Create Git repository on

Netsreen NSRP环境中如何同步配置

NSRP环境中如何同步配置 环境: 1.FW1为主设备 2.FW2为从设备 3.确定FW1上的配置为当前正常工作 以下命令在FW2上执行: nsisg2000(B)-> exec nsrp sync global save 随后将出现以下输出: nsisg2000(B)-> load peer system config to save Save global configuration successfully. Continue to save local configurations .

解决struts2中validation.xml配置无效的问题

解决struts2中validation.xml配置无效的问题,我使用了xml的验证,却始终发现无法生效,后面发现才是xml的头文件的格式问题,修改了一下就好了. 成功的xml <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"> <val

在RedHat Linux系统中安装和配置snmp服务

检查系统是否安装snmp服务 # rpm -qa|grep snmp net-snmp-5.3.2.2-17.el5 net-snmp-perl-5.3.2.2-17.el5 net-snmp-devel-5.3.2.2-17.el5 net-snmp-libs-5.3.2.2-17.el5 net-snmp-utils-5.3.2.2-17.el5 net-snmp-libs-5.3.2.2-17.el5 net-snmp-devel-5.3.2.2-17.el5 SNMP服务安装后会有以上安