1. 实验目的
了解外部中断原理、外部中断响应方式及对外部中断的设置。
2. 实验原理:
TS201有4个外部中断输入引脚,IRQ0~IRQ3,用于处理器外部接口对程序的控制。这4个中断源可设置为边沿触发,也可设置为电平触发,通过对SQCTL寄存器编程实现,本实验使用边沿触发。
ADSP—TS201 EZ-KIT LITE板上,DSP A的IRQ0引脚和开关IRQ_A相连,当按下IRQ_A时,IRQ0输入为1,若程序设置了IRQ0中断,则会响应此中断,程序跳转至相应的中断服务程序执行。本实验的中断服务程序将实现点亮LED4和LED6的功能,以表示系统已经对外部中断产生了响应。
3.相关寄存器说明
1〉中断控制寄存器(INTCTL)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 TMR0R (4) – Timer0运行控制位,设为1则Timer0开始运行; TMR1R (5) – Timer1运行控制位,设为1则Timer1开始运行;
IRQx_EDGE(0~3) – 外部中断触发类型,0=边沿触发(复位后默认值),
1=电平触发; 6~31位保留 =0 。 2〉中断屏蔽寄存器(IMASK)
IMASK是一个64位寄存器,由IMASKH和IMASKL组成,当IMASK中某位被设置成1的时,那么将响应这个位所对应的中断。
IRQ0中断对应在IMASKH中的第9位,所以我们要取消对IRQ0中断的屏蔽,使能IRQ0中断,可以通过如下指令实现:
xr0=0x200;; // 0x200= B 0010 0000 0000 IMASKH=xr0;; xr0=0;; IMASKL=0
也可以直接使用如下指令实现,原理是一样的,下面的方法更为直观一些。
xr0=INT_IRQ0;; //INT_IRQ0在头文件中的定义的值为B0010 0000 0000 IMASKH=xr0;;
3. 实验例程:
本程序用汇编语言编写,包括主函数_start,循环等待函数_Wait_For_Interrupt和中断服务程序_IRQ0_ISR。
_start实现功能:使能Flag2/3为输出,使能IRQ0中断,设置中断服务程序入口; _Wait_For_Interrupt实现功能:熄灭LED,等待外部中断IRQ0发生; _IRQ0_ISR实现功能:外部中断发生后点亮LED4和LED6。
/**************************************************************************************
外部中断IRQ0控制,使用LED4和LED6状态表示对中断的响应
**************************************************************************************/ #include FLAGREG=xr0;; FLAGREGST=FLAGREG_FLAG2_EN|FLAGREG_FLAG3_EN;; /*以下设置中断服务程序及使能外部中断*/ j0=_IRQ0_ISR;; IVIRQ0=j0;; xr0=INT_IRQ0;; IMASKH=xr0;;//外部中断IRQ0使能 SQCTLST=SQCTL_GIE;; //全局中断使能 _Wait_For_Interrupt: .align_code 4; FLAGREGCL=~(FLAGREG_FLAG2_OUT);; FLAGREGCL=~(FLAGREG_FLAG3_OUT);; nop;nop;nop;idle;; //无限等待直到中断发生,然后跳至中断程序_IRQ0_ISR执行 jump _Wait_For_Interrupt;; _IRQ0_ISR: xr0=FLAGREG_FLAG2_OUT|FLAGREG_FLAG3_OUT;; FLAGREGST=xr0;; lc0=0x4000000;; .align_code 4; wait1: if nlc0e,jump wait1(np);;nop;;nop;;nop;; rti(np)(abs);; _start.end: 4. 实验步骤 1〉硬件连接 〉检查EZ-KIT板各SW设置是否正确,如下图; 〉用USB将PC与EZ-KIT板连接; 〉连接EZ-KIT板电源线,LED1(POWER)点亮、LED8(RESET)点亮,EZ-KIT板开始自动复位,复位完成后LED8熄灭,LED3点亮(USB MONITOR,注意此LED实际位置在USB上方),则表示EZ-KIT板与PC已经正常连接,可以运行VisualDSP++。 2〉启动程序 运行VisualDSP++进入主程序界面,若当前Session为ADSP-TS201S EZ-KIT Lite Via Debug Agent,则无需更改Session,否则需要更改Session为ADSP-TS201S EZ-KIT Lite Via Debug Agent,操作如下: 也可以通过如下方法直接选择所需要的Session: 运行VisualDSP++时按住Ctrl键,此时不会直接进入主程序界面,而是弹出Session List窗口,双击选择ADSP-TS201S EZ-KIT Lite Via Debug Agent或单击Activate将进入程序主界面。 若此时程序自动打开一个(或多个)工程,先将其关闭,通过以下两种方式实现: 3〉编译程序 〉新建工程文件,自定义文件名,然后将 ..\\Code\\IRQ下的IRQ.asm源文件导入工程中的Source Files内; 〉建立链接文件(如下图),一切选项保持默认,完成链接文件建立。 〉选择Project菜单下的Build project 选项进行编译,若有错误则双击错误处即可找到相应的错误程序行进行修改,直到无错误产生。 〉成功编译后程序会弹出如下一个窗口,我们需要将.dxe文件剪切至DSP A处,如右图,然后确认。注:dxe文件为编译后形成的可执行文件,导入dxe文件实际上就是把相应的可执行文件写入EZ-KIT LITE板中。 〉点击Debug菜单下的RUN选项开始运行(或直接按F5),点击EZ-KIT LITE板上的IRQ_A按键,会看到LED4和LED6同时点亮。 5. 实验要求 1〉按照实验步骤完成实验,根据相应程序思考如何通过外部中断控制LED; 2〉修改程序,将lc0值设置为10,重新观察实验现象并解释原因; 3〉与Timer中断对比分析两种中断差异,阐述各自主要特点; 4〉修改程序,当按下IRQ_A时点亮LED4熄灭LED6,不按下IRQ_A时(在没有外部中断 时)点亮LED6熄灭LED4; 5〉简述原程序流程。 因篇幅问题不能全部显示,请点此查看更多更全内容