人人范文网 范文大全

DSP实验教案

发布时间:2020-03-02 20:44:32 来源:范文大全 收藏本文 下载本文 手机版

汇编语言程序设计实验

实验一 程序的控制与转移

一、实验目的

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*/ .end

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

把 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- .end

6、编写链接配置文件:

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

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×a

2、

四、实验步骤

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 .end

6、编写链接配置文件:

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

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 .end

6、编写链接配置文件:

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

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 .end

6、编写链接配置文件: 参照实验一,需要更改的地方如下: 更改前 更改后

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 .end

3、编写存储器配置文件:(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实验教案(一)

DSP实验学习心得

DSP实验心得体会

DSP实验学习心得

DSP实验5

DSP技术实验指导书

dsp实验指导书尉

DSP实验小数运算的实现

级下学期DSP实验期末考试题

“DSP 技 术”实验教学改革与研究

DSP实验教案
《DSP实验教案.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
相关专题 dsp实验教案 教案
点击下载本文文档