实验四 DMA实验

实验四 DMA 实验

一、 实验目的

1、了解 CSL 库函数的使用; 2、学习 DMA 的使用; 3、DMA 功能的实现。 二、 实验器材

1、PC 机、DSP 实验箱;CCS 集成开发环境 三、 实验内容

在 DSP 中 DMA 数据传输。本实验中,采用 DMA 控制器实现内部存储器数 据传输。

四、 基础知识

本实验使用 CSL 的 DMA 模块实现数据传输。 1、 CSL 的使用
在 CSL 中有两种方式对外设进行配置编程: z 基于寄存器进行配置(PER_config( )):对外设寄存器进行设置,生 成的代码短。

z 基于函数进行配置(PER_setup( )):通过一组参数进行配置,生产 代码长。

下面将以 DMA 为例使用 CSL 来对 DMA 的通道 0 进行初始化,并且将起始 地址为 src 的 16 个 16bit 的数据拷贝到目的地址 dst。(基于函数进行配置 DMA_config( ))。 Step 1:在文件中包含头文件 csl.h 和模块/外设的头文件<csl_dma.h>。

#include <csl.h>

#include <csl_dma.h>

// Example-specific initialization

#define N

16 // block size to transfer

#pragma DATA_SECTION(src , “table”)

/* scr data table address */

Uint16 src[N] = {

0xBEEFu, 0xBEEFu, 0xBEEFu, 0xBEEFu,

0xBEEFu, 0xBEEFu, 0xBEEFu, 0xBEEFu,

0xBEEFu, 0xBEEFu, 0xBEEFu, 0xBEEFu,

0xBEEFu, 0xBEEFu, 0xBEEFu, 0xBEEFu

};

#pragma DATA_SECTION(dst , “table2”)

/* dst data table address */

Uint16 dst[N];

Step 2:定义 DMA 通道配置结构。

