DSP原理及应用实验指导书

更新时间:2024-03-05 22:23:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《DSP原理及应用》实验指导书

武汉理工大学教材中心

2009年7月

实验一 CCS基本操作实验

一、实验目的

重点学习CCS的基本操作,练习C语言和汇编语言编程及调试。

二、实验设备 计算机,CCS软件

三、实验内容与步骤 1.CCS设置

双击桌面上的图标,先选择Close,进入如图4.1所示的配置对话框。由于本实验采用软件仿真器(Simulator)进行软件仿真,因此应从Available Board/Simulator Types列表栏中选择C54x Simulator,在C54x Simulator上单击右键,选择Add to System。然后按照向导设置均选择默认设置即可。注意:如果要从另一种平台转变为C54x Simulator平台,应右击System Configuration列表中的该平台,再选择Remove删除,然后才能按照本步骤对CCS进行设置。

图4.1 CCS设置

2.创建新项目文件

创建一个新的工程,将使用CCS 来创建一个工程,并向这个工程里添加源程序文件和库文件,它采用标准的C 语言库函数来显示一条“hello world”消息。创建一个新的工程的操作步骤如下:

(1)运行CCS软件,进入如图1-1 所示的画面。

图 1-1 CCS 的进入画面

(2) 选择“Project”→“New”,弹出如图1-2 所示的对话框。

图1-2 新建工程对话框

(3) 在“Project Name”中输入“myhello”作为工程名,在“Location”(位置)中选择你所建的工作文件夹,然后在“Project Type”中选择“Executable(.out)”。输入完成后单击“Finish”按钮,CCS将会建立一个叫做“myhello.prj”的工程文件,这个文件保存了你的工程的设置和涉及到的变量文件。 3、创建所需文件

1)创建“hello.c”源程序

/***********************************************************************/ /* */ /* H E L L O . C */ /* */ /* Basic C standard I/O from main. */ /* */ /* */ /***********************************************************************/

#include

void main()

{

puts(\}

2)创建“hello.cmd”文件

/*************************************************************************/ /* C5402 DSK DSP Memory Map */ /* */ /*************************************************************************/ MEMORY {

PAGE 0: VECS: origin = 0FF80h, length = 0100h /* Internal Program RAM */ PRAM: origin = 2800h, length = 8000h /* Internal Program RAM */

PAGE 1: SCRATCH: origin = 0060h, length = 0020h /* Scratch Pad Data RAM */ DMARAM: origin = 0C00h, length = 0300h /* DMA buffer */

DATA: origin = 1100h, length = 0080h /* Internal Data RAM */ STACK: origin = 1180h, length = 0560h /* Stack Memory Space */ INRAM: origin = 1900h, length = 0100h /* Internal Data RAM */ HPRAM0: origin = 1A00h, length = 0002h /* HPI memory accessible by Host and DSP */

HPRAM1: origin = 1A02h, length = 0280h /* HPI memory accessible by Host and DSP */

HPRAM2: origin = 1C82h, length = 0280h /* HPI memory accessible by Host and DSP */

EXRAM: origin = 1F10h, length = 01000h /* External Data RAM */ EXRAM2: origin = 2F10h, length = 0D000h /* External Data RAM */ }

/*************************************************************************/ /* DSP Memory Allocation */ /*************************************************************************/

SECTIONS {

.cinit > PRAM PAGE 0 .text > PRAM PAGE 0 .vectors > VECS PAGE 0

init_var > PRAM PAGE 0 detect > PRAM PAGE 0 vrcprg > PRAM PAGE 0 matprg > PRAM PAGE 0

.stack > STACK PAGE 1

.trap > SCRATCH PAGE 1

.const > EXRAM PAGE 1 .data > EXRAM PAGE 1 .bss > EXRAM2 PAGE 1 .cio > EXRAM PAGE 1

.switch > EXRAM PAGE 1

tables > EXRAM PAGE 1 var > EXRAM PAGE 1

svctab > EXRAM PAGE 1 /* SS_V LSP table */ vctab > EXRAM PAGE 1 /* V LSP table */ uvctab > EXRAM PAGE 1 /* UV LSP table */

cuvtab > EXRAM PAGE 1 /* Stochastic codebook */ cdbktab > EXRAM PAGE 1 /* various codebook tables*/

logtab > EXRAM PAGE 1 /* table for log2 */ powtab > EXRAM PAGE 1 /* table for pow2 */ hamtab > EXRAM PAGE 1 /* table for hamming */ lgwtab > EXRAM PAGE 1 /* table for lag window */ acostab > EXRAM PAGE 1 /* table for arccos */ sqrtab > EXRAM PAGE 1 /* table for square root */

acbtab > EXRAM PAGE 1 /* table for thresholds in acb */

pm03tab > EXRAM PAGE 1 /* table for x^(-0.3) computation */ costab > EXRAM PAGE 1 /* table for cosine */

V23 > INRAM PAGE 1 FSK > INRAM PAGE 1

hpibuff0 > HPRAM0 PAGE 1 hpibuff1 > HPRAM1 PAGE 1 hpibuff2 > HPRAM2 PAGE 1 dma_buff > DMARAM PAGE 1 }

