资料
当前位置:首页 > 其他范文 > 资料 > 列表页

dsp28335中文资料

小草范文网  发布于:2017-04-25  分类: 资料 手机版

篇一:DSP28335代码学习

1.2、外设位域结构体方法综述

1.2.1、传统#define的方法

C代码访问寄存器的传统方法是使用#define宏为每一个寄存器分配一个地址。例如:

#define CPUTIMER0_TIM (volatile unsigned long *) 0x0c00

#define CPUTIMER0_PRD (volatile unsigned long *) 0x0c02

#define CPUTIMER0_TCR(volatile unsigned long *) 0x0c04

#define CPUTIMER0_TPR (volatile unsigned long *) 0x0c06

…..

同样的#define方法将在每一个外设寄存器上不断重复

弊端:

不容易访问寄存器中的位域部分

不容易在CCS观察窗口显示位域的值

不能利用CCS的自动完成功能

对于重复的外设,头文件的开发者不能获得重复利用的便利。

1.2.2、位域及结构体的方法

位域及结构体方法采用C代码的结构体方式,将属于某个指定外设的所有寄存器组成一个集合。通过链接器,每个C代码结构体就是外设寄存器的内存映射。这一映射允许编译器通过使用CPU数据页指针(DP)直接访问外设寄存器。另外,多数寄存器都定义了位域,从而使编译器能够读取或者操作某一个寄存器中的单个位域。

(1)下面代码是

下面代码示例是一个DSP28335的CPU定时器存器对应的C代码结构体类型。

// CPU Timer Register File:

//

struct CPUTIMER_REGS {

union TIM_GROUP TIM;// Timer counter register

union PRD_GROUP PRD;// Period register

union TCR_REGTCR;// Timer control register

Uint16 rsvd1; // reserved

union TPR_REGTPR;// Timer pre-scale low

union TPRH_REG TPRH; // Timer pre-scale high

};

该结构体类型包括6个成员组成,前后顺序与他们在内存中的顺序相同。CPUTIMER_REGS代表了一个结构体类型。他和系统已经定义的标准类型如int,char等一样可以用来作为定义变量的类型。

注意:

1、寄存器名字出现的顺序必须与他们在内存中被安排的顺序相同

2、在结构体中,通过使用保留变量rsvd1等来预留内存中的保留位置。这种保留结构体仅仅用以预留内存中的空间

3、Uint16 是无符号16位数类型定义,相应的类型定义申明由DSP2833x_Device.h文件建立。

(2)申明可访问寄存器的变量

寄存器结构类型可被用来申明一个可访问寄存器的变量,对器件的每个外设都采用这一相同的做法,同一种外设的复用外设可以采用同样的结构体类型定义。例如一个器件上有3个CPU-timer,可以创建如下所示的3个具有struct CPUTIMER_REGS结构体类型的变量。

volatile struct CPUTIMER_REGS CpuTimer0Regs ; // 定义CpuTimer0Regs是一个具有CPUTIMER_REGS类型的变量 volatile struct CPUTIMER_REGS CpuTimer1Regs ;

volatile struct CPUTIMER_REGS CpuTimer2Regs ;

关键字volatile在变量声明中十分重要。它告诉编译器,这些变量的内容可由硬件改变,并且编译器无需优化使用volatile变量的代码。

(3)分配专用的数据区

单有上面的两个定义还不够,还必须为3个CPU定时器分配数据区。分配某个定时器在数据区的起始地址必须与系统定义的该定时器的内存地址一致。在DSP2833x_GlobalVariableDefs.c文件中,通过使用编译器的#pragma DATA_SECTION指令,与外设寄存器结构体类型相对应的每一个变量分配一个专用的数据区。任何使用DSP2833x外设头文件的项目都必须包含这个源文件。该文件时外设寄存器结构体变量及数据区分配的一个声明,在source目录中建立。下面代码为定时器0,1,2分配的数据区。 // FILE:

// TITLE: DSP2833x_GlobalVariableDefs.c// 全局变量默认文件 DSP2833x Global Variables and Data Section Pragmas.//

//###########################################################################

// $TI Release: DSP2833x/DSP2823x C/C++ Header Files V1.31 $

// $Release Date: August 4, 2009 $

