DSP实验教案_dsp实验教案

2020-02-28 教案模板 下载本文

DSP实验教案由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“dsp实验教案”。

汇编语言程序设计实验

实验一 程序的控制与转移

一、实验目的1、掌握条件算符的使用。

2、掌握循环操作指令(BNAZ)

二、实验设备

计算机、DSP实验箱、ccs5000软件。

三、实验内容:

编写程序,实现计算的值。

四、实验步骤

1、用仿真器将计算机与DSP实验箱连接好,并依次打开实验箱电源、仿真器电源,然后运行CCS 软件。

2、新建一个项目:点击Project-New,将项目命名为example2,并将项目保存在自己定义的文件夹下,注意文件夹一定要用英文名,不要将文件夹取名为中文名,因为CCS 软件不能识别以中文命名的文件夹。

3、新建一个源文件:点击File-New-Source File可以打开一个文本编辑窗口,点击保存按键,保存在和项目相同的一个文件夹下面(example2),保存类型选择*.ASM(如果源文件是C 语言编写的,保存类型选择*.C,本实验中的例程是使用汇编语言编写的,所以选择*.ASM 为保存类型),我们在这里将保存名字命名为example2.asm。

4、在项目中添加源文件:在新建了一个源文件以后,要想使用CCS 编译器对该源文件进行编译还需要将源文件添加到项目中去。添加方法是在工程管理器中右键单击example2.pjt,在弹出的菜单中选择Add Files,然后将刚才建立的example2.asm 文件添加到该项目中去。

5、编写源程序:

在工程管理器中双击example2.asm,将出现文本编辑窗口,在该文本编辑窗口中输入如下内容:

.title “example2.asm”.mmregs STACK.usect “STACK”,10H;堆栈的设置

.b x,5;为变量分配6 个字的存储空间.b y,1.def _c_int00;start.data table:.word 10,20,3,4,5;x1,x2,x3,x4,x5.text;start: STM #0,SWWSR;插入0 个等待状态 _c_int00: STM #0,SWWSR STM #STACK+10H,sp;设置堆栈指针 STM #x,AR1;AR1指向x RPT #4;下一条被重复执行5 遍

MVPD table,*AR1+;把程序存储器中的数据传送到数据存储器 LD #0,A;A清零

CALL SUM;调用求和函数 end: B end

SUM: STM #x,AR3;AR3指向x STM #4,AR2;AR2=4 loop: ADD *AR3+,A;*AR3+A-->A,然后AR3+ BANZ loop,*AR2-;如果AR2 的值不为0,则跳到loop 处;;否则执行下一条指令

STL A,*(y);把A 的低16 位赋给变量y RET.end 提示:

(1)源代码的书写有一定的格式,初学者往往容易忽视。每一行代码分为三个区:标号区、指令区和注释区。标号区必须顶格写,主要是定义变量、常量、程序标识时的名称。指令区在标号区之后,以空格或TAB 格开。如果没有标号,也必须在指令前面加上空格或TAB,不能顶格。注释区在标号区、程序区之后,以分号开始。注释区前面可以没有标号区或程序区。另外还有专门的注释行,以*打头,必须顶格开始。(2)一般区分大小写,除非加编译参数忽略大小写。

(3)标点符号有时不注意会打成中文全角版本号导致错误。

6、编写链接配置文件:

只有汇编源程序是不够的,一个完整的DSP 程序至少包含三个部分:主程序、中断向量表、链接配置文件(*.cmd)。这里先介绍一下链接配置文件。链接配置文件有很多功能,这里先介绍最常用的也是必须的两条:1.存贮器的分配 2.标明程序入口。

由于每个程序都需要一个链接配置文件,每个程序的链接配置文件根据实际情况的需要都略有不同,下面就为本实验的程序编写一个链接配置文件,其它实验的链接配置文件都可以参考与本书配套的相应例程来完成: /*example2.cmd */ vectors.obj /*中断向量的目标文件*/ example2.obj /*产生目标文件*/-o example2.out /*产生可执行下载文件,文件名可以根据不同项目而定*/-m example2.map /*产生存储器映射文件,文件名可以根据不同项目而定 */

MEMORY {

PAGE 0: /*定义程序存贮区*/ EPROG:

origin = 0x4000, len = 0x3f80

VECT:

origin = 0x7f80,len = 0x80

PAGE 1: /*定义数据存贮区*/ SYSREGS:

origin = 0x00,len = 0x60

BIOSREGS:

origin = 0x60,len = 0x20

IDATA:

origin = 0x80, len = 0x3f00

EDATA:

origin = 0x8000,len = 0x8000 } SECTIONS {

.text :> EPROG PAGE 0 /*将.text 段映射到PAGE0 的EPROM 区*/.data :> EPROG PAGE 0 /*将.data 段映射到PAGE0 的EPROM 区*/.vectors: > VECT PAGE 0/*将中断向量表定位到PAGE0 的VECS 区*/

.b: > IDATA PAGE 1 /*将.b 段映射到PAGE1 的IDATA 区*/

STACK: > IDATA PAGE 1 /*将.stack 段映射到PAGE1 的IDATA 区*/ }