(CMD文件说明:CMD是用来分配ROM和RAM空间用的,不同的芯片就有不同大小的ROM和RAM。放用户程序的地方也不尽相同,所以要根据芯片进行修改。分两部分:MEMORY和SECTIONS。

MEMORY是用来指定芯片的ROM和RAM的大小和划分出几个区间。 PAGE 0 对应ROM; PAGE 1 对应RAM。

PAGE 里包含的区间名字与其后面的参数反映了该区间的起始地址和长度。 SECTIONS:(在程序里添加下面的段名如” .vectors”用来指定该段名以下,另一个段名以上的程序(属于PAGE0)或数据(属于PAGE1)放到“>”符号后的空间名字所在的地方。)

4.向项目中加入文件

(向工程里添加文件的操作步骤如下:

(1) 选择“Project”→“Add Files to Project”,然后选择“hello.c”文件。

(2) 选择“Project”→“Add Files to Project”,然后在文件类型中选择“Asm Source Files (*.a*,*.s*)”。

(3) 选择“Project”→“Add Files to Project”,在文件类型框中选择连接命令文件(*.cmd),然后选择“hello.cmd”并打开。这个文件包含程序段到存储器的映射。

(4) 选择“Project”→“Add Files to Project”,进入编译库文件夹(c:\\ti\\c5400\\cgtools\\lib),再在文件类型框中选择目标文件和库文件(*.o*, *.l*),然后选择“rts.lib”并打开。这个库对目标系统DSP提供了运行实时支持。

(5) 单击紧挨着Projects、hello.pjt、Libraries 和Source 旁边的“+”标记来扩充工程(Projects)列表,这个列表叫做工程窗口(Project View)。

(6) 此时,包含文件还没有出现在工程窗口里。

(7) 如果需要从工程中删除某一个文件,则只需要在工程窗口中的相应文件上单击鼠标右键,并从弹出的菜单里选择“Remove from project”(删除)即可。

5.浏览代码

和Windows的浏览器相似,只要在项目文件查看窗口中打开“+”号展开下面的文件,在工程窗口里双击 hello.c 文件,在主窗口(右半窗口)就会显示相应文件的源程序,出现图1-3,此时可以浏览并检查源程序。

图1-3 查看源程序

6.编译、运行程序

(1)选择Project→Rebuilt All或单击工具条中的按钮,CCS将重新编译、链接项目中的所有文件。整个过程的信息将在窗口下方的信息框内显示。如果有错误,就需要检查、修改源程序,然后再重新编译、链接,直到通过编译链接为止。

(2)选择File→Load Program并选中hello.out,这样CCS就把程序加载到目标系统DSP中。

(3)选择Debug→Run或单击工具条中的→Halt或单击工具条中的

按钮,这样程序就可以运行起来。选择Debug

按钮,就可以使程序退出运行状态。

图 1-4 hello 程序运行结果

7.跟踪/调试程序

(1)使用断点(Breakpoint)与观察窗口(Watch Window) 当开发和测试一个程序时,经常需要在程序运行过程中检查一个变量的值。这里使用断点与观察窗口来观察这些变量,也可以到达断点后使用step命令。

将C:\\ti\\tutorial\\sim54xx目录下的volume1文件拷贝到C:\\ti\\myprojects文件夹下。打开该工程并编译通过,选择File→Load Program并选中volume.out,把程序加载到目标系统DSP中。

①在项目文件查看窗口中双击volume.c文件; ②将光标移到下面这行:

dataIO();

③单击

或按F9键,此时该行红色高亮显示,表示一个断点已经被设置。

按钮或按F5键,或选择Debug→Run,开始运行。当运行到断点

④单击工具条中的

时停止,直到再次按。如果需要使程序回到main处,选择Debug→Go Main。

⑤选择View→Watch Window,一个单独的窗口将出现在CCS窗口的右下方,如图1-5所示。用鼠标右击该窗口,在窗口中填入要观察的变量的名称查看其结果。例如:input等。

图1-5 观察变量

⑥单击

(Step Over)或按F10键单步调用执行指令。

尝试使用CCS提供的step命令:

? ? ?

Step Into(F8) Step Over(F10) Step Out(shift+F7)

? Run to Cursor(Ctrl+F10) ?

(2)加入文件输入/输出探针(Probe Point)

①选择File→Load Program并选中volume.out,再单击Open。 ②在项目文件查看窗口中双击volume.c文件。

③把光标放在主程序(main function)的下面这行:

dataIO();

④单击或按F9键,此时该行蓝色高亮显示,表示一个探点已经被设置。

⑤选择File→File I/O,这时File I/O对话框显示出来,从中选择与该探点相关联的输入或输出文件。

⑥在File Input栏中选择Add File,在随后出现的对话框中选择sine.dat文件并单击Open。

一个关于sine.dat的控制窗口显示出来,如下图所示。在此后运行程序时,使用该窗口利用这个数据文件开始、结束、重复、快速向前运行程序。

⑦在File I/O对话框中进行如下设置:

Address设置为inp_buffer,Length设置为100,同时选中Wrap Around。

⑧单击Add Probe Point,Break/Probe Points的探点窗口将显示出来,如下图所示。在Connect To栏的下拉菜单中选择sine.dat,单击Replace 。Probe Point列表发生变化,显示出探点被连接到sine.dat文件上。

⑨单击确定,File I/O对话框显示文件已经被连接到探点上。 ⑩单击确定,关闭File I/O对话框。 (3)图形显示

①选View→Graph→Time/Frequency?打开图形显示设置窗口。在弹出的对话框中按图设置: “Graph Title”为Input(也可以是其它名字);“Start Address”为inp_buffer;“Acquisition Buffer Size”和“Display Data Size”均设为100;“DSP Data Type”为16-bit signed integer。

②单击OK,会生成一个名为Input图形(显示)窗口。

③在该输入图形窗口中单击右键,并从弹出菜单中选择Clear Display。

④再次选择View→Graph→Time/Frequency?,并改变“Graph Title”为Output(也可以是其它名字);“Start Address”为out_buffer,其它设置一律不变。

⑤单击OK,系统显示一个名为Output的图形(显示)窗口,在该输出图形窗口中单击右键,并从弹出菜单中选择Clear Display。

⑥在volume.c源程序窗口中,将光标移到指令所在行,并在此处设置一个断点,即单击(Toggle Breakpoint)。此时将探点和断点都放置在同一个命令行上,这就会使得运行操作时(传输数据或刷新图形时目标程序)只暂停一次。

⑦重排窗口可以看到所有的图形。 ⑧单击工具条中的按钮(Animate)或按F12键运行程序。观察Input窗口和Output窗口的变化。如图所示。

⑨选择Debug→Halt,使程序退出运行状态。 (4)调整增益

选择View→Watch Window,并将gain作为要观察的变量输入,通过改变gain的取值从而改变增益。

四、实验报告要求

1、简述CCS的基本特点

2、调试实验内容,得到相应结果,分析在调试过程中出现的问题,并如何解决问题。

实验二 FIR数字滤波器实验

一、实验目的

1. 掌握FIR数字滤波器的原理。

2. 掌握FIR数字滤波器的DSP实现方法。

二、实验原理

数字滤波器一直以来就是数字信号处理器最广为人知的应用。数字滤波器有别于模拟滤波器的优点是:1)可重复设计,不需更改任何硬件电路的设计,就可以将一个低通滤波器重新设计成一个高通滤波器。2)执行阶段可以直接更新滤波器的系数,形成适应性滤波器。滤波器分成两种形态:有限长度脉冲响应(FIR)滤波器。FIR指的是单一采样响应的期间是有限长的,IIR指的是单一采样响应的期间是无限长的。FIR滤波器的特性可以用一个差分方程来描述:

y(n)?h(0)x(n)?h(1)x(n?1)?h(2)x(n?2).....

其中a0,a1,a2...是滤波器的系数。常用的滤波器有:低通、高通、带通及带阻滤波器。滤波器特性可以由很多的参数来决定,这些参数包括带通涟波、带阻涟波、带通截止频率及带阻截止频率。在设计FIR滤波器时,必须根据这些参数来确定

FIR滤波器的系数及阶数。这个过程可以通过几种方法来完成。一是通过Matlab软件来完成,二是通过专门的数字滤波器设计的软件包来完成。这一过程本实验不详述,本实验假定该过程已经完成,并得到了滤波器的阶数及系数。

本实验完成32阶的FIR数字低通。

三、程序主要代码

1、FIR滤波器程序

下面为一个FIR低通通用程序。 LOWPASS .set 1 .global start,fir .mmregs

COFF_FIR_START: .sect \ .if LOWPASS

.include \ .endif

K_FIR_BFFR .set 32

d_data_buffer .usect \FIR_DP .usect \d_filin .usect \d_filout .usect \ .asg AR4,FIR_DATA_P .asg AR6,INBUF_P .asg AR7,OUTBUF_P .sect \ nop start:

LD #FIR_DP,DP ;加载数据页指针 STM #d_data_buffer,FIR_DATA_P RPTZ A,#K_FIR_BFFR-1