DMA_Config myconfig = {

DMA_DMACSDP_RMK(

DMA_DMACSDP_DSTBEN_NOBURST, //Burst 禁止

DMA_DMACSDP_DSTPACK_OFF,

//打包禁止

DMA_DMACSDP_DST_DARAM,

//目的端口类型:DARAM

DMA_DMACSDP_SRCBEN_NOBURST, //Burst 禁止

DMA_DMACSDP_SRCPACK_OFF,

//打包禁止

DMA_DMACSDP_SRC_SARAM,

//源端口类型:DARAM

DMA_DMACSDP_DATATYPE_16BIT

//数据传输单位:16bit

),

// 源和目的参数寄存器 DMACSDP

DMA_DMACCR_RMK(

DMA_DMACCR_DSTAMODE_POSTINC, //目的地址修改模式

DMA_DMACCR_SRCAMODE_POSTINC, //源地址修改模式

DMA_DMACCR_ENDPROG_OFF,

//通道传输配置

DMA_DMACCR_REPEAT_OFF,

//重复条件

DMA_DMACCR_AUTOINIT_OFF,

//自动初始化禁止

DMA_DMACCR_EN_STOP,

//通道禁止

DMA_DMACCR_PRIO_HI,

//通道优先级

DMA_DMACCR_FS_ENABLE,

//帧同步

DMA_DMACCR_SYNC_NONE

//同步事件:无

),

/* 通道控制寄存器 DMACCR */

DMA_DMACICR_RMK(

DMA_DMACICR_BLOCKIE_OFF,

DMA_DMACICR_LASTIE_OFF,

DMA_DMACICR_FRAMEIE_ON,

DMA_DMACICR_FIRSTHALFIE_OFF,

DMA_DMACICR_DROPIE_OFF,

DMA_DMACICR_TIMEOUTIE_OFF

),

/* DMACICR */

(DMA_AdrPtr) &src,

/* DMACSSAL */

0,

/* DMACSSAU */

(DMA_AdrPtr) &dst, 0, N, 1, 0, 0 }; Step 3:定义 DMA 句柄。 DMA_Handle myhDma; Void main(void) { //………

/* DMACDSAL */ /* DMACDSAU */ /* DMACEN */ /* DMACFN */ /* DMACFI */ /* DMACEI */

Step 4:初始化 CSL 库。在调用任何一个 CSL 模块的 API 函数之前必须进行一 次 CSL 库函数的初始化。
CSL_init(); Step 5:打开句柄: myhDma = DMA_open(DMA_CHA0,0); //Open DMA Channel 0 Step 6:调用 DMA_config( )配置函数对 DMA 通道进行初始化。由于 C55x 编译 器为所有的数据分配字地址,而 DMA 则对所有的地址当作字节地址,因此,必 须将字地址乘以 2 转换成字节地址。 myconfig.dmacssal = (DMA_AdrPtr)(((Uint16)(myconfig.dmacssal)<<1)& 0xFFFF); myconfig.dmacdsal = (DMA_AdrPtr)(((Uint16)(myconfig.dmacdsal)<<1)& 0xFFFF); DMA_config(myhDma, &myconfig); //Configure Channel Step 7:调用 DMA 开始 DMA 传输: DMA_start(myhDma); /* Begin Transfer */ Step 8:关闭 DMA 通道:
DMA_close(myhDma); 2、 在 CCS 中使用 CSL 时的编译和连接选项设置 Step 1;指定器件型号
在 CCS 中,选择 Project——〉Options,在 Build Options 对话框中,选择 Compiler 标签。在 Category 列表框中,选择 Preprocessor,在 Define Symbols 中,键入器件符号(见下表)。

Step 2: Large/Small 存储器模式选择 在 Category 列表框中,选择 advanced,对 Use Large memory model(-ml)
进行相应的选择。 Step 3:指定工程中使用的 CSL 和 RTS 库文件
在 Category 列表框中,选择 Basic,在 Library search Path field(-l)中 输入库文件所在目录(c:\ti\c5500\bios\lib),在 Include Libraries(-l)中, 输入正确的库文件名。点击 OK。 Step 4;修改 Linker Command 文件
z 必须为.csldata 段分配存储空间 z 必须保留地址为 0x7b 的单元 五、 实验步骤 1、进行硬件连线并配置好 CCS。 2、运行 CCS,选择 Project——〉New…在 c:\ti\myprojects\目录下新建一个工程 文件 dma.pjt。 3、编辑、保存文件 dma.c、vectors.asm、link.cmd,并将文件加入到工程中。
/*******************************dma.c*******************************/ #include <stdio.h> #include <csl.h> #include <csl_dma.h>

// Example-specific initialization

#define

N

16 // block size to transfer

#pragma DATA_SECTION(src,"table1")

/*scrdata tableaddress */

Uint16 src[N] = {

0xBEFFu, 0xBEFFu, 0xBEFFu, 0xBEFFu, 0xBEFFu, 0xBEFFu, 0xBEFFu, 0xBEFFu, 0xBEFFu, 0xBEFFu, 0xBEFFu, 0xBEFFu, 0xBEFFu, 0xBEFFu, 0xBEFFu, 0xBEFFu }; #pragma DATA_SECTION(dst,"table2") /*dstdata tableaddress */ Uint16 dst[N];

DMA_Config myconfig = {

DMA_DMACSDP_RMK( DMA_DMACSDP_DSTBEN_NOBURST, //Burst 禁止

DMA_DMACSDP_DSTPACK_OFF,

//打包禁止

DMA_DMACSDP_DST_DARAM,

//目的端口类型:DARAM

DMA_DMACSDP_SRCBEN_NOBURST, //Burst 禁止

DMA_DMACSDP_SRCPACK_OFF,

//打包禁止

DMA_DMACSDP_SRC_DARAM,

//源端口类型:DARAM

DMA_DMACSDP_DATATYPE_16BIT

//数据传输单位:16bit

),

/* 源和目的参数寄存器 DMACSDP */

DMA_DMACCR_RMK(

DMA_DMACCR_DSTAMODE_POSTINC, //目的地址修改模式

DMA_DMACCR_SRCAMODE_POSTINC, //源地址修改模式

DMA_DMACCR_ENDPROG_OFF,

//通道传输配置

DMA_DMACCR_REPEAT_OFF,

//重复条件

DMA_DMACCR_AUTOINIT_OFF, DMA_DMACCR_EN_STOP,

//自动初始化禁止 //通道禁止

DMA_DMACCR_PRIO_HI,

//通道优先级

DMA_DMACCR_FS_ENABLE, DMA_DMACCR_SYNC_NONE ),

//帧同步 //同步事件:无 /* 通道控制寄存器 DMACCR */

DMA_DMACICR_RMK(

DMA_DMACICR_BLOCKIE_OFF,

DMA_DMACICR_LASTIE_OFF,

DMA_DMACICR_FRAMEIE_ON,

DMA_DMACICR_FIRSTHALFIE_OFF,

DMA_DMACICR_DROPIE_OFF,

DMA_DMACICR_TIMEOUTIE_OFF

),

/* DMACICR */

(DMA_AdrPtr) &src,

/* DMACSSAL */

0,

/* DMACSSAU */

(DMA_AdrPtr) &dst,

/* DMACDSAL */

0,

/* DMACDSAU */

N,

/* DMACEN */

1,

/* DMACFN */

0, 0 };

/* DMACFI */ /* DMACEI */

DMA_Handle myhDma;

void main(void)

{

int i, err = 0;

for(i=0; i<N; i++) dst[i] = 0;

CSL_init();

myhDma = DMA_open(DMA_CHA0,0);

//Open DMA Channel 0

myconfig.dmacssal = (DMA_AdrPtr)(((Uint16)(myconfig.dmacssal)<<1)& 0xFFFF);

myconfig.dmacdsal = (DMA_AdrPtr)(((Uint16)(myconfig.dmacdsal)<<1)& 0xFFFF);

DMA_config(myhDma, &myconfig);

//Configure Channel

DMA_start(myhDma);

//Begin Transfer

while (!DMA_FGETH(myhDma,DMACSR,FRAME));

/* Check data values to make sure transfer happened correctly */

for (i = 0; i < N; i++) {

if (dst[i] != src[i]) ++err;

}

printf ("%s\n",err?"TEST FAILED" : "TEST PASSED"); /* We are through with DMA, so close it */ DMA_close(myhDma); } /****************************end of dma.c***********************/

/*************************vectors.asm***************************/

.sect ".vectors"

.global _rsv

.ref _c_int00

; C entry point

_rsv: NMI: INT0: INT2:

B _c_int00 NOP .align 8 NOP NOP .align 8 NOP NOP .align 8 NOP

;SINT0,reset vector ; branch to C entry point
;SINT1,Nonmaskable interrupt
;SINT2,External interrupt #0
;SINT3,External interrupt #2

NOP .align 8 TINT0: NOP NOP .align 8 RINT0: NOP NOP .align 8 RINT1: NOP NOP .align 8 XINT1: NOP NOP .align 8 USB: NOP NOP .align 8 DMAC1: NOP NOP .align 8 DSPINT: NOP NOP .align 8 INT3: NOP NOP .align 8 RINT2: NOP NOP .align 8 XINT3: NOP NOP .align 8 DMAC4: NOP NOP .align 8 DMAC5: NOP NOP .align 8 INT1: NOP NOP .align 8 XINT0: NOP NOP .align 8

;SINT4,Timer #0 interrupt ;SINT5,McBSP #0 receive interrupt ;SINT6,McBSP #1 receive interrupt ;SINT7,McBSP #1 transmit interrupt, MMC/SD #1 interrupt ;SINT8,USB interrupt ;SINT9,DMA Channel #1 interrupt ;SINT10,interrupt from host ;SINT11,External interrupt #3 or Watchdog timer interrupt ;SINT12,McBSP #2 receive interrupt ;SINT13,McBSP #2 transmit interrupt, MMC/SD #2 interrupt ;SINT14,DMA Channel #4 interrupt ;SINT15,DMA Channel #5 interrupt ;SINT16,External interrupt #1 ;SINT17,McBSP #0 transmit interrupt

DMAC0: NOP

;SINT18,DMA Channel #0 interrupt

NOP

.align 8

INT4: NOP

;SINT19,External interrupt #4 or RTC interrupt

NOP

.align 8

DMAC2: NOP

;SINT20,DMA Channel #2 interrupt

NOP

.align 8

DMAC3: NOP

;SINT21,DMA Channel #3 interrupt

NOP

.align 8

TINT1: NOP

;SINT22,Timer #1 interrupt

NOP

.align 8

IIC: NOP ;SINT23,I2C interrupt

NOP

.align 8

BERR: NOP

;SINT24,Bus Error interrupt

NOP

.align 8

DLOG: NOP

;SINT25,Data Log interrupt

NOP

.align 8

RTOS: NOP

;SINT26,Real-time Operating System interrupt

NOP

.align 8

/************************end of vectors.asm************************/

/**********************link.cmd*******************************/

-c

-stack

0x800

-sysstack 0x200

-heap

0x800

MEMORY { DARAM: SARAM: VECT: SDRAM: Flash: CPLD:
}

origin = 0x200, origin = 0x10000, origin = 0x100, origin = 0x80000, origin = 0x400000, origin = 0x800000,

len = 0xfe00 len = 0x30000 len = 0x100 len = 0x380000 len = 0x3e0000 len = 0x20000

SECTIONS

{

.vectors: {} > VECT

.cinit: {} > SARAM

.text: {} > SARAM

.stack: {} > SARAM

.sysstack {} > SARAM

.sysmem: {} > SARAM

.cio: {} > SARAM

.data:

{} > SARAM

.bss: {} > SARAM

.const: {} > SARAM

.gblinit: {} > SARAM

frt: {} > SARAM

.pinit: {} > SARAM

.sysinit: {} > SARAM

.far: {} > SARAM

.switch: {} > SARAM

.MEM$obj: {} > SARAM

.sysheap: {} > SARAM

.csldata {} > DARAM

table1: {} > DARAM

table2 {} > DARAM

}

/******************************end of link.cmd****************/

4、编译、装载并运行程序。 运行结果:在 Stdout 中打印下列信息
TEST PASSED 或者是
TEST FAILED 其中前面一个打印信息为正确结果。 5、在 link.cmd 中对 table1 和 table2 的分配(DARAM 和 SARAM)进行调整, 并在 dma.c 中的 DMA 配置结构中作相应的调整,如 table1 和 table2 分别分 配在 DARAM 和 SARAM 中,相应的 dma.c 文件为:
/**************************dma.c**************************/ #include <stdio.h> #include <csl.h> #include <csl_dma.h>

// Example-specific initialization

#define

N

16 // block size to transfer

#pragma DATA_SECTION(src,"table1")

/*scrdata tableaddress */

Uint16 src[N] = {

0xBEFFu, 0xBEFFu, 0xBEFFu, 0xBEFFu,

0xBEFFu, 0xBEFFu, 0xBEFFu, 0xBEFFu,

0xBEFFu, 0xBEFFu, 0xBEFFu, 0xBEFFu,

0xBEFFu, 0xBEFFu, 0xBEFFu, 0xBEFFu

};

#pragma DATA_SECTION(dst,"table2")

/*dstdata tableaddress */

Uint16 dst[N];

DMA_Config myconfig = {

DMA_DMACSDP_RMK(

DMA_DMACSDP_DSTBEN_NOBURST,

//Burst 禁止

DMA_DMACSDP_DSTPACK_OFF, DMA_DMACSDP_DST_SARAM,

//打包禁止 //目的端口类型:DARAM

DMA_DMACSDP_SRCBEN_NOBURST,

//Burst 禁止

DMA_DMACSDP_SRCPACK_OFF, DMA_DMACSDP_SRC_DARAM, DMA_DMACSDP_DATATYPE_16BIT

//打包禁止 //源端口类型:DARAM //数据传输单位:16bit

),

/* 源和目的参数寄存器 DMACSDP */

DMA_DMACCR_RMK( DMA_DMACCR_DSTAMODE_POSTINC,

//目的地址修改模式

DMA_DMACCR_SRCAMODE_POSTINC,

//源地址修改模式

DMA_DMACCR_ENDPROG_OFF, DMA_DMACCR_REPEAT_OFF, DMA_DMACCR_AUTOINIT_OFF,

//通道传输配置 //重复条件 //自动初始化禁止

DMA_DMACCR_EN_STOP,

//通道禁止

DMA_DMACCR_PRIO_HI, DMA_DMACCR_FS_ENABLE,

//通道优先级 //帧同步

DMA_DMACCR_SYNC_NONE

//同步事件:无

),

/* 通道控制寄存器 DMACCR */

DMA_DMACICR_RMK(

DMA_DMACICR_BLOCKIE_OFF,

DMA_DMACICR_LASTIE_OFF,

DMA_DMACICR_FRAMEIE_ON,

DMA_DMACICR_FIRSTHALFIE_OFF,

DMA_DMACICR_DROPIE_OFF,

DMA_DMACICR_TIMEOUTIE_OFF

),

/* DMACICR */

(DMA_AdrPtr) &src,

/* DMACSSAL */

0, (DMA_AdrPtr) &dst, 0, N, 1, 0, 0 };

/* DMACSSAU */ /* DMACDSAL */ /* DMACDSAU */ /* DMACEN */ /* DMACFN */ /* DMACFI */ /* DMACEI */

DMA_Handle myhDma;

void main(void)

{

int i, err = 0;

Uint16 srcAddrHi, srcAddrLo;

Uint16 dstAddrHi, dstAddrLo;

for(i=0; i<N; i++) dst[i] = 0;

CSL_init();

myhDma = DMA_open(DMA_CHA0,0);

//Open DMA Channel 0

srcAddrHi = (Uint16)(((Uint32)(&src)) >> 15) & 0xFFFFu;

srcAddrLo = (Uint16)(((Uint32)(&src)) << 1) & 0xFFFFu;

dstAddrHi = (Uint16)(((Uint32)(&dst)) >> 15) & 0xFFFFu;

dstAddrLo = (Uint16)(((Uint32)(&dst)) << 1) & 0xFFFFu;

myconfig.dmacssal = (DMA_AdrPtr)srcAddrLo;

myconfig.dmacssau = srcAddrHi;

myconfig.dmacdsal = (DMA_AdrPtr)dstAddrLo;

myconfig.dmacdsau = dstAddrHi;

DMA_config(myhDma, &myconfig);

//Configure Channel

DMA_start(myhDma);

//Begin Transfer

while (!DMA_FGETH(myhDma,DMACSR,FRAME));

/* Check data values to make sure transfer happened correctly */

for (i = 0; i < N; i++) {

if (dst[i] != src[i]) ++err;

}

printf ("%s\n",err?"TEST FAILED" : "TEST PASSED");

/* We are through with DMA, so close it */

DMA_close(myhDma);

}

/*******************end of dma.c************************/

6、编译、装载并运行程序。

六、 实验报告 1、简述 CSL 的使用。 2、简述 CSL 中 DMA 模块的使用步骤。 3、 对本次实验作出小结。


相关文档

实验四DMA
实验报告四(DMA)-08314110xxx-姓名
实验四DMA传送实验
DMA实验
STM32 实验15 DMA实验
实验六 ARM的DMA实验
实验十二 DMA实验
实验3@DMA
5.3 DMA实验
实验二、DMA特性及8237应用实验
电脑版