//###########################################################################

#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File

//---------------------------------------------------------------------------

// Define Global Peripheral Variables:

//----------------------------------------

#ifdef __cplusplus // 用于C++代码

#pragma DATA_SECTION("CpuTimer0RegsFile")

#else

#pragma DATA_SECTION(CpuTimer0Regs,"CpuTimer0RegsFile");// 用于C代码

#endif

volatile struct CPUTIMER_REGS CpuTimer0Regs;

//----------------------------------------

#ifdef __cplusplus

#pragma DATA_SECTION("CpuTimer1RegsFile")

#else

#pragma DATA_SECTION(CpuTimer1Regs,"CpuTimer1RegsFile");

#endif

volatile struct CPUTIMER_REGS CpuTimer1Regs;

//----------------------------------------

#ifdef __cplusplus

#pragma DATA_SECTION("CpuTimer2RegsFile")

#else

#pragma DATA_SECTION(CpuTimer2Regs,"CpuTimer2RegsFile");

#endif

volatile struct CPUTIMER_REGS CpuTimer2Regs;

注:

#ifdef #else #endif 为预处理器条件编译指令。对器件的每个外设寄存器结构体变量,都会重复这一数据区分配操作。

(4)映射到外设寄存器

当每个结构体都分配到自身的数据区以后,通过使用链接命令文件DSP2833x_Header_nonBIOS.cmd ,

FILE: DSP2833x_Headers_nonBIOS.cmd

// TITLE:DSP2833x Peripheral registers linker command file

// DESCRIPTION:

// This file is for use in Non-BIOS applications.

// Linker command file to place the peripheral structures

// used within the DSP2833x headerfiles into the correct memory

// mapped locations.

// This version of the file includes the PieVectorTable structure.

// For BIOS applications, please use the DSP2833x_Headers_BIOS.cmd file

// which does not include the PieVectorTable structure.

//###########################################################################

MEMORY /*定义存储区域*/

{

PAGE 0: /* Program Memory */

PAGE 1: /* Data Memory */

CPU_TIMER0 : origin = 0x000C00, length = 0x000008 /* CPU Timer0 registers */

CPU_TIMER1 : origin = 0x000C08, length = 0x000008 /* CPU Timer0 registers (CPU Timer1 & Timer2 reserved TI use)*/ CPU_TIMER2 : origin = 0x000C10, length = 0x000008 /* CPU Timer0 registers (CPU Timer1 & Timer2 reserved TI use)*/ }

SECTIONS/*分配存储区域*/

{

CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1 /* 将CpuTimer0RegsFile段分配到CPU_TIMER0区域*/

CpuTimer1RegsFile : > CPU_TIMER1, PAGE = 1

CpuTimer2RegsFile : > CPU_TIMER2, PAGE = 1

}

通过把变量直接映射到外设寄存器的同一内存地址,用户采用C代码对寄存器进行访问,只需要通过访问变量中所需的成员即可。例如对CpuTimer0 TCR寄存器进行写操作,只需访问CpuTimer0Regs变量中的TCR成员,如以下代码所示:

CpuTimer0Regs.TCR.all = TSS_MASK;

上面的操作是对CpuTimer0Regs.TCR整体赋值操作,可以通过添加位域结构体,直接访问某位。

1.2.3 添加位域结构体

(1)增加位域定义

我们经常需要直接访问寄存器中的某一位,C2833x C头文件及外设示例所涉及的位域结构体方法,为多数片上外设寄存器提供了位域定义。例如CPU_Timer控制寄存器的位域定义如下

// CPU Timer Register Bit Definitions:

// TCR: Control register bit definitions:

struct TCR_BITS { // bits description

Uint16 rsvd1:4; // 3:0reserved

Uint16 TSS:1;// 4 Timer Start/Stop

Uint16 TRB:1;// 5 Timer reload

Uint16 rsvd2:4; // 9:6reserved

Uint16 SOFT:1; // 10 Emulation modes

Uint16 FREE:1; // 11

Uint16 rsvd3:2; // 12:13 reserved

Uint16 TIE:1;// 14 Output enable

Uint16 TIF:1;// 15 Interrupt flag

};

