搜索
您的当前位置:首页正文

实验三 定时器及中断实验

来源:意榕旅游网
实验三 定时器及中断实验

一、实验目的

1) 熟悉VC5402的定时器工作原理。 2) 掌握VC5402定时器的编程控制方法。

3) 学会使用定时器的中断方式来控制程序执行方法。

4) 掌握外部中断的控制方法,理解DSP对于中断的响应的过程。

5)学习并掌握混合编程的方法。 二、实验设备

1)微机一台、DSP硬件仿真器一台、DSP实验箱一台。

2)程序及链接命令文件见:D:\\ EXPER\\EXP3目录下的.asm 、.cmd、.C 和.lib文件。

三、开关设置

将开关K9拨到右边,即仿真器选择连接右边的CPU2。然后将实验箱上的SW2(不是CPU板上的)设置为ON ON OFF ON ,即单脉冲按钮产生的中断给CPU2的中断INT2。

拨码开关SW2设置表 SW2 1 ON ON 2 3 4 备 注 码位 单脉冲产生的中断给CPU2的中断INT2 单脉冲产生的中断给CPU2的中断INT0 ON OFF ON ON OFF OFF 四、实验内容 1) 创建新的项目,添加源程序和链接命令文件,编译链接后载入执行程序。 2) 连续运行程序,观察由发光管LED5~8所指示的变化,读懂程序理解为何每秒变化1次。

在中断向量表中定时器中断向量入口地址处设置断点,然后连续执行程序,从断点处再单步执行程序,理解中断向量程序的挂接方法,同时学会中断向量地址的计算方法。 3) 按几下单脉冲按钮,观察发光管LED1~4所发生的相应变化。与定时中断类似设置断点

进行程序跟踪调试。 4)分别在中断向量表中定时器和外中断2的向量入口地址处设置断点,然后连续执行程序,从断点处再单步执行程序,理解中断向量程序的设置方法。同时还要根据实验书后附录3(中断向量表)理解并掌握中断向量的入口地址的计算方法。

五、实验报告

1)发光管LED5~8每秒钟闪烁一次是如何算得的?

2)查实验书后中断屏蔽寄存器,说明中断初始化的方法。

3)若将定时周期改为2秒,应如何修改程序?都有哪些方法?给出程序段 4) 若将外部中断2(INT2)改为外部中断0时(INT0), 要求执行按下单脉冲按键时led1~4

发生变化,应如何修改程序?注意:电路方面要调节SW2为 ON ON OFF OFF 。

5) 思考题:如何用c语言调用汇编子程序?如何实现不同汇编程序之间相互调用?怎样在

c程序中嵌入汇编语句?

五、源程序及链接命令文件

1、主程序EXP03.C

/************************************************ * FileName: EXP03.C *

* Description: 定时器中断实验 *

* Write by: lanrunze *

* Date: 2004-2-10 *

* Update: 2006-3-10 * *************************************************/

//因为使用了混合编程,所以必须添加 rts.lib 到项目文件中 //观察程序时使用DEBUG--GO MAIN来使程序跳转到程序的执行入口 //使用外中断2时 SW2= on on off on //使用外中断0时 SW2= on on off off //本实验使用单按钮产生外部中断 #include

interrupt void timer(); //定义定时器中断服务子程序 interrupt void int2c(); //定义外部中断服务子程序 extern void initial(); //定义外部初始化子程序

extern void porta(); //定义外部端口操作子程序 extern void portb(); extern void portc(); extern void portd();

int flag1=0; //端口输出标志,用于端口输出控制 int flag2=0; //端口输出标志,用于端口输出控制 unsigned int Out_flag = 0;

interrupt void timer() //定时器中断子程序,数存单元作计数器例子 {

*(int *)0x300=*(int *)0x300+1; //时钟中断计数,使用绝对寻址方式 if(*(int *)0x300 >= 1000) //计数超过 1000次 {