7、编写中断向量表文件;/* vectors.asm */.title “vectors.asm”;/*中断向量表的文件名*/.ref _c_int00;start /*引用外部定义的标号*/.sect “.vectors”;/*定义初始化的段名*/ B _c_int00;start /*引用start*/.end8、对项目进行编译和链接:

把 example2.asm、vectors.asm、example2.cmd 依次添加到项目后,点击Project-Compile File,在项目编译成功之后点击Project-Build 选项对该项目进行链接,生成*.OUT文件。

9、装载可执行文件:

要让程序代码在DSP内部运行必需将生成的*.OUT文件装载到DSP 内部,装载方法是点击:File-Load Programe再选择生成的example2.out 文件就可以将程序装载到DSP 的内部存储器中。

10、运行程序并查看结果:

a)首先打开欲查看的数据空间:点击View-Memory,弹出“Memory Window Options”对话框,把欲查看的地址改为0x0080,如右图所示。

b)点击 OK 按钮,然后点击 Debug-Run 让程序在DSP 内部运行,最后点击Debug -Halt,再观察“Memory ” 对话框,看是否与右图一致。

实验二 堆栈的使用方法

一、实验目的掌握堆栈的使用方法。

二、实验设备

计算机、DSP 实验箱。

三、实验内容

编写程序,观察堆栈的使用情况。

四、实验步骤

1、用仿真器将计算机与DSP 实验箱连接好,并依次打开实验箱电源、仿真器电源,然后运行CCS 软件。

2、新建一个项目:点击Project-New,将项目命名为example3,并将项目保存在自己定义的文件夹下,注意文件夹一定要用英文名,不要将文件夹取名为中文名,因为CCS 软件不能识别以中文命名的文件夹。

3、新建一个源文件:点击File-New-Source File 可以打开一个文本编辑窗口,点击保存按键,保存在和项目相同的一个文件夹下面(example3),保存类型选择*.ASM(如果源文件是C 语言编写的,保存类型选择*.C,本实验中的例程是使用汇编语言编写的,所以选择*.ASM 为保存类型),我们在这里将保存名字命名为example3.asm。

4、在项目中添加源文件:在新建了一个源文件以后,要想使用CCS 编译器对该源文件进行编译还需要将源文件添加到项目中去。添加方法是在工程管理器中右键单击example3.pjt,在弹出的菜单中选择Add Files,然后将刚才建立的example3.asm 文件添加到该项目中去。

5、编写源程序:

在工程管理器中双击example3.asm,将出现文本编辑窗口,在该文本编辑窗口中输入如下内容:

.title “example3.asm”.mmregs size.set 100 stack.usect “STK”,size;堆栈的设置

.b length,10H.def _c_int00;start.text _c_int00: B start;start: STM #0,SWWSR;插入0 个等待状态

STM #stack+size,SP;设置堆栈的指针 LD #-8531,A STM #size,AR1 MVMM SP,AR7 loop: STL A,*AR7-BANZ loop,*AR1-.end6、编写链接配置文件:

参照实验一,需要更改的地方如下:

7、编写中断向量表文件 参照实验一,可不作修改。

8、对项目进行编译和链接:

把 example3.asm、vectors.asm、example3.cmd 依次添加到项目后,点击Project-CompileFile,在项目编译成功之后点击Project-Build 选项对该项目进行链接,生成*.out 文件。

9、装载可执行文件:

要让程序代码在 DSP 内部运行必需将生成的*.OUT 文件装载到DSP 内部,装载方法是点击:File-Load Programe 再选择生成的example3.out 文件就可以将程序装载到DSP 的内部存储器中。

10、运行程序并查看结果:

a)首先打开欲查看的数据空间:点击View-Memory,弹出“Memory Window Options”对话框,把欲查看的地址改为0x0090,如右图所示。

b)点击OK 按钮,然后点击Debug-Run 让程序在DSP内部运行,最后点击Debug-Halt,再观察“Memory ”对话框,看是否与下图一致:

实验三 加减法和乘法运算

一、实验目的掌握加减法和乘法运算指令。

二、实验设备

计算机、DSP 实验箱。

三、实验内容

编写程序,分别实现计算 z=x+y-w、y=mx+b、y=x1×a2+x2×a2、。

四、实验步骤

1、用仿真器将计算机与DSP 实验箱连接好,并依次打开实验箱电源、仿真器电源,然后运行CCS 软件。

2、新建一个项目:点击Project-New,将项目命名为example4,并将项目保存在自己定义的文件夹下,注意文件夹一定要用英文名,不要将文件夹取名为中文名,因为CCS 软件不能识别以中文命名的文件夹。