然后通过共用体进行申明,以便访问位域结构体定义的各个成员或者16位或32位寄存器的值。例如,定时器的控制寄存器共用体如下所示:

// FILE: DSP2833x_CpuTimers.h

union TCR_REG// 定义共用体类型TCR_REG(不是变量)

{

Uint16 all;

struct TCR_BITS bit; //bit是一个具有TCR_BITS结构体类型的变量

};

还例如:

// TPR: Pre-scale low bit definitions:

struct TPR_BITS { // bits description

Uint16 TDDR:8; // 7:0Divide-down low

Uint16 PSC:8;// 15:8 Prescale counter low

};

union TPR_REG {

Uint16 all;

struct TPR_BITS bit;

};

// TPRH: Pre-scale high bit definitions:

struct TPRH_BITS { // bits description

Uint16 TDDRH:8;// 7:0Divide-down high

Uint16 PSCH:8; // 15:8 Prescale counter high

};

union TPRH_REG {

Uint16 all;

struct TPRH_BITS bit;

};

等等,一旦每个寄存器的位域结构体和共用体的定义都建立起来了,则在CPU定时器(CPU-Timer)的寄存器结构体类型中,各个成员可以通过采用共用体定义的形式写。如前文所给的示例:

// FILE: DSP2833x_CpuTimers.h

// CPU Timer Register File:

struct CPUTIMER_REGS {

union TIM_GROUP TIM;// Timer counter register

union PRD_GROUP PRD;// Period register

union TCR_REGTCR;// Timer control register

Uint16 rsvd1; // reserved

union TPR_REGTPR;// Timer pre-scale low

union TPRH_REG TPRH; // Timer pre-scale high

};

到此,我们就可以既能访问CPUTimer寄存器中的某位,也可以对整个寄存器进行访问:

CpuTimer0Regs.TCR.bit.TSS = 1;

CpuTimer0Regs.TCR.all =TSS _MASK;

注意:对没有位域结构体和共用体定义的寄存器,不能使用*.bit或*.all名称进行访问。

2.3、关于ConfigCpuTimer()函数的说明

在DSP2833x_CpuTimers.c中,包含了两个函数:一个是定时器初始化函数InitCpuTimers(转自:wWw.XiAocAoFanWeN.cOm 小 草 范文网:dsp28335中文资料)(),另一个是CPU定时器的配置函数ConfigCpuTimer()。

1、对指令 Timer->RegsAddr->TCR.bit.TRB = 1; 的注解

“struct CPUTIMER_VARS *Timer”

*为指针运算符,Timer是一个具有CPUTIMER_VARS结构体类型的指针变量,它指向结构体CPUTIMER_VARS。通过(*Timer).xxx可以访问CPUTIMER_VARS结构体中的xxx成员。在C语言中,为使用方便和使之直观,可以把(*Timer).xxx用Timer->xxx来代替。“->”是成员选择指针。看下面指令:

Timer->RegsAddr->TCR.bit.TRB = 1;

为了弄清楚前面两个指针的的含义,先引入结构体CPUTIMER_VARS有关定义。

// CPU Timer Support Variables:

//

struct CPUTIMER_VARS//该函数由DSP2833x_CpuTimers.h文件建立

{

volatile struct CPUTIMER_REGS *RegsAddr;

Uint32 InterruptCount;

floatCPUFreqInMHz;

floatPeriodInUSec;

};

这个结构体列出了CPU定时器所支持的变量,其第一个成员是一个包含CPU定时器所有专用寄存器的结构体(CPUTIMER_REGS),RegsAddr是一个具有CPUTIMER_REGS结构体类型的指针变量,InterruptCount是定时器中断计算器,另外两个的乘积构成定时器的周期。

现在再引入CPU定时器寄存器结构体CPUTIMER_REGS的有关定义:

// CPU Timer Register File:

//

struct CPUTIMER_REGS // 该定义由由DSP2833x_CpuTimers.h文件建立

{

union TIM_GROUP TIM;// Timer counter register

union PRD_GROUP PRD;// Period register

union TCR_REGTCR;// Timer control register

Uint16 rsvd1; // reserved

union TPR_REGTPR;// Timer pre-scale low定时器预定标计数低位

union TPRH_REG TPRH; // Timer pre-scale high

};

