exp5int.docx
《exp5int.docx》由会员分享,可在线阅读,更多相关《exp5int.docx(10页珍藏版)》请在冰豆网上搜索。
![exp5int.docx](https://file1.bdocx.com/fileroot1/2023-6/19/e37e5e1e-e5f7-4e89-9a4a-c2a272f0625d/e37e5e1e-e5f7-4e89-9a4a-c2a272f0625d1.gif)
exp5int
实验五INT2中断实验
一、实验目的
1.掌握中断技术,学会对外部中断的处理方法;
2.掌握中断对程序流程的控制,理解DSP对中断的响应时序。
二、实验设备
计算机,CCS2.0版软件,DSP仿真器,实验箱
三、实验原理
中断在C54x中有内部中断源和外部中断源,内部中断源包括一些片上外设产生的中断和软件产生的中断。
外部中断源包括经由外部中断引脚产生的中断。
在C54x中,中断有两种分类方法,第一种是按照是否可屏蔽,第二种是按照中断产生方式。
按照是否可屏蔽分类,分为可屏蔽和不可屏蔽。
所谓屏蔽是指DSP可以接受这个中断,但是却不作任何反映,也就是说对应的中断服务指令被屏蔽了,从而得不到执行,这种中断就叫做可屏蔽中断,相反的,如果一个中断只要产生,那么就必须有中断服务指令相应,这种中断叫做不可屏蔽中断。
按照中断产生的方式可以分为软件中断和硬件中断。
软件中断是指由指令产生的中断,硬件中断是指由外部中断源产生或者片上外设产生。
这两种分类方法之间有一定的联系,具体如下。
第一:
凡是软件中断必定是不可以屏蔽的。
原因很简单,软件中断是由软件产生,加入你想屏蔽它,那么干脆就别写这条指令,因此完全没有必要为软件中断设置是否可屏蔽机制。
第二:
硬件中断中有一些是可以屏蔽的,有一些不能屏蔽。
软件设计人员一般比较喜欢从可屏蔽性去考虑中断,而硬件设计人员喜欢从产生方式去考虑中断。
在以下的讨论中,我们以C5402为例,介绍中断的相关细节内容。
我们首先从应用的角度提出一个简单的问题如下:
当用户按下一个按键,产生一个中断,那么DSP是如何跳转到相应的中断服务指令,执行完中断服务指令以后,它又是如何返回正常的程序执行呢?
简单的讲,DSP的中断控制器发现一个中断以后,它就会把下一个将要执行的指令地址保存起来,然后跳到中断服务指令处执行,执行完以后,再把刚才保存的地址重新装入执行寄存器,然后正常执行。
那么,DSP是如何知道服务指令在哪里放着呢?
这就要从DSP的中断实现机制来讲。
C54x使用了一个叫做中断向量表的结构,里面保存着不同中断的服务指令入口地址。
C54x对中断进行编号,一共编了32个号,每个中断占用4个字的地址空间,所以这个中断向量表的大小是0x80。
下表是C5402的中断向量表组织结构。
在该表中,编号越低,优先级越高。
其中SINTx表示软件中断,也就是能通过软件实现的中断,而其它的就是对应的硬件中断。
比如NMI/SINT16,表明该中断既可以通过硬件实现,也可以软件实现。
硬件中断中,用户可以自定义仅有NMI,INT[0:
3],其它的硬件中断都已经指定给了DSP的片上外设,比如编号为19的中断,TINT0/SINT3,它是片上定时器中断或者软件中断,当片上定时器0到点后,就会产生一个中断,相应就会执行这个地址里面的东西。
仅有中断向量表,DSP似乎还是不能够找到中断服务指令的地址。
事实上,DSP内部有一个中断控制器,它能够识别每一个编号的中断,所以一旦中断发生后,中断控制器就可以根据编号在相应的中断向量表里面找中断服务指令的地址。
然而,中断控制器仅能识别中断的编号,也就是说寻址范围仅有0x80,是什么告诉系统中断向量表在哪里放着呢?
这就是前面讲到的,中断向量表指针(IPTR),这个指针在ST1寄存器中占用的9位,可以想象,由于中断向量表是0x80大小,因此,以0x80为单位,9位的寻址范围是64K字。
所以,中断向量表可以放在程序空间低64K中的任何以0x80为边界的地方。
而在系统初始化时,IPTR的值刚好映射到了程序空间FF80处。
现在大家比较清楚了上面我们提出问题的答案了。
更进一步讲,系统对中断的处理不是这么简单,因为,系统里面有套中断处理机制,必须判别中断是否已经被屏蔽,如果屏蔽,那么就不会得到响应。
在处理中断时,系统使用了两个主要的寄存器,中断标志寄存器(IFR),中断屏蔽寄存器(IMR)。
对于非可屏蔽中断和复位信号,系统直接相应,没有什么判断处理,也就不设计这两个寄存器。
IFR的位描述如下图所示。
这个寄存器的每一位对应一个中断,相应的中断发生后,这个位就会被置位。
显然,这里面没有NMI和RESET对应的标志位。
IMR的位描述如下图所示:
这根IFR是一一对应的。
IMR的值完全由程序员控制,假如你想屏蔽掉某个中断,那么你就需要对IMR的相应中断位置位。
对于可屏蔽中断的处理过程如下图所示;
中断源产生一个中断请求,在这个过程中,如果是可屏蔽中断,那么它必定在IFR里占一席之地,此时对IFR相应的位置位。
如果是不可屏蔽中断,直接进入中断服务程序。
中断服务程序要做的事情后面会讲到。
如果是可屏蔽的,那么接下来下来系统要确认是否可以执行。
如下图。
在这个阶段,系统回检查如下条件。
第一:
检查所有同时发生的中断的优先级,高优先级首先得到相应。
第二:
检查ST1中的中断模式位(INTM),如果该位为1,所有中断全部被屏蔽。
INTM是一种快速屏蔽所有可屏蔽中断的方法。
第三:
检查IMR中相应中断的屏蔽位,如果置位,则不能得到执行。
如果以上三条检查都通过,那么系统进入中断服务程序。
具体内容如下。
第一:
把程序计数器(PC)压栈。
第二:
把相应中断向量的地址装入程序计数器(PC)。
第三:
从中断向量地址中取到跳转指令,把IACK信号置低,同时对相应中断的IFR位清零,执行跳转指令。
IACK变低的时候,在紧接着的CLKOUT时钟上升沿,A6~A2表明了中断向量的编号,因此,可以通过IACK和A6~A2对中断进行检测,但必须将地址可见模式位(AVIS)置位。
第四:
执行中断服务指令直到一个返回语句。
第五:
正常返回,把栈里的内容弹出重新装入PC。
第六:
继续执行正常指令。
整个中断执行的流图如下。
需要注意一点,对于不可屏蔽中断在中断服务程序执行过程中,系统要检查是不是RESET,NMI或者INTR软件中断,如果是这几个中的任何一个,系统都要立即屏蔽所有可屏蔽中断,然后再继续执行。
在系统设计中要注意,有几种情况可以让程序跑飞。
在程序设计中要用编程策略保证正确的程序执行顺序。
第一种:
如果中断服务指令的执行时间大于同一中断的最小发生周期,而在中断服务指令执行的过程中,所有中断都没有屏蔽。
在这种情况下,一个中断服务指令还没有执行完而又新到达了一个中断,而新的中断又得到执行的允许,这种情况会使程序执行错误。
第二种:
如果同时发生的中断数超过一个固定的值,那么,就会有中断丢失。
第三种:
如果发生了中断,而被屏蔽掉了,那么IFR种的相应中断位将不会清零,这对于后来的中断处理有影响吗?
明确了这些问题,那么就可以自由使用中断。
C54XDSP的中断为低电平沿触发。
按S6键产生的低电平脉冲,输出给VC5402的INT2引脚,每按一次,产生一个低电平脉冲,用来控制实验箱上LED灯的亮灭。
该单元由555定时器组成单稳态触发电路,由按键S5控制,每按一次,产生一个低电平有效的单脉冲,脉冲宽度约10ms。
此脉冲经过CPLD整形,从CPLD逻辑单元的“单脉冲输出”2号孔输出。
四、实验步骤和内容
1、用连接线连接“CPLD单元”的2号孔“单脉冲输出”和“电机控制单元”2号孔“INT2”。
将“CPLD单元”拨码开关第3位打到“ON”位置。
2、低电平单脉冲触发DSP中断INT2;该中断由“单脉冲单元”按键“S5”产生。
按一次,产生一个中断。
2、运行CCS软件,调入样例程序,装载并运行;
3、每按一次“单脉冲输出”按键LED1~LED8灯亮灭变化一次;
4、填写实验报告。
5、样例程序实验操作说明
启动CCS2.0,并加载“NORMAL\EXP05_CPU2\DEBUG\exp05.out”;
单击“Run”运行程序,反复按开关“单脉冲输出”,观察LED1~LED8灯亮灭变化;
单击“Halt”暂停程序运行,反复按开关“单脉冲输出”,LED1~LED8灯亮灭不变化;
关闭所有窗口,本实验完毕。
源程序查看:
用下拉菜单中Project/Open,打开“NORMAL\EXP05_CPU2\Exp05.pjt”,双击“Source”,可查看各源程序。
程序框图
主程序流程图
中断程序流程图
五、思考题
1)54软件中断和硬件中断的区别?
各自的应用场合?
2)按键去抖的方法?