*(int *)0x300=0; if(flag1==0) {

flag1=1;

porta(); //调用PORTC汇编子程序 } else {

flag1=0;

portb(); //调用PORTB汇编子程序 }

//asm(\" intr 18\");//用于软件仿真时,产生软件中断,中断序号18,中断入口为外中断2 } return; }

interrupt void int2c() //外部中断服务子程序,变量作计数器例子 {

static int INT2_INT_NUM = 0; //定义整形计数器 INT2_INT_NUM++; //每次中断则计数器加1

if(INT2_INT_NUM % 2 == 0 ) //每两次按键XF闪烁一次

Out_flag = 0; else

Out_flag = 1;

if( INT2_INT_NUM >= 1000 ) INT2_INT_NUM = 0; if(flag2==0) {

flag2=1;

portc(); //调用PORTC汇编子程序 } else {

flag2=0;

portd(); //调用PORTD汇编子程序 } }

main() {

initial();//C调用汇编子程序

while(1){ //等待定时器和外部中断,转去执行中断服务子程序 asm(\" nop\");//C中嵌入汇编指令例子

if(Out_flag == 0 )//通过中断中标志位来控制端口 asm(\" ssbx XF\"); //点亮XF灯 else

asm(\" rsbx XF\"); //熄灭XF灯 } }

2、初始化子程序 initial.asm .title \"initia.asm \" .mmregs

.global _initial ;定义可以外部调用的子程序 .text

;查看DSP的CLKMD寄存器内容,并查看实验书附录中clkmd寄存器初值 ;以及晶振频率来获得时钟运行频率 _initial: ;初始化子程序入口

ssbx INTM ; INTM=1,禁止所有可屏蔽中断 ld #0, DP ; 设置数据页指针DP=0 stm #0x3FF2,PMST

stm #0x0000,SWWSR; ldm PMST,A ;修改IPTR and #0x3f,A ;去掉IPTR

or #0x3f80,A ;IPTR位等于3F80 stlm a,PMST

stm #0, CLKMD ; 切换CPU内部PLL到分频模式 Statu: ldm CLKMD, A

and #01b, A

bc Statu, ANEQ ;检查是否已经切换到分频模式 stm #0x17ff,CLKMD ;设置DSP 时钟为PLL*2模式 nop

st #0,*(0x300) ;将存储单元清零

;以下为定时器的中断方式和外中断2的初始化 ssbx intm ;关闭所有可屏蔽中断 stm #0ffffh,ifr ;清除历史中断标志 stm #00h,imr ;清除欲设的中断允许位 stm #410h,tcr ;停止定时器

stm #19999,prd ;设置定时器初值 prd=4e1fh 定时20 000次 stm #420h,tcr ;启动定时器

;定时20 000/20 000 000 =1mS

stm #08h+04h,imr ;开放定时器和外部中断2,查附录IMR位 rsbx intm ;开放所有可屏蔽中断 ret ;子程序返回 .end

3、中断向量表子程序vectors.asm ; .title \"vectors.asm \"

.sect \".vectors\" ;定义中断向量段来存储中断向量表 .ref _c_int00 ; 引用外部定义的程序入口地址 .ref _int2c ; 引用在外部定义的符号 .ref _timer ; 引用在外部定义的符号

.align 0x80 ; 必须放置到数据页的边界 ; 或者低7位地址全零开始单元

RESET: ; 复位中断向量入口地址

BD _c_int00 ; 延迟分支到C主程序默认入口地址 STM #3100H,SP

nmi: ; nmi 中断向量入口地址 RETE ; 中断程序返回 NOP NOP

NOP

; 软件中断向量未设置,仅是保留出 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: ;外部中断0向量入口地址 RETE

NOP NOP NOP

int1: ;外部中断1向量入口地址 RETE

NOP NOP NOP

int2: ;外部中断2向量入口地址 b _int2c NOP NOP

tint0: ;定时器0向量入口地址 b _timer NOP

NOP brint0: ;串行口0接收中断 RETE

NOP NOP NOP

bxint0: ;串行口0发送中断 RETE

NOP NOP NOP

dmac0: ;串行口1接收中断 RETE

NOP NOP NOP

tint1: ;串行口1发送中断 RETE

NOP NOP NOP

int3: ;外部中断3 RETE

NOP NOP

NOP HPint: ;HPI中断 RETE

NOP NOP

NOP brint1: ;串行口1接收中断 RETE

NOP NOP NOP

bxint1: ;串行口1发送中断 RETE

NOP NOP NOP

.space 4*16*4 ;保留2个中断dmac4和dmac5 .end

4、 端口输出子程序

.title \"port.asm\" .mmregs

.bss Out_Dat,1 ;定义输出变量

.global _porta ;定义可外部调用的子程序 .global _portb ; .global _portc ; .global _portd ; _porta: ;porta子程序 STM #Out_Dat,ar1; LD *ar1,a

AND #0x000f,A ;清除高4位

OR #0x00A0,A ;改变高4位为1010 STL a,*ar1 ;保存数据 PORTW *ar1,8001h;端口输出 NOP RET _portb:

STM #Out_Dat,AR1; LD *AR1,A AND #0x000f,A

OR #0x0050,A ;改变高4位为0101

STL A,*AR1 PORTW *AR1,8001h nop

RET _portc:

STM #Out_Dat,ar1; LD *ar1,a AND #0x00F0,A

OR #0x000a,A ;改变低4位为1010 STL a,*ar1 PORTW *ar1,8001h NOP RET _portd:

STM #Out_Dat,AR1 ; LD *AR1,A AND #0x00F0,A

OR #0x0005,A ;改变低4位为0101 STL A,*AR1

PORTW *AR1,8001h nop RET

5、链接器命令文件TimeInt.cmd

MEMORY {

PAGE 0: PROG: origin = 0x1000, len = 0x1000 VECT: origin = 0x3f80, len = 0x80 PAGE 1: IDATA: origin = 0x80, len = 0x0f80

DARAM: origin = 0x3000, len = 0x0f80 }

SECTIONS {

.vectors: {} > VECT PAGE 0 /*汇编的中断向量表*/

.text: {} > PROG PAGE 0 /*C与汇编的可执行代码段*/ .cinit: {} > PROG PAGE 0 /*C 初始化变量和常数表*/

.bss: {} > IDATA PAGE 1 /*C与汇编的全局和静态变量*/ .const: {} > DARAM PAGE 1 /*C 定义常量段*/ .stack: {} > DARAM PAGE 1 /*C 系统堆栈*/

.switch: {} > IDATA PAGE 1 /*为常量语句建立的表格*/ .data: {} > IDATA PAGE 1 /*汇编的定义的数据段 */ }

第4章 附 录

附录1:TMS320C5402 CPU及外设存储器寄存器映射表

0 1 2-5 6 7 8 9 A B C D E F 10-17 18 19 1A 1B 1C 1D 1E 1E-1F 20 21 22 23 24 25 26 27 28 29 2A 2B IMR IFR - ST0 ST1 AL AH AG BL BH BG T TRN AR0-AR7 SP BK BRC RSA REA PMST XPC - McBSP0_DRR2 McBSP0_DRR1 McBSP0_DXR2 McBSP0_DXR1 TIM PRD TCR - SWWSR BSCR - SWCR 中断屏蔽寄存器 中断标志寄存器 测试保留 状态寄存器0 状态寄存器1 累加器A低字(15-0比特) 累加器A高字(31-16比特) 累加器A保护位(39-32比特) 累加器B低字(15-0比特) 累加器B高字(31-16比特) 累加器B保护位(39-32比特) 暂存寄存器 传送寄存器 辅助寄存器ARn n=0~7 堆栈指针 循环缓存区大小寄存器 块重复计数器 块重复开始地址 块重复结束地址 状态寄存器 程存扩展寻址寄存器 保留 带缓存串口0数据接收寄存器2 带缓存串口0数据接收寄存器1 带缓存串口0数据发送寄存器2 带缓存串口0数据发送寄存器1 定时器计数器 定时器周期寄存器 定时器控制寄存器 保留 等待状态产生寄存器 Bank-switching控制寄存器 保留 扩展等待控制寄存器 2C 2D-2F 30 31 32 33-37 38 39 3A-3B 3C 3D 3E-3F 40 41 42 43 44-47 48 49 4A-53 54 55 56 57 58 59-5F HPIC - TIM1 PRD1 TCR1 - McBSP0_SPSA McBSP0_SPSD GPIOCR GPIOSR McBSP1_DRR2 McBSP1_DRR1 McBSP1_DXR2 McBSP1_DXR1 - McBSP1_SPSA McBSP1_SPSD DMPREC DMSA DMSDI DMSDN CLKMD - 主机接口控制寄存器 保留 定时器计数器 定时器周期寄存器 定时器控制寄存器 保留 多缓冲串口0子地址寄存器 多缓冲串口0子数据寄存器 保留 GP I/O 引脚控制寄存器 GP I/O 引脚状态寄存器 保留 带缓存串口1数据接收寄存器 带缓存串口1数据发送寄存器 带缓存串口1控制寄存器 带缓存串口1控制扩展寄存器 保留 多缓冲串口1子地址寄存器 多缓冲串口1子数据寄存器 DMA优先允许控制寄存器 DMA子地址寄存器 时钟方式寄存器 保留 附录2:C5402中的中断标志寄存器(IMR)和中断屏蔽寄存器(IFR)

1) 中断标志寄存器IFR

IFR中某位为1表明有相应中断,再次写1清除中断。

2)中断屏蔽寄存器IMR

要开放某个中断,只需向IMR中相应位(中断允许位)写1。而ST1中INTM位为中断屏蔽总开关。

IFR和IMR寄存器各位功能描述 位号 15-14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 名称 —— DAMC5 DMAC4 BXINT1/DMAC3 BRINT1/ DMAC2 HPINT INT3 TINT1/ DAMC1 DMAC0 BXINT0 BRINT0 TINT0 INT2 INT1 INT0 保留 DMA通道5中断标志/屏蔽位 DMA通道4中断标志/屏蔽位 McBSP1发送中断标志/屏蔽位或 DMA通道3中断/标志屏蔽位 McBSP1接收中断标志/屏蔽位或 DMA通道2中断标志/屏蔽位 主机接口中断标志/屏蔽位 外部中断3中断标志/屏蔽位 TIMER1中断标志/屏蔽位或 DMA通道1中断标志/屏蔽位 DMA通道0中断标志/屏蔽位 McBSP0发送中断标志/屏蔽位 McBSP0接收中断标志/屏蔽位 Timer0中断标志/屏蔽位 外部中断2中断标志/屏蔽位 外部中断1中断标志/屏蔽位 外部中断0中断标志/屏蔽位 功能描述 注:所有DMA通道控制均由DMPREG寄存器来控制

附录3:TMS320C5402中断向量表与优先级

中断号 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 优先级 1 2 - - - - - - - - - - - - - 名 称 -RS/SINTR -NMI/SINT16 SINT17 SINT18 SINT19 SINT20 SINT21 SINT22 SINT23 SINT24 SINT25 SINT26 SINT27 SINT28 SINT29 位 置 功 能 0 4 8 C 10 14 18 1C 20 24 28 2C 30 34 38 复位(软、硬件) 非屏蔽中断 软件中断17 软件中断18 软件中断19 软件中断20 软件中断21 软件中断22 软件中断23 软件中断24 软件中断25 软件中断26 软件中断27 软件中断28 软件中断29 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30-31

- 3 4 5 6 7 8 9 10 11 12 13 14 15 16 - SINT30 -INT0/SINT0 -INT1/SINT1 -INT2/SINT2 TINT/SINT3 BRINT0/SINT4 BXINT0/SINT5 保留DMAC0,SINT6 TINT(DMAC1),SINT7 -INT3/SINT8 HPINT/SINT9 BRINT1(DMAC2)/SINT10 BXINT1(DMAC3)/SINT11 DMAC4,SINT12 DMAC5,SINT13 3C 40 44 48 4C 50 54 58 5C 60 64 68 6C 70 74 软件中断30 外部中断0 外部中断1 外部中断2 定时器0中断 缓存串口0接收中断 缓存串口0发送中断 保留(缺省)DMAC0 定时器1中断或DMA通道1中断 外部中断3 HPI口中断 带缓存串口1接收中断 带缓存串口1发送中断 DMA通道4中断 DMA通道5中断 78-7F 保留 附录4:TMS320C5402状态和控制寄存器

1)状态寄存器0 (ST0),结构如下: 15~13 ARP 位号 15~13 12 11 10 9 8~0 12 TC 名称 ARP TC C OVA OVB DP 11 C 10 OVA 9 OVB 功能描述 辅助寄存器指针。当寻址不修正时,要求ARP=0 测试/控制标志位。保存ALU的测试结果 进位位。加法时产生进位或减法时产生借位置C=1 累加器A和B溢出标志位 累加器A和B溢出标志位 数据存储器页指针。在直接寻址时作为数存的高9位地址 8~0 Bit DP 各状态位功能描述 2)状态寄存器1 (ST1),结构如下: 14 15 CPL BRAF XF HM INTM 0 OVM SXM C16 FRCT CMPT ASM 13 12 11 10 9 8 7 6 5 4~0 各状态位功能描述 位号 名称 功能描述 15 14 13 12 BRAF CPL XF HM 块重复操作标志位。为1时表示进行块重复操作 直接寻址编辑方式位。CPL=0时直接寻址指针为DP,CPL=1时直接寻址指针为SP XF引脚状态位。通过改变该寄存器的值可以改变XF引脚的输出 保持方式位。处理器响应hold信号时,HM=0时表示处理器继续执行内部操作,而将外部接口置成高阻,当HM =1时,表示处理器暂停内部操作 中断方式位。当INTM=0时,开放所有可屏蔽中断,当INTM=1时,关闭所有可屏蔽中断 读时总是0 溢出方式位。OVM=0时,忽略溢出,当OVM=1时,发生溢出时填充00 7fff ffffh(正溢出)或00 8000 0000h(负溢出) 符号扩展方式位。SXM=0时禁止符号扩展,SXM=1时数据进入ALU时进行符号扩展 双16位/双精度算术方式位。C16 =0时进行双精度算术运算,C16=1时进行双16位算术运算 小数方式位。在小数乘法时乘法器输出左移一位,来消除多余符号位。 修正方式位,决定ARP是否进行修正。CMPT=0时,间接单数存操作数操作时,不进行ARP修正,CMPT=1时,用AR0进行修正。 累加器移位方式位。 11 10 9 8 7 6 5 INTM 0 OVM SXM C16 FRCT CMPT 4~0 ASM 3)处理器工作方式状态寄存器(PMST),结构如下: 15~7 IPTR 位号 6 6 MP/MC 名称 5 OVLY 4 AVIS 3 DROM 2 CLKOFF 功能描述 中断向量指针。指向中断向量位置 1 0 Bit SST SMUL 各状态位功能描述 15~7 IPTR MP/MC 微处理器/微控制器工作方式位。若MP/MC=0使用片内ROM,若MP/MC=1则片内ROM 不安排到程序空间,此状态由外部引脚决定,但是可以软件修改 5 OVLY RAM重复占位位。当OVLY=0,DARAM只能映射到程序空间,当OVLY=1时,DARAM同时映射到程序存储空间。注意:数据页0不能映射到程序空间。 地址可见位。设置寻址内部程序空间时地址线是否在外部地址引脚输出,当AVIS=1时,则内部程序寻址时,在地址总线上同时输出。 数据ROM位。DROM=0时,片内ROM不映射到程序存储区,DROM=1时,片内ROM映射到数据存储区。 CLKOUT时钟输出关断位。CLKOUT=1时,禁止CLKOUT的输出,并且保持高电平。 乘法饱和方式位。当SMUL=1时,并且OVM=1,FRCT=1时,在进行乘法累加运算时,作饱和处理。 4 3 2 1 AVIS DROM CLKOFF SMUL 0