STL A,*FIR_DATA_P+;置数据缓冲区为0 STM #d_filin,INBUF_P;新采样数据指针 STM #d_filout,OUTBUF_P;滤波输出指针 STM #100h,BK fir_loop:

NOP ;Add Breakpoint & porbe point LD *INBUF_P,A;获得输入采样数据 CALL fir ;执行滤波 STH A,*OUTBUF_P+% main_end:

b fir_loop ;Add Breakpoint fir:

SSBX SXM SSBX FRCT

STM #d_data_buffer,FIR_DATA_P

STL A,*FIR_DATA_P;将采样数据放入数据缓冲X(n) STM #(d_data_buffer+K_FIR_BFFR-1),FIR_DATA_P fir_task:

RPTZ A,#K_FIR_BFFR-1

MACD *FIR_DATA_P-,COFF_FIR_START,A ;乘加累加,且将数据缓冲区的数据移位。 RET

.end 2、创建“fir.cmd”文件 MEMORY {

PAGE 0:

PROG: o= 100h,l= 2000h PAGE 1:

DATA1: o= 2600h, l= 1000h DATA2: o= 2100h, l= 100h DATA3: o= 2200h, l= 100h DATA4: o= 2300h, l= 100h DATA5: o= 2400h, l= 100h

DATA6: o= 2500h, l= 100h }

SECTIONS {

coff_fir : {}> PROG PAGE 0 fir_prog : {}> PROG PAGE 0 fir_vars : {}> DATA1 PAGE 1 fir_coff : {}> DATA2 PAGE 1 fir_bfr : {}> DATA3 PAGE 1 }

四、实验步骤

如果你使用的是软件仿真,实验步骤如下:

1) 新建一个工程,创建fir滤波器源程序和配置文件。 2) 将文件添加到工程中。

3) 将文件夹lowpass拷贝到新建的工程文件夹内。

4) 打开Project 选单,选择“Build Options” 选项,在Linker 菜单项中修改

“Autoinit Model”为 “No Autoinitialization ”然后单击确定。

5) 打开“Project ”选单,选择“Rebuild all”选项Code Composer Studio 重新编

译和链接这个工程项目,在屏幕下方的“Message”窗口中返回整个的处理过程信息。

6) 打开fir.asm 文件在“fir_loop:” 程序段的“NOP ”上点击右键选中Toggle

Breakpoint,重复单击右键选中Toggle Probe Point, 在“main_end: ”程序段内的“b fir_loop” 行上单击右键选中Toggle Breakpoint 。以上步骤是为了完成在程序中加入断点。

7) 打开“File ”选单,选择“Load Program” 选项,在“Load Program” 对话框

中,选中FIR目录下的fir.out 文件。

8) 打开“File” 选单,选择“File I/O” 选项,就会在屏幕上弹出“File I/O ”