这个结构体声明有6个成员,除第4个成员保留外,其余5个均属于CPU定时器专用寄存器,其中“union TCR_REGTCR;”声明TCR_REG是一种共用体类型,同时定义相应的共用体变量TCR,以便引用。下面列出TCR_REG共用体类型定义及TCR控制寄存器位域结构体(TCR_BITS)定义。

// CPU Timer Register Bit Definitions:

// TCR: Control register bit definitions:

struct TCR_BITS //该定义由由DSP2833x_CpuTimers.h文件建立

{ // bits description

Uint16 rsvd1:4; // 3:0reserved

篇二:关于28335各个模块的理解

PWM的使用 // Configure ePWM1

// Setup TBCLK

EPwm1Regs.TBPRD = EPWM_TIMER_TBPRD;

// Set timer period 1500/2 TBCLKs

EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0 EPwm1Regs.TBCTR = 0x0000; // Clear counter

// Set Compare values

EPwm1Regs.CMPA.half.CMPA = EPWM_CMPAB; // Set compare A value

//EPwm1Regs.CMPB = EPWM_CMPAB;// Set Compare B value

// Setup counter mode

EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up down

EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE;// enable phase loading use for sync

EPwm1Regs.TBCTL.bit.PHSDIR=TB_UP;

EPwm1Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_IN;

EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2+TB_DIV4+TB_DIV4; // TBClock ratio = SYSCLKOUT/(2*HSPCLKDIV*

EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; //2^CLKDIV)

// Setup shadowing

EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

//EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // Load on Zero

// EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

// Set actions

EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A on event A, up count

EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;// Clear PWM1A on event A, down count

// EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR; //Clear PWM1B on event A, up count

// EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;// Set PWM1B on event A, down count

// Set DeadBand EPwm1Regs.DBCTL.bit.IN_MODE=DBA_ALL; EPwm1Regs.DBCTL.bit.POLSEL=DB_ACTV_HIC; EPwm1Regs.DBCTL.bit.OUT_MODE=DB_FULL_ENABLE; EPwm1Regs.DBRED=Dbred;// Dead-band rising edge delay EPwm1Regs.DBFED=Dbfed;// Dead-band falling edge delay // Set Trip Zone EPwm1Regs.TZSEL.bit.OSHT1=TZ_ENABLE; EPwm1Regs.TZCTL.bit.TZA=TZ_FORCE_LO; EPwm1Regs.TZCTL.bit.TZB=TZ_FORCE_LO;

// Interrupt where we will change the Compare Values

EPwm1Regs.ETSEL.bit.SOCBSEL= ET_CTR_ZERO;// Select start ADC (EPWMxSOCB) on Zero event

EPwm1Regs.ETSEL.bit.SOCBEN= Enable; // EnableEPwm1Regs.ETPS.bit.SOCBPRD=ET_1ST;

主要注意的就是EPWM的死区子模块。由比较器产生A,B个比较信号进入动作限定子模块,并且出来EPWMxA(1)与EPWMxB(1)两路信号,然后进入死区模块。对于死区模块是双输入双输出的,输入为EPWMxA(1)与EPWMxB(1),输出为EPWMxA(2)与EPWMxB(2),其中(2)的信号可以由(1)的其中一个或者两个共同产生。对于我的使用时为了产生SVPWM去控制IPM,因此需要互补信号,只要用EPWMxA(1)去产生EPWMxA(2)与EPWMxB(2)。 一个ePWM module包括Time-base (TB) module,Counter-compare (CC) module,Action-qualifier (AQ) module,Dead-band (DB) module,PWM-chopper (PC) module,Event-trigger (ET) module,Trip-zone (TZ) module等七个模块。正常的发出PWM波要配置TB、CC、AQ、DB、ET等五个模块。

Time-base (TB) module为定时器模块,有

TBCTL(控制寄存器)配置定时器的时钟、计数模式、同步模式

TBSTS(状态寄存器)

TBPHSHR(高速PWM用)

TBPHS(相位寄存器)计数器的起始计数位置,例如寄存器为0x0100则计数器从0x0100开始计数

TBCTR(计数器)

TBPRD(周期寄存器)设置计数器的计数周期。只有TBPRD(周期寄存器)有影子寄存器。

本程序的设置为count-up-and-down mode计数模式,相位为零,ePWM2 、

ePWM3、 ePWM4、 ePWM5、 ePWM6通过ePWM1的计数器到零时进行同步,计数周期为0.5ms。

Counter-compare (CC) module为比较器模块有

CMPCTL (比较控制寄存器)设置CMPA、CMPB的重载模式

CMPAHR(高速PWM用),

CMPA(比较值寄存器A)设置EPWMxA的比较值,有影子寄存器。

CMPB(比较值寄存器B)设置EPWMxB的比较值,有影子寄存器。

本程序只应用了CMPA,设置计数器到零时重载CMPA。

Action-qualifier (AQ) module比较方式预设模块

AQCTLA (输出A比较方式控制寄存器)设置EPWMA的比较方式有CBD、CBU、CAD、CAU、PRD、ZRO,无影子寄存器,立即装载

AQCTLB (输出B比较方式控制寄存器)设置EPWMB的比较方式有CBD、CBU、CAD、CAU、PRD、ZRO,无影子寄存器,立即装载

AQSFRC (软件强制控制寄存器)设置AQCSFRC重载方式(RLDCSF),通过(OTSFB、ACTSFB)设置EPWMB、(OTSFA、ACTSFA)设置EPWMA启动一次强制置位无效、置零、置高、反向,当OTSFB、OTSFA被写1时,动作一次,写0无效,无影子寄存器

AQCSFRC (软件连续强制控制寄存器)可以强制EPWMA、EPWMB的输出为low或high或AQCSFRC不起作用,有影子寄存器,当寄存期被加载后的第二个时钟开始作用,如TBCLK=0时加载,TBCLK=1时开始起作用

说明:

CBD为TBCTR(计数器)与CMPB在down计数时相等使输出为low或high或反向或不动作

CBU为TBCTR(计数器)与CMPB在up计数时相等使输出为low或high或反向或不动作

CAD为TBCTR(计数器)与CMPA在down计数时相等使输出为low或high或反向或不动作

CAU为TBCTR(计数器)与CMPA在up计数时相等使输出为low或high或反向或不动作

PRD为TBCTR(计数器)与TBPRD(周期寄存器)相等时使输出为low或high或反向或不动作

ZRO为TBCTR(计数器)计到零时使输出为low或high或反向或不动作

注意:以上均是相等时起作用,其它时间不管,只有AQCSFRC(软件连续强制控制寄存器)持续起作用

如同时出现比较则优先级如图

例:CMPA=100,CMPB=100,up计数,EPWMA初始为低,CAU设置高,CBU设置低,当TBCTR计到100时,CAU、CBU同时作用,根据优先级,EPWMA输出低。

当CMPA=100,CMPB=110,其它不变,当TBCTR计到100时,EPWMA输出高,计到110时EPWMA输出低。

本程序只应用了EPWMA输出通过Dead-band (DB) module产生互补的PWM波形。Action-qualifier (AQ) module比较方式预设模块配置如下:AQCTLA (输出A比较方式控制寄存器)的CAU置高,CAD置低,其它无效。在初始化中配置。

AQCSFRC (软件连续强制控制寄存器)通过AQSFRC(软件强制控制寄存器)的RLDCSF配置为TBCTR(计数器)计到零时装载,根据需要每次中断配置CSFA置高、置低或软件连续强制无效。其优先级最高,强制时CAU置高,CAD置低不起作用,无效时CAU置高,CAD置低起作用。

AQSFRC(软件强制控制寄存器)的ACTSFA配置为置低,当本周期软件连续强制无效时,向OTSFA写1,保证有效高周期的起始是低状态,防止上一周期结束时为高。

Dead-band (DB) module死区模块

DBCTL(死区控制寄存器)设置S5,S4,S3,S2,S1,S0开关选择的

DBRED(死区上升沿延时)上升沿延时时间

DBFED(死区下降沿延时)下降沿延时时间

本程序的设置为S5=0,S4=0,S3=1,S2=0,S1=1,S0=1;延时时间为5us。EPWMxA= EPWMxA in,EPWMxB为EPWMxA in的反向。

Event-trigger (ET) module中断事件模块

ETSEL(中断选择寄存器)使能及事件源选择(SOCA触发ADC转换,SOCB触发ADC转换,中断)

ETPS(中断预设寄存器)xxxCNT记录时间发生次数,当与xxxPRD相等时,发出中断信号,xxxCNT停止计数,当标志为清除时xxxCNT置零重新计数 ETFLG(中断标志寄存器)状态标志位,中断时为1

ETCLR(中断标志清除寄存器)写1清除相应标志位

ETFRC(强制中断寄存器)写1强制相应中断发生

本程序选择SOCA触发ADC转换,TBCTR=0位中断事件源,xxxPRD为1。

TMS320F28335定时器配置简介 写在最前,不喜请略过。本博文的主要内容已在QQ空间、人人网、网易博客、百度空间等平台发表过,作者为Mr_D_prince(斌斌-龙臻),也就是本人,前两者均为我在非技术论坛的昵称。在技术论坛我更喜欢newofcortexm3这个昵称,原因无他,我就是个技术新人。之所以文章类型为什么是整理,是因为博文的主要内容均来自TI

相关的技术手册,我只是做了下解读或者整理。

TMS320F28335的CPU Time有三个,分别为Timer0,Timer1,Timer2,其中Timer2是为操作系统DSP/BIOS保留的,当未移植操作系统时,可用来做普通的定时器。这三个定时器的中断信号分别为TINT0, TINT1, TINT2,分别对应于中断向量INT1,INT13,INT14。图1为定时器的结构框图,图中TIMH:TIM为计数寄存器,PRDH:PRD为周期寄存器,AH:A的形式表示一个32位的寄存器,是由两个16位的寄存器构成,AH是高16位,A是低16位。

CPU定时器的计数复位时,计数寄存器TIMH:TIM加载周期寄存器PRDH:PRD的值,经历一个计数器时钟时,TIMH:TIM内的值就减1,一直减到0,这时产生定时器周期中断事件,并重新装载PRDH:PRD的值,重新开始计数。置于每隔多少时间,定时器计数器才会减1由预定标寄存器TPRH:TPR来决定。TPRH和TPR这两个寄存器由两部分组成,高8位为定时器预定标计数器PSC,低8位是定时器分频TDDR。也即是说,TPRH是由PSCH和TDDRH构成,而TDDR由PSC和TDDR构成。且其工作的原理与定时器计数器类似,复位时,PSCH:PSC加载TDDRH:TDDR的值,然后经过一个CPU时钟,PSCH:PSC的值减1,当PSCH:PSC的值减到0时,会再次装载TDDRH:TDDR的值,并且产生一个计数器时钟,TIMH:TIM减1。

篇三:DSP技术实验指导书28335

《DSP技术》 课程实验指导书

中原工学院电子信息学院

2015-5-4

《电能变换与控制试验平台—DSP技术》课程实验指导书

一、课程的目的、任务

本课程是电气工程及其自动化专业学生在学习电力电能变换及控制方向

课程中的一门实践性技术课程,其目的在于通过实验使学生能更好地理解和掌握电能变换及控制基本理论,培养学生理论联系实际的学风和科学态度,提高学生的电工实验技能和分析处理实际问题的能力。为后续课程的学习打下基础。 二、课程的教学内容与要求

本试验平台可完成DSP技术CCS使用、时钟、中断、定时器、A/D转换、EV事件管理模块和通信等实验,可根据教学大纲的要求进行选取。

三、各实验具体要求 见P2 四、实验报告

学生结束实验后应完成相应的实验报告并交给指导老师。其中实验报告的主要内容包括:实验目的,实验内容,实验结果和实验心得等。

实验一 CCS软件的认识

实验目的

1. 熟悉 CCS 集成开发环境,掌握工程的生成方法; 2. 掌握 CCS 集成开发环境的调试方法;

实验内容:

1. DSP 源文件的建立;

2. DSP 程序工程文件的建立;

3. 学习使用 CCS 集成开发工具的调试工具;

实验知识背景:

CCS 提供了配置、建立、调试、跟踪和分析程序的工具,它便于实时、嵌入式信号处理程序的编制和测试,它能够加速开发进程,提高工作效率。CCS 提供了基本的代码生成工具,它们具有一系列的调试、分析能力。

(1)CCS3.3的安装与配置和CCS3.1类似,先安装CCS3.3,路径可选择为

C:\CCStudio_v3.3,桌面上会出现和两个图标,然后安装硬件仿真器usb驱动

SEED-XDSUSB_CCS3.3,路径仍为C:\CCStudio_v3.3,C:\CCStudio_v3.3\drivers出现

Seedusb2.cfg文件,安装完毕后,先双击图标进入Code Composer Studio Setup,在

Family下拉列表中选择C28xx。 软件仿真模式:如果进行软件仿真,则双击选择F28335 Device Simulator,F28335 Device Simulator即出现在MySystem中,然后单击左下角的Save&Quit,在弹出的Start Code Composer Studio on exit?对话框中选择“是”,即可打开Code Composer Studio进行软件仿真。

硬件仿真模式:如果连接硬件仿真器,进行硬件调试,则双击选择F28335 XDS510 Emulator,F28335 XDS510 Emulator即出现在MySystem中,然后在MySystem中,在F28335 XDS510 Emulator上单击右键选择Properties,在弹出的窗口中将Auto-generate board data file 改为Auto-generate board data file with extra configuration,点击Browse选择Seedusb2.cfg,接着点击Next,Finish,最后单击左下角的Save&Quit,在弹出的Start Code Composer Studio on exit?对话框中选择“是”,即可打开Code Composer Studio进行硬件仿真。

1.内存、寄存器的查看操作

1) 查看寄存器使用 view →Registers →CPU Registers 命令 2) 查看内存 使用 view →memory命令 2.Graph 的设置即图形显示