SST 存储饱和位。 附录5:片内4K掩模ROM的内部资源

地址为:F800h—FFFFh,其内部资源,其中 F000h – F7FFh 保留

F800h – FBFFh 程序自动载入程序 FC00h – FCFFh 256-word的μ律扩展表 FD00h – FDFFh 256-word的A律扩展表 FE00h – FEFFh 256-word的sin查找表 FF00h – FF7Fh 保留

FF80h – FFFFh 中断向量表

附录6:TMS320C5402时钟方式引脚状态及时钟方式寄存器

引脚状态 CLKMD1 0 0 0 1 1 1 1 0 15~12 PLLMUL PLLMUL 表示PLL倍频系数 PLLDIV表示PLL分频系数

PLLCOUNT 表示PLL计数器,用来设置PLL锁定时间 PLLON/OFF 表示PLL通断位

PLLNDIV 表示时钟发生器选择位,决定时钟发生器的工作方式,0表示分频器方式,1表示PLL方式

PLL STATUS 是PLL的状态位。指示时钟发生器的工作方式(此状态位只读)

CLKMD2 0 0 1 0 1 1 0 1 11 PLLDIV CLKMD3 0 1 0 0 0 1 1 1 10~3 PLLCOUNT CLKMD寄存器复位值 E007h 9007h 4007h 1007h F007 0000h F000h —— 2 PLLON/OFF 时钟方式 PLL*15 PLL*10 PLL*5 PLL*2 PLL*1 CLK/2 CLK/4 保留(旁路模式) 1 PLLNDIV 0 PLL STATUS CLKMD中各位域定义 附录7:软件等待状态寄存器(SWWSR)

15 XPA扩展寻址位 14~12 I/O空间 64K 11~9 数据空间 高32K 8~6 数据空间 低32K 5~3 程序空间 高32K 2~0 程序空间 低32K

附录8:TMS320C5402存储器分配

(MP/ MC、OVLY、DROM对存储器分配的影响)

附录9:TMS320C5402 –PQFP封装引脚排列顺序

因篇幅问题不能全部显示,请点此查看更多更全内容

Top