对话框中,单击“Add File” 键。就会在屏幕上再弹出“File Input” 的对话框,双击C:\\ti\\myprojects\\fir\\lowpass\\64300.dat,单击Add Probe Point。将出现Break/Probe/Profile Points 的对话框,单击Probe Point 框中的选项之后,在Connect 中选中“FILE IN: c:\\ti\\myprojects\\fir\\64300.dat”。单击“Replace ”之后,按“确定”键,就会回到“File I/O” 对话框,在“Address ”中填写“d_filin”( 数据输入地址),在“Length” 中填写“1”( 每次读入一个点数据)。然后单击“确定”,这样就使数据输入到程序中。

9) 选择 VIEW 选单中 Graph 副选框内的Time/Frequency 打开对话框,修改以下内

容。

Display Type:选择显示形式 Graph Title:图表名称 Start Address:起始地址 Page:显示数据模式

Acquisition Buffer Size:获得缓冲器的大小 Index Increment:索引增量

Display Data Size:显示数据的大小 DSP Data Type:DSP 数据类型 Sampling Rate:采样频率

按如下步骤打开图形窗口显示输入信号波形

a) Display Type: Singel Time,

如要看频谱则选为FFT Magnitude, Graph Title: d_filin

Start Address:d_data_buffer Acquistition Buffer Size: 32 Display Data Size:32

DSP Data Type:16-bit signed integer Autoscale:on

点击下面的OK 完成设置。

按如下步骤打开图形窗口显示滤波后输出信号的波形。

b) Display Type: Singel Time,

如要看频谱则选为FFT Magnitude, Graph Title: d_filout Start Address: d_filout

Acquistition Buffer Size: 128 Display Data Size:128

DSP Data Type:16-bit signed integer Autoscale:on

点击下面的OK 完成设置。

1) 打开“Debug” 选单,选择“Animate” 选项或按F12 运行程序,观察运行结果。 2) 打开“Debug”选单,选择“Halt” 选项或按Shift+F5终止实验程序。

五、实验报告要求

1、简述实验目的;

2、简述FIR的基本原理;

3、调试实验内容,得到相应结果,分析在调试过程中出现的问题,并如何解决问题。

实验三 DSP的定时器应用

——定时器实现数字振荡器

一、实验目的

1.更进一步掌握定时器和中断的使用;

2.学会用数字振荡器方法产生正弦/余弦信号; 二、实验原理

利用定时器及中断产生频率为f正弦信号,定时器被设置成每1/fs产生中断一次(等效于采样速率),在中断服务程序中用迭代算法计算出一个正弦值。用此方法可以很精确地产生某频率的正弦波。

设一个传递函数为正弦序列sin?T,其Z变换为H(z)?Cz?1,其中A=2cos?T,

?1?21?Az?BzB=-1,C=sin?T。设初始条件为0,求出其反Z变换得:

y[k]?Ay[k?1]?By[k?2]?Cx[k?1]

是一个二阶差分方程,其单位冲击响应即为sinkωT,利用单位冲击函数x[k-1]的性质,即仅当k=1时,x[k-1]=1,推导得:

y[n]?Ay[n?1]?By[n?2]

在k>2以后,y[k]能用y[k-1]和y[k-2]算出,这是一个递归的差分方程。式中

A?2cos?T?2cos(2*n*f/fs),

B??1

C?sin?T?sin(2*n*f/fs)

fs为采样频率,f为正弦波频率。A为正弦波幅度。可见用数字频率振荡器产生正弦波的实质就是用程序实现上述的递归差分方程。

如要产生振荡器的频率为2kHz正弦波,设采样速率为40k,通过定时器设置,每隔25us中断一次,即产生一个y[n]。则递归差分方程系数为:

A?2cos?T?2cos(2*?*f/fs)?2cos(2*?*2000/40000)?2*0.95105652

B=-1

C?sin?T?sin(2*?*f/fs)?sin(2*?*2000/40000)?0.30901699

为了便于定点DSP处理,将所有系数除以2,然后用16位定点格式表示为:A=79bcH,B=C000H,C=13c7H,这便是产生2kHz正弦信号的三个系数。

主程序初始化时先计算出y[1]和y[2],然后开放定时器中断,以后每次进入定时器中断服务程序时,利用前面计算出的y[1]和y[2]计算出新的y。

初始化y[1]和y[2]

SSBX FRCT ;置FRCT=1,准备进行小数乘法运算 ST #0x79BC,AA ;将常数装入变量AA ST #0xC000H,BB ;将常数装入变量BB ST #0x13C7H,CC;将常数装入变量CC PSHD CC ;将CC压入堆栈 POPD Y2 ; 初始化Y2=CC

LD AA,T ; 将AA装到 T寄存器

MPY Y2,A ;Y2乘以系数A,结果放入A寄存器 STH A,Y1 ;将A寄存器的高16位存入变量Y1

;中断服务程序段:

LD BB,T ;将系数B装入T寄存器

MPY Y2,A ;Y2乘系数B,结果放入A寄存器 LTD Y1 ;将Y1装入T寄存器,同时复制到Y2 MAC AA,A ;完成新正弦数据计算,A寄存器

;中为Y1*AA+Y2*BB

STH A,1,Y1 ;将新数据存入Y1,因所有系数都

;除过2,在保存结果时转移一位, ;恢复数据正常大小

STH A,1,Y0 ;将新正弦数据存入Y0

VC5402的片内定时器利用CLKOUT时钟计数,用三个寄存器(TIM、PRD、TCR)来控制定时器。到定时器实际上可以有20个比特的周期寄存器。它对CLKOUT信号计数,先将PSC 减1,直到PSC 为0,然后用TDDR 重新装入PSC,同时将TIM减1,直到TIM减为0。这时CPU 发出TINT中断,同时在TOUT 引脚输出一个脉冲信号,脉冲宽度为CLKOUT 一致。然后用PRD 重新装入TIM,重复下去直到系统或定时器复位。因而定时器中断的频率由下面的公式决定: TINT的频率=

1,其中tc表示CLKOUT的周期。设置PRD寄存器值为

tc??TDDR?1???PRD?1?12499,TINT中断频率为40kHz。

定时器初始化程序段为: STM #10H,TCR ;停止定时器

STM #2499H,PRD;设置PRD 寄存器值为2499,

;TINT 中断频率为Foutclk =(2499+1)= 100MHz/2500 = 40 kHz

STM #20H,TCR ;重新装入TIM 和PSC,然后;

;启动定时器,在开放中断屏蔽寄存器IMR后,就可以产生频率为2000Hz的正弦波。 三、实验内容与步骤

1.使用C54x汇编语言实现数字振荡器,并通过CCS提供的显示窗口观察输出信号波形以及频谱。

2.根据确定数字振荡器的频率,确定系数。数字振荡器系数的确定在前面已经说明, 3. 启动 CCS,新建工程文件,如文件名为sinewave.pjt。并建立如下文件: 汇编源程序exer3.asm

.title \ .mmregs

.global _c_int00,_tint,vector

OFF_INTIMER .set 04Ch ; vector of INTtimer at VECTOR+OFF_INTIMER

INIT_A .set 079bch ; A/2=0.9510498 INIT_B .set 0c000h ; B/2=-0.5

INIT_C .set 013c7h ; C/2=0.1545105

.bss y0,1 .bss y1,1 .bss y2,1

.bss temp,1 .bss AA,1 .bss BB,1 .bss CC,1

.text _c_int00:

ld #0,dp

ssbx intm ; disable all interrupt ! st #1fffh,sp

ld #vector, a ; get vector table address ! and #0FF80h, a andm #007Fh, pmst or pmst, a

stlm a, pmst ; 设置IPTR stm #10h,TCR ; init TIMER

stm #2499,PRD ; f=100M/(2499+1)=40kHz stm #20h,TCR ; reset TIMER ldm IMR,a ; read back IMR

or #08h,a ; enable TIMER interrupt stlm a,IMR ; set IMR

ld #temp,dp ; set DP ssbx FRCT ; prepare for fraction mpy st #INIT_A,AA ; init AA,BB,CC st #INIT_B,BB ; st #INIT_C,CC ; pshd CC

popd y2 ; init y2,y2=CC ld AA,T ; T=AA

mpy y2,a ; y2*AA -> a sth a,y1 ; y2*AA -> y1 stm #0h,TCR ; enable TIMER nop

rsbx intm ; enable all int ! again: nop

b again nop nop nop nop nop nop

;------------------------------------------------------------- ; interrupt for INT_TIMER !

;------------------------------------------------------------- _tint:

ld #BB,DP

ld BB,T ; T=BB mpy y2,a ; a=y2*BB ltd y1 ; T=y1,y2=y1 mac AA,a ; a=a+y1*AA

sth a,1,y1 ; new cos data -> y1 sth a,1,y0 ; new cos data -> y0

nop ; set breakpoint in CCS !!!

int1_end: nop rete .end

vec_table.asm文件 .mmregs .ref _ret .ref _c_int00 .ref _tint .global vector

.sect \

;-------------------------------------------------------------------- ; interrupte vector table !

;-------------------------------------------------------------------- vector:

rs b _c_int00 nop nop nmi b __ret nop nop sint17 b __ret nop nop sint18 b __ret nop nop sint19 b __ret nop nop sint20 b __ret .word 0,0 sint21 b __ret .word 0,0 sint22 .word 01000h .word 0,0,0 sint23 .word 0ff80h .word 0,0,0 sint24 .word 01000h .word 0,0,0 sint25 .word 0ff80h .word 0,0,0 sint26 .word 01000h .word 0,0,0 sint27 .word 0ff80h .word 0,0,0 sint28 .word 01000h .word 0,0,0 sint29 .word 0ff80h .word 0,0,0 sint30 .word 01000h .word 0,0,0 int0 b __ret nop nop int1 b __ret

nop nop int2 b __ret nop nop tint b _tint nop nop brint0 b __ret nop nop bxint0 b __ret nop nop

trint b __ret nop nop dmac1 b __ret nop nop int3 b __ret nop nop hpint b __ret nop nop

q26 .word 0ff80h .word 0,0,0 q27 .word 01000h .word 0,0,0 dmac4 b __ret nop nop dmac5 b __ret nop nop

q30 .word 0ff80h .word 0,0,0 q31 .word 01000h .word 0,0,0

;-------------------------------------------------------------------------- ; end of interrupte vector table !

;------------------------------------------------------------------------- __ret rete

链接定位sinewave.cmd MEMORY {

PAGE 1:

INT_D : ORIGIN=80h, LENGTH=1F80h PAGE 0:

EXT_P : ORIGIN=2000h, LENGTH=2000h }

SECTIONS{

.text : > EXT_P PAGE 0

.int_table : > (EXT_P ALIGN (128) PAGE (0)) .data : > INT_D PAGE 1 }

选择Project 菜单中的Add File to Project 选项,将汇编源程序exer3.asm、vec_table.asm 和连接定位sinewave.cmd文件依次添加到工程文件中。注意,你可以在添加文件对话框中选择显示不同的文件类型来加快文件选择速度。你也可以使用鼠标右键单击工程文件名(如sinewave.pjt)并选择Add Files 项来添加需要的文件。其中,exer3.asm 包括初始化代码和中断服务程序,而vec_talbe.asm 包含中断向量表。

4. 完成编译、连接,正确生成OUT文件。然后使用File 菜单的“Load Program”选项,将生成的OUT 文件装入DSP 的片内存储器。这时CCS 将显示程序的启始地址_c_int00。 5. 选 View→Graph→Time/Frequency?打开图形显示设置窗口。在弹出的对话框中按图4.1设置,

图4.1 图形属性设置

主要修改“Start Address”为y0(y0为生成的正弦波输出变量);“Acquisition Buffer Size”为1,“DSP Data Type”为“16-bit signed integer”。 6. 在汇编源程序的中断服务程序(_tint)中的“nop”语句处设置断点。选择Debug→Animate,运行程序,观察输出波形。数一数一个周期的正弦波有多少个点?算算频率是否是2kHz?另外,想想Run 和Animate 两种运行方式的区别? 7. 用右键单击图形显示窗口,并选择“Proporties”项以便修改显示属性。将“DisplayType”项改为“FFT Magnitude”以便显示信号频谱。修改“Sampling Rate(Hz)”项为40000,然后退出。注意观察生成的正弦波频率。 四、实验报告要求

1、简述实验目的;

2、简述DSP定时器的基本工作原理;

3、调试实验内容,得到相应结果,分析在调试过程中出现的问题,并如何解决问题。 五、思考题

1.本实验程序产生了一个 2kHz 的正弦信号,请修改程序,产生一个频率相同的余弦信号。为了验证产生的COS 信号,可以同时生成SIN 和COS 信号,然后在两个图形窗口中显示波形。它们应该正好相差π/2 相位。

2. 重新设计和实现一个数字振荡器,采样频率改为为20KHz,输出正弦信号的频率为4KHz。

本文来源:https://www.bwwdw.com/article/trwa.html

Top