1) 选择View →Graph →Time/Frequency。

2) 在弹出的Graph Property Dialog对话窗中, 将 Graph Title,Start Address,Acquisition Buffer Size,Display Data Size,DSP Data Type等的

属性可改变为如下图所示(也可根据具体需要设置属性)。向下滚动右侧的滚动条或调整 dialog 框的大小可看到所有的属性。

示例将起始地址为将要观察的数组名如sinne, 512个存储单元以32位浮点数格式进行图形显示

3) 点击OK,将出现所设的图形窗口。如:在滤波实验中,用示例(A)方法设定的图形窗口,在运行滤波程序前后,显示结果如下图所示(可以观察到滤波前后的波形:上边为原始图形,下边为滤波后的波形) :

4) 可以在图形上单击右键,选择“Float In Main Table,这时图形将浮现在窗 口中,以便观察。

实验步骤

可按以下两种方式完成实验: 1、修改已有工程

(1)将CCS设置为软件仿真模式,点击Save&Quit进入 CCS 环境;如果已经设置过了

直接双击图标进入 CCS 环境。

(2)将已有工程jx\DSP2833x_common、jx\ DSP2833x_headers和jx\jx三个文件加的内容复制到自己创建的目录中。

(3)点击Project-->Open, 在建立的文件夹中打开ccs.pjt (4)点击ccs.pjt前的+,打开源文件ccs.c。 (5)将ccs.c文件按所有实现的目标修改,保存

(6)点击 Project →Build all,对工程进行编译,如正确则生成*.out文件;也可以使用 Project →Build命令进行编译连接,它只对修改部分做编译连接工作。可节省编译与连接的时间。编译通过,生成.out文件。

(7)点击 File →load program,在弹出的对话框中载入 debug 文件夹下的.out 可执行文件。

(8)装载完毕后点击 debug →Go Main回到 C程序的入口,即可进行调试。 2、自己新建工程

(1)将CCS设置为软件仿真模式,点击Save&Quit进入 CCS 环境;如果已经设置过了

直接双击图标进入 CCS 环境。

(2)选择 File →New →Source File 命令创建源文件

(3)编写源代码,选择 File →Save保存源程序名为 ccs.c (4)创建其他源程序(如.cmd)可重复上述(2)(3)步骤。

(5)点击Project-->New,创建一个新工程,弹出对话框,在Project 中填入工程名,Location 中输入工程路径,工程名及路径最好设为英文,其余按照默认选项,点击完成即可完成工程创建。

(6)在Projects中出现所建工程,在其上点击右键选择 add files to project,添加

本文已影响