3、新建一个源文件:点击File-New-Source File 可以打开一个文本编辑窗口,点击保存按键,保存在和项目相同的一个文件夹下面(example4),保存类型选择*.ASM(如果源文件是C 语言编写的,保存类型选择*.C,本实验中的例程是使用汇编语言编写的,所以选择*.ASM 为保存类型),我们在这里将保存名字命名为example4.asm。

4、在项目中添加源文件:在新建了一个源文件以后,要想使用CCS 编译器对该源文件进行编译还需要将源文件添加到项目中去。添加方法是在工程管理器中右键单击example4.pjt,在弹出的菜单中选择Add Files,然后将刚才建立的example4.asm 文件添加到该项目中去。

5、编写源程序:

在工程管理器中双击example4.asm,将出现文本编辑窗口,在该文本编辑窗口中输入如下内容:

********** 计算 z=x+y-w **********.title “example4.asm”.mmregs STACK.usect “STACK”,10H;堆栈的设置

.b x,1;为变量分配4 个字的存储空间.b y,1.b w,1.b z,1.def _c_int00.data table.word 10,26,23;x,y,w.text _c_int00: STM #0,SWWSR;插入0 个等待状态

STM #STACK+10H,SP;设置堆栈指针 STM #x,AR1;AR1指向x RPT #2 MVPD table,*AR1+;把程序存储器中的数据移动到数据存储器 CALL SUMB end: B end

SUMB: LD *(x),A ADD *(y),A SUB *(w),A STL A,*(z)RET.end6、编写链接配置文件:

参照实验一,需要更改的地方如下:

7、编写中断向量表文件 参照实验一,可不作修改。

8、对项目进行编译和链接: 把 example4.asm、vectors.asm、example4.cmd 依次添加到项目后,点击Project-Compile File,在项目编译成功之后点击Project-Build 选项对该项目进行链接,生成*.out 文件。

9、装载可执行文件:

要让程序代码在DSP 内部运行必需将生成的*.OUT 文件装载到DSP 内部,装载方法是点击:File-Load Programe 再选择生成的example4.out 文件就可以将程序装载到DSP 的内部存储器中。

10、运行程序并查看结果:

a)首先打开欲查看的数据空间:点击View-Memory,弹出“Memory Window Options”对话框,把欲查看的地址改为0x0080,如右上图所示。b)点击OK 按钮,然后点击Debug-Run 让程序在DSP 内部运行,最后点击Debug-Halt,再观察“Memory ”对话框,看是否与右图一致:

11、建立其它项目工程文件

建立项目工程文件 example5,使之实现计算y=mx+b;建立项目工程文件example6,使之实现计算y=x1×a2+x2×a2;建立项目工程文件example7,使之实现计算

注:各源程序操作步骤均与前面相似,需要观察的数据存储器的地址均为0x0080;另外要注意对相应的链接配置文件作相应的修改。下面是它们的实验结果:

example5 的结果

example6结果

Example7 的结果

实验四 重复操作

一、实验目的掌握各种重复操作指令。

二、实验设备

计算机、DSP 实验箱。

三、实验内容

编写程序,实现对数组初始化后再对每个元素加 1。

四、实验步骤

1、用仿真器将计算机与DSP 实验箱连接好,并依次打开实验箱电源、仿真器电源,然后运行CCS 软件。

2、新建一个项目:点击Project-New,将项目命名为example9,并将项目保存在自己定义的文件夹下,注意文件夹一定要用英文名,不要将文件夹取名为中文名,因为CCS 软件不能识别以中文命名的文件夹。

3、新建一个源文件:点击File-New-Source File 可以打开一个文本编辑窗口,点击保存按键,保存在和项目相同的一个文件夹下面(example9),保存类型选择*.ASM(如果源文件是C 语言编写的,保存类型选择*.C,本实验中的例程是使用汇编语言编写的,所以选择*.ASM为保存类型),我们在这里将保存名字命名为example9.asm。

4、在项目中添加源文件:在新建立了一个源文件以后,要想使用CCS 编译器对该源文件进行编译还需要将源文件添加到项目中去。添加方法是在工程管理器中右键单击example9.pjt,在弹出的菜单中选择Add Files,然后将刚才建立的example9.asm 文件添加到该项目中去。

5、编写源程序:

在工程管理器中双击example9.asm,将出现文本编辑窗口,在该文本编辑窗口中输入如下内容:

********** 学习块重复操作指令:RPTB **********.title “example9.asm”.mmregs STACK.usect “STACK”,10H.b x,5.def _c_int00.text _c_int00: STM #x,AR1 LD #2H,A;将数组每个元素初始化为2 RPT #4 STL A,*AR1+;把A 的低16 位赋给AR1 指向的变量x,然后AR1+1 LD #1,16,B;为每个元素加1 作准备 STM #4,BRC STM #x,AR4 RPTB next-1;next-1为循环结束地址 add *AR4,16,B,A STH A,*AR4+ next: LD #0,B end: B end.end6、编写链接配置文件:

参照实验一,需要更改的地方如下: 更改前 更改后

7、编写中断向量表文件 参照实验一,可不作修改。

8、对项目进行编译和链接: 把 example9.asm、vectors.asm、example9.cmd依次添加到项目后,点击Project-Compile File,在项目编译成功之后点击Project-Build 选项对该项目进行链接,生成*.out 文件。

9、装载可执行文件:

要让程序代码在 DSP 内部运行必需将生成的*.OUT 文件装载到DSP 内部,装载方法是点击:File-Load Programe 再选择生成的example9.out 文件就可以将程序装载到DSP 的内部存储器中。

10、运行程序并查看结果:

a)首先打开欲查看的数据空间:点击View-Memory,弹出“Memory Window Options”对话框,把欲查看的地址改为0x0080,如右图所示。b)点击OK 按钮,然后点击Debug-Run 让程序在DSP 内部运行,最后点击Debug-Halt,再观察“Memory ”对话框,看是否与下图一致:

11、试用数据块传送指令实现数组初始化:把上述程序中的“STLA,*AR1+”改成“MVPD table,*AR1+”,看实现结果是否一致。

实验五 数据块传送

一、实验目的掌握各种数据块传送操作指令。

二、实验设备

计算机、DSP 实验箱.三、实验内容

编写程序,实现把数据从程序存储器传送到数据存储器,以及从数据存储器传送到程序存储器。

四、实验步骤

1、用仿真器将计算机与DSP 实验箱连接好,并依次打开实验箱电源、仿真器电源,然后运行CCS 软件。

2、新建一个项目:点击Project-New,将项目命名为zhao3,并将项目保存在自己定义的文件夹下,注意文件夹一定要用英文名,不要将文件夹取名为中文名,因为CCS 软件不能识别以中文命名的文件夹。

3、新建一个源文件:点击File-New-Source File 可以打开一个文本编辑窗口,点击保存按键,保存在和项目相同的一个文件夹下面(zhao3),保存类型选择*.ASM(如果源文件是C 语言编写的,保存类型选择*.C,本实验中的例程是使用汇编语言编写的,所以选择*.ASM为保存类型),我们在这里将保存名字命名为zhao3.asm。

4、在项目中添加源文件:在新建立了一个源文件以后,要想使用CCS 编译器对该源文件进行编译还需要将源文件添加到项目中去。添加方法是在工程管理器中右键单击zhao3.pjt,在弹出的菜单中选择Add Files,然后将刚才建立的zhao3.asm 文件添加到该项目中去。

5、编写源程序:

在工程管理器中双击zhao3.asm,将出现文本编辑窗口,在该文本编辑窗口中输入如下内容: ************ 学习数据块传送指令:MVPD、MVDD ************.title “zhao3.asm”.mmregs STACK.usect “STACK”,30H.b x,20.b y,20.data table:.word 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20.def _c_int00.text _c_int00: STM #x,AR1 RPT #19 MVPD table,*AR1+;程序存储器传送到数据存储器 STM #x,AR2 STM #y,AR3 RPT #19 MVDD *AR2+,*AR3+;数据存储器传送到数据存储器 end: B end.end6、编写链接配置文件: 参照实验一,需要更改的地方如下: 更改前 更改后

7、编写中断向量表文件 参照实验一,可不作修改。

8、对项目进行编译和链接:

把 zhao3.asm、vectors.asm、zhao3.cmd 依次添加到项目后,点击Project-Compile File,在项目编译成功之后点击Project-Build 选项对该项目进行链接,生成*.out 文件。

9、装载可执行文件:

要让程序代码在DSP 内部运行必需将生成的*.OUT 文件装载到DSP 内部,装载方法是点击:File-Load Programe 再选择生成的zhao3.out 文件就可以将程序装载到DSP 的内部存储器中。

10、运行程序并查看结果:

a)首先打开欲查看的数据空间:点击View-Memory,弹出“Memory Window Options”对话框,把欲查看的地址改为0x0080,如右图所示。

c)点击 OK 按钮,然后点击Debug-Run 让程序在DSP 内部运行,最后点击Debug-Halt,再观察“Memory ”对话框,看是否与下图一致:

实验六 除法运算

一、实验目的掌握除法运算的实现方法。

二、实验设备

计算机、DSP 实验箱。

三、实验内容

分别编写程序,实现计算 0.4÷(-0.8)和16384÷512 的值。

四、实验步骤

1、用仿真器将计算机与DSP 实验箱连接好,并依次打开实验箱电源、仿真器电源,然后运行CCS 软件。

2、新建一个项目:点击Project-New,将项目命名为zhao9f,并将项目保存在自己定义的文件夹下,注意文件夹一定要用英文名,不要将文件夹取名为中文名,因为CCS 软件不能识别以中文命名的文件夹。

3、新建一个源文件:点击File-New-Source File 可以打开一个文本编辑窗口,点击保存按键,保存在和项目相同的一个文件夹下面(zhao9f),保存类型选择*.ASM(如果源文件是C 语言编写的,保存类型选择*.C,本实验中的例程是使用汇编语言编写的,所以选择*.ASM为保存类型),我们在这里将保存名字命名为zhao9f.asm。

4、在项目中添加源文件:在新建立了一个源文件以后,要想使用CCS 编译器对该源文件进行编译还需要将源文件添加到项目中去。添加方法是在工程管理器中右键单击zhao9f.pjt,在弹出的菜单中选择Add Files,然后将刚才建立的zhao9f.asm 文件添加到该项目中去。

5、编写源程序:

在工程管理器中双击zhao9f.asm,将出现文本编辑窗口,在该文本编辑窗口中输入如下内容:

********************************* * |被除数|B,获取商的符号;(在累加器B 中)ABS A;分母取绝对值

STH A,@den;分母取绝对值存回原处

LD @num,16,A;将分子移到累加器A(32~16)ABS A;分子取绝对值

RPT #14;15次减法循环,完成除法 SUBC @den,A XC 1,BLT;如果B

6、编写链接配置文件:

参照实验一,需要更改的地方如下:

7、编写中断向量表文件 参照实验一,可不作修改。

8、对项目进行编译和链接:把 zhao9f.asm、vectors.asm、zhao9f.cmd 依次添加到项目后,点击Project-Compile File,在项目编译成功之后点击Project-Build 选项对该项目进行链接,生成*.out 文件。

9、装载可执行文件:

要让程序代码在 DSP 内部运行必需将生成的*.OUT文件装载到DSP 内部,装载方法是点击:File-LoadPrograme 再选择生成的zhao9f.out 文件就可以将程序装载到DSP 的内部存储器中。

10、运行程序并查看结果: a)首先打开欲查看的数据空间:点击View-Memory,弹出“Memory Window Options”对话框,把欲查看的地址改为0x0080,如右图所示。

b)点击OK 按钮,然后点击Debug-Run 让程序在 DSP 内部运行,最后点击Debug-Halt,再观察“Memory ”对话框,看是否与右图一致:

11、上述程序是商为小数的除法,下面编写商为整数的除法:

a)建立项目工程文件zhao9g,编写源程序zhao9g.asm,并与zhao9f.asm 作一比较。以下是源程序:

******************************** * |被除数|>=|除数|,商为整数 * * 计算16384÷512 的值 * ********************************.title “zhao9g.asm”.mmregs STACK.usect “STACK”,10H.b num,1;分子.b den,1;分母.b quot,1;商.data table:.word 16384;更改被除数 66*32768/100.word 512

;更改除数-33*32768/100.def _c_int00.text _c_int00: LD #0020H,DP;指定数据页指针

STM #num,AR1 RPT #1 MVPD table,*AR1+;传送2 个数据至分子、分母 LD @den,16,A;将分母移到累加器A(31~16)MPYA @num;(num)*(A(31~16))->B,获取商的符号;(在累加器B 中)ABS A;分母取绝对值

STH A,@den;分母取绝对值存回原处 LD @num,A;将分子移到累加器A(32~16)ABS A;分子取绝对值

RPT #15;16次减法循环,完成除法 SUBC @den,A XC 1,BLT;如果B

参照实验一,需要更改的地方如下:

c)编写中断向量表文件 参照实验一,可不作修改。

d)把各文件添加到项目中并对项目进行编译和链接并下载到DSP 内部,具体方法请参照前面的步骤。

d)运行程序并查看结果:

首先打开欲查看的数据空间:点击View-Memory,弹出“Memory Window Options” 对话框,把欲查看的地址改为0x0080,如右图所示。运行程序后,结果如下:

实验七 定时器中断实验

一、实验目的1、掌握DSP 中断技术,学会对DSP 中断的处理方法。

2、掌握中断对于程序流程的控制,理解DSP 对于中断的响应时序。

3、掌握汇编语言编写中断的基本方法。

二、实验设备

计算机、DSP实验箱。

二、实验原理

DSP一般情况下均支持软件中断和硬件中断。软件中断由指令引起,如INTR、TRAP、RESET;硬件中断由外部中断信号和内部中断信号引起,外部硬件中断如INT0-INT2,内部硬件中断包括定时器、串口、主机接口等引起的中断。软件中断不分优先级,硬件中断有优先级。中断寄存器有中断标志寄存器IFR 和中断屏蔽寄存器IMR。

1、中断标志寄存器(Interrupt Flag Register,IFR)是一个存储器映像寄存器,当某个中断触发时,寄存器的相应位置1,直到中断处理完毕为止。IFR 各位的意义如图:

不同型号DSP 的IFR的5-0 位对应的中断源完全相同,是外部中断和通信中断标志位。其它15-6 位中断源根据芯片的不同,定义的中断源不同。当对芯片进行复位、中断处理完毕,写1于IFR的某位,执行INTR 指令等硬件或软件中断操作时,IFR的相应位置1,表示中断发生。通过读IFR 可以了解是否有已经被挂起的中断,通过写IFR可以清除被挂起的中断。在以下3 种情况下将清除被挂起的中断。(1)复位(包括软件和硬件复位)。(2)置位1 写入相应的IFR 标志位。

(3)使用相应的中断号响应该中断,即使用INTR #K 指令。若有挂起的中断,在IFR中该标志位为1,通过写IFR 的当前内容,就可以清除所有正被挂起的中断;为了避免来自串口的重复中断,应在相应的中断服务程序中清除IFR 位。

2、中断屏蔽寄存器

中断屏蔽寄存器(Interrupt Mask Register,IMR),是用于屏蔽外部和内部的硬件中断。通过读IMR 可以检查中断是否被屏蔽,通过写可以屏蔽中断(或解除中断屏蔽),在IMR 位置0,则屏蔽该中断。IMR 不包含/RS 和NMI,复位时IMR 均设为0,TMS320C5410a 中断屏蔽寄存器IMR 各位的意义如下:

硬件中断信号产生后能否引起DSP 执行相应的中断服务程序还取决于以下四点(复位和NMI 除外,它们不可屏蔽):

(1)、状态寄存器ST1 的INTM 位为0,即中断方式位,允许可屏蔽中断;INTM 为1,禁止可屏蔽中断。若中断响应后INTM 自动置1,则其它中断将不被响应。在ISR(中断服务程序)中以RETE 指令返回时,INTM 位自动清0,INTM 位可用软件置位,如指令SSBX INTM(置1)和RSBX INTM(清0)。

(2)、当前没有响应更高优先级的中断。

(3)、中断屏蔽寄存器IMR 中对应此中断的位为1。在IMR 中相应位为1,表明允许该中断。(4)、在中断标志寄存器(IFR)中对应位置为1。

TMS320C54x 中,中断向量地址由PMST 寄存器中的9 位中断向量地址指针IPTR 和左移2位后的中断向量序号(中断向量序号位0~31,左移2 位后变成7 位)所组成。例如:已知中断向量序号INT0=0001 0000B=10H,中断向量地址指针IPTR=0001H,求中断向量地址?

因为中断向量序号左移2 位后变成100 0000B=40H 所以中断向量地址为0000 0000 1100 0000B=00C0H 复位时,IPTR 位置全1(IPTR=1FFH),并按此值将复位中断向量映射到程序存储器的511页空间。所以硬件复位后,程序地址总是PC=1111 1111 1000 0000B=0FF80H,即总是从0FF80H开始执行程序。而且,硬件复位地址是固定不变的,其他中断向量可以通过改变内容重新安排中断程序的地址。例如中断向量地址指针IPTR=0001H,中断向量就被移到0080H 开始的程序存储空间。

当DSP响应中断时,将依次完成以下步骤:

(1)、发出IACK 信号,并清除IFR 中相应的中断标志位。(2)、将PC 值(返回地址)压入堆栈。(3)、取中断向量。

(4)、跳转到相应的中断服务程序。

(5)、保存应保护的寄存器和变量,压入堆栈。(6)、执行中断处理程序。

(7)、恢复保护的内容,从堆栈弹出。(8)、中断返回,从堆栈中弹出返回地址。(9)、继续执行原先的程序。

本实验是利用DSP内部的定时器产生中断来完成中断实验,这里先简要介绍一下DSP内部的定时器:TMS320VC5410a有一个16 位的定时器,定时器带有一个4位预分频器PSC和16位定时计数器TIM。CPUCLOCK时钟先经PSC预分频后,用分频的时钟再对TIM 作减1计数,当TIM减为0 时,将在定时器输出管脚TOUT上产生一个脉冲,同时产生定时器中断请求,并将定时器周期寄存器PRD的值装入TIM。

定时器由TIM、PRD、TCR 三个寄存器和相应的输出管脚TOUT组成。(1)TIM 在数据存储器中的地址为0024H,是减1计数器。(2)PRD 地址为0025H,存放定时时间常数。

(3)TCR 地址为0026H,存储定时器的控制及状态位。定时器产生中断的计算公式如下:

定时周期=CLKOUT*(TDDR+1)*(PRD+1)TMS320VC5410a 的定时器可以被特定的状态位实现停止、重新启动、重新设置或禁止。可以使用该定时器产生周期性的CPU 中断。

定时器初始化的步骤为:

(1)、将TCR 中的TSS 位置1,关闭定时器。(2)、修改PRD。

(3)、重新设置TCR:令TSS=0,TRB=1,并按要求设置SOFT,FREE、TDDR。

设置定时器中断的步骤为(设INTM=1):

(1)、将IFR 中TINT 位置为1,清除以前的定时器中断请求。(2)、将IMR 中的TINT 位置为1,打开定时器中断。(3)、将ST1 中的INTM 位置为0,使能所有中断。

每当TIM 减为0 时,会产生一个定时器中断,并在相应的TOUT 管脚上产生一个宽度为CLKOUT 周期的正脉冲。

在RESET 后,TIM 和PRD 被设置为最大值(FFFFH),TCR 中的TDDR 置0,定时器启动。定时控制寄存器(TCR)为一个映射到片内的16 位寄存器:

RESERVED:常常设置为0。

FREE 和SOFT: 软件调试组合控制位,用于控制调试程序断点操作情况下的定时器状态。当free=0 且soft=0 时,定时器立即停止工作。当free=0 且soft=1 且计数器TIM 减为1 时,定时器停止工作。当free=1 且soft=x 时,定时器继续工作。PSC: 预定标计数器。每个CLKOUT 作减1 操作,减为0 时,“TDDR”寄存器的值装载到“PSC”寄存器,TIM 减1,PSC 的作用相当于预分频器。

TRB: 定时器重新加载控制位,用于复位片内定时器。当TRB 置1 时,“PRD”寄存器的值装载到“TIM”寄存器,“TDDR”寄存器的值装载到“PSC”寄存器,TRB 常常设置为0。TSS: TSS=0,定时器开始。TSS=1,定时器停止。TDDR: 定时器分频比。以此数对CLKOUT 分频后再去对TIM 做减1 操作,当“PSC”为0,“TDDR”寄存器的值装载到“PSC”寄存器中。

四、实验内容

利用定时器中断制作方波发生器,通过XF 引脚控制LED 发光来检测方波的周期。

五、实验步骤

1、新建一个项目:testxf.pjt;

2、在项目中编辑以下汇编语言文件:

有时定时的长度不能满足需要,比如F=10Mhz时,定时最大是:10ns*2^4*2^16=10.485760ms。如果需要更长的定时,就要在定时器中断子程序中再加一个计数器,直到产生一定次数的定时中断后再执行相应的操作。如下程序可以产生1Hz 的方波:

;;fangbo.asm;利用定时器Timer0 在XF 脚产生周期1s 的的方波;.title “fangbo.asm”.mmregs.def _c_int00;程序入口

.def TINT0_ISR;Timer0中断服务程序 STACK.usect “STACK”,10H;分配堆栈空间;设定定时器0 控制寄存器的内容

K_TCR_SOFT.set 0B

.data DATA_DP: XF_Flag:.word 1;当前XF的输出电平标志,如果XF_Flag=1,则XF=1;==;主程序:

;==.text _c_int00: STM #STACK+10H,SP;设堆栈指针SP LD #DATA_DP,DP;设数据地址DP STM #XF_Flag,AR2;AR 指向XF 标志;改变中断向量表位置

K_IPTR.set 7F80h;指向7f80H,默认是FF80 LDM PMST,A AND #7FffH,A;保留低7位,清掉高位

OR #K_IPTR,A;STLM A,PMST;初始化定时器0;f=20Mhz,定时最大是:50ns*2^4*2^16=50ms,;要输出1s 的方波,可定时25ms,再在中断程序中加个40计数器;Tt=50ns*(1+4)*(1+49999)=5ms;f=20M, Tt=50ns*(1+4)*(1+49999)=25ms;再加40 计数器

CounterSet.set 39;定义计数次数 PERIOD.set 49999;定义计数周期

.asg AR1,Counter;AR1做计数指针,重新命名以便识别

STM #CounterSet,Counter;设计数器初值

STM K_TCR_STOP,TCR;停止计数器0;STM #PERIOD,TIM;可设成跟PRD 一样,也可不设自动加载

STM #PERIOD,PRD;设定计数周期

STM #K_TCR,TCR;开始Timer0 stm #0008h,IMR;允许Timer0中断

STM #0008h,IFR;清除挂起的中断

RSBX INTM;开中断 end1: nop B end1;==;Timer0 中断服务程序:TIN0_ISR;== TINT0_ISR: PSHM ST0;本中断程序影响TC,位于ST0 中

BANZ Next,*Counter-;判断不等于0 时跳转,然后计数器减1 STM #CounterSet,Counter;恢复初值

;判断当前XF状态并作电平变化

BITF *AR2,#1;IF XF_Flag=1 then TC=1 else TC=0 BC ResetXF,TC;IF TC=1 then XF=0 else XF=1 setXF: SSBX XF;置XF为高电平

ST #1,*AR2;相应修改标志

B Next ResetXF: RSBX XF;;置XF为低电平

ST #0,*AR2;相应修改标志 Next: POPM ST0 RETE.end3、编写存储器配置文件:(fangbo.cmd)/*-e _c_int00 This is the entry point reset vector */-m map.map-o fangbo.out MEMORY { PAGE 0: /*定义程序存贮区*/ EPROM: origin = 0x4000, len = 0x3f80 VECT: origin = 0x7f80, len = 0x80 PAGE 1: /*定义数据存贮区*/ SYSREGS: origin = 0x00, len = 0x60 BIOSREGS: origin = 0x60, len = 0x20 IDATA: origin = 0x80, len = 0x3f00 EDATA: origin = 0x8000, len = 0x8000 } SECTIONS {.text :>EPROM PAGE 0 /*将.text 段映射到PAGE0 的EPROM 区*/.data :>EPROM PAGE 0 /*将.data 段映射到PAGE0 的EPROM 区*/.vectors: > VECT PAGE 0/*将中断向量表定位到PAGE0 的VECS 区*/.b: > IDATA PAGE 1 /*将.b 段映射到PAGE1 的IDATA 区*/ STACK > IDATA PAGE 1 /*将.stack 段映射到PAGE1 的IDATA 区*/ }

4、编写中断向量表文件(vectors.asm)

中断向量表是DSP 程序的重要组成部分,下面是5410a 中断向量表的一个示例,可以作为模板:

***************************************************************** *vectors.asm *完整的5410a 中断向量表示例

*5410a 共有30 个中断向量,每个向量占4 个字的空间。

*使用的向量一般加一条跳转指令转到相应中断服务子程序,其余空位用NOP 填充

*未使用的向量直接用RETE 返回,是为了防止意外进入未用中断。

*****************************************************************.sect “.vectors”;开始命名段.vecotrs.global _c_int00;引用程序入口的全局符号定义

;引用其它中断程序入口的全局符号定义

.align 0x80;中断向量必须对齐页边界

.global TINT0_ISR RESET: B _c_int00;Reset 中断向量,跳转到程序入口 STM #200,SP;stack size of 200 nmi: RETE;enable interrupts and return from one NOP NOP NOP;NMI~;software interrupts sint17.space 4*16 sint18.space 4*16 sint19.space 4*16 sint20.space 4*16 sint21.space 4*16 sint22.space 4*16 sint23.space 4*16 sint24.space 4*16 sint25.space 4*16 sint26.space 4*16 sint27.space 4*16 sint28.space 4*16 sint29.space 4*16 sint30.space 4*16

int0: RETE;External user interrupt #0 NOP NOP NOP int1: RETE;External user interrupt #1 NOP NOP NOP int2: RETE;External user interrupt #2 NOP NOP NOP tint: BD TINT0_ISR;Timer0 中断

NOP

NOP rint0: RETE;McBSP #0 receive interrupt(default)NOP NOP NOP xint0: RETE;McBSP #0 transmit interrupt(default)NOP NOP NOP rint2: RETE;McBSP #2 receive interrupt(default)NOP NOP NOP xint2: RETE;McBSP #2 transmit interrupt(default)NOP NOP NOP int3: RETE;External user interrupt #3 NOP NOP NOP hint: RETE;HPI interrupt NOP NOP NOP rint1: RETE;McBSP #1 receive interrupt(default)NOP NOP NOP xint1: RETE;McBSP #1 transmit interrupt(default)NOP NOP NOP.space 16*16.end 技巧提示:第一个中断(Reset 中断)是每个程序都应该有的,在不需要其它中断的情况下,可以只用这一部分,后面全部省掉。另外一个重要问题是中断向量表的位置,上电时默认是在FF80H 处,但实际上很多情况下无法把中断向量表加载到FF80 处,一般重定向到0080H,并在程序开头重新设置一下IPTR的值。K_IPTR.set 7f80h;指向7f80H,默认是FF80 LDM PMST,A AND #7FffH,A;保留低7位,清掉高位 OR #K_IPTR,A;STLM A,PMST 要注意的是这段代码要用到累加器A,所以嵌入这段代码的地方必须在用到累加器A 之前。

5、在testxf.pjt 文件中添加fangbo.asm、vector.asm、fangbo.cmd 文件,进行编译和链接,注意该项目是由汇编语言编写的,应该注意实验一的步骤9 的选项是否正确。

6、装载fangbo.out 文件到DSP 芯片并运行程序,观测XF 的变化。也可以观察CLKOUT管脚电平的变化。

《DSP实验教案.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
DSP实验教案
点击下载文档
相关专题 dsp实验教案 教案 DSP dsp实验教案 教案 DSP
[教案模板]相关推荐
    [教案模板]热门文章
      下载全文