资源描述
中 南 大 学
嵌入式系统实验(二)
中断实验
学 院:**************
专业班级:*********
姓 名:*************
学 号:*************
中断实验
一. 实验目的
1. 熟悉arm开发板中断原理。并产生中断。
2. 了解快速中断和普通中断。编写嵌套中断实验。
二. 实验器材
PC机一台,周立功开发板一块
三.实验原理
EasyARM2103开发板提供了4个绿色发光二极管用作显示,电路如图1.1所示。显示电路采用了灌电流的方式来驱动发光二极管,由于微控制器LPC2103 I/O口提供的灌电流大于其拉电流,采用此驱动方式可以保证二极管发光的亮度。
1.1 Led电路原理
四. 实验原理
ARM体系的CPU有7种工作模式,可以通过软件来进行模式切换,或者发生各类中断、异常进行相应模式。CPU可以识别两种类型中断,正常中断(IRQ)和快速响应中断(FIQ)状态寄存器的PSR中F和R位决定是中断的启闭。为了使能中断,必须将PSR中F或R位清零,并且中断屏蔽寄存器相应位也要清零。
ARM中断分为子中断源和一般中断源,子中断源多了两个寄存器SUBRCPN(标识子中断源是否发生)INTSUBMSK(屏蔽子中断源)。
ARM中断发生过程如下:
1.如果为子中断源,则SUBSRCPND寄存器相应位置1,然后根据子中断源屏蔽寄存器(INTSUBMSK)的设置来判断该中断是否被屏蔽,如未屏蔽,则在SRCPND寄存器相应位置1。
2.如果为非子中断则直接在SRCPND寄存器相应位置1。
3. 如果INTMOD寄存器中该中断被设置为FIQ快速中断(相应位置1),即该中断立即执行。如不是,则判断INTMSK寄存器中该中断是否被屏蔽,如未屏蔽,则进入中断优先仲裁器进行中断优先设置(PRIORITY寄存器)
经过中断优先仲裁后,最高优先级的中断在INTPND寄存器中相应位置1(同一时间,此寄存器只有一位置1),INTOFFSET寄存器值用来表示INTPND寄存器置1位(即INTPND寄存器中位[x]为1时,INTOFFSET寄存器值为x,可以用它确定是什么中断。
要启用一个中断,我们主要设置以下寄存器:
1、INTMOD设置是否为快速中断(一个系统中只能有一个快速中断,默认没有快速中断,如不使用,可以不用设置)
2、INTMSK设置该中断是否被屏蔽
3、 PRIORITY设置该中断的优先级
如为子中断源,还需设置
4、INTSUBMSK设置子中断源是否被屏蔽
如果外接中断,还需设置以下寄存器:
5、GPXCON设置相应引脚为中断输入
6、EINTMASK设置外部中断输入使能
7、EXTINT0-EXTINT2设置外部引脚输入中断电平信号类型
其中,为外部中断输入时,EINTPEND寄存器用于保存是否有中断发生。EINTMASK 、EINTPEND寄存器[3-0]位保留取值为0。
中断信号清除
清除中断时在EINTPEND、 INTPND、SUBSRCPND及SRCPND寄存器该位写入1令此位为0,写入0效果。其清除过程为EINTPEND、SUBSRCPND、SRCPND 、INTPND,否则,将导致无限次中断。
五. 实验内容及步骤
1. 下面以GPIO的中断测试程序为例,熟悉EasyJTAG-H软件的使用方法,程序功能设计为控制单路LED闪烁,硬件电路如图1.1所示。
2. 打开示例工程。示例工程路径:配套光盘内容->光盘内容v1.00->3.EasyARM2103安装手册->GPIO Test,将此文件夹复制到其它目录下打开,要求存放目录必须无中文路径。打开文件夹后,建议用户先删掉“GPIO_Test_Data”文件夹,然后双击打开“GPIO Test.mcp”文件,即打开示例工程。
3. 点击“user”文件夹,打开main.c文件,见到示例代码
4. 编译连接工程。项目目标栏处选择DebugInFlash模式,然后编译连接工程。
5. 仿真调试 。将计算机并口与EasyJTAG-H仿真器相连,然后再将EasyJTAG-H仿真器的JTAG接口连接到EasyARM2103目标板上,打开H-JTAG,检测到芯片内核信息后,选择Auto Download选项,此时会自动启动H-Flasher软件,选择目标芯片的型号,将当前的配置信息保存起来,建议将配置信息保存到安装路径下的Hconfig文件夹内。
6. 设置完成后,关闭H-JTAG Server和H-Flasher(注意:不能使用Exit项关闭)。启动AXD,打开【Options】->【Configure Target...】,弹出Choose Target窗口,点击“ADD”添加仿真器的驱动程序,在添加文件窗口选择如D:\Program Files\H-JTAG 目录下的H-JTAG .dll,点击“打开”即可。
7. 为实现嵌套中断,修改main.c函数,重复上述步骤。
8. 在AXD环境点击运行,即可看到主程序led亮。通过中断按键,使其他led灯亮。
六. 附源代码如下:
#include "config.h"
#define LED 1 << 17
/*********************************************************************************************************
** Function name: Eint0IRQ
** Descriptions: 外部中断0服务程序
** input parameters: 无
** ouput parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __irq Eint0IRQ(void)
{ /* 进入中断取反LED */
if ((IO0PIN & (1 << 17)) == 0) {
IO0SET = 1 << 17; /* 熄灭发光二极管 */
}
else {
IO0CLR = 1 << 17; /* 点亮发光二极管 */
}
while((IO0PIN & (1 << 16)) == 0); /* 等待按键松开 */
EXTINT = 0x01; /* 清中断标志 */
VICVectAddr = 0x00; /* 通知VIC中断处理结束 */
}
/*********************************************************************************************************
** Function name: main
** Descriptions: P0.16低电平触发外部中断主函数
** input parameters: 无
** ouput parameters: 无
** Returned value: 无
*********************************************************************************************************/
int main (void)
{
PINSEL1 = PINSEL1 & (~0x03);
PINSEL1 = PINSEL1 | 0x01; /* 设置P0.16为外部中断0管脚 */
PINSEL1 = PINSEL1 & (~(0x03 << 2)); /* 设置P0.17为GPIO功能 */
IO0DIR = LED; /* 设置P0.17为输出 */
IO0SET = LED; /* 设置输出为高电平 */
IRQEnable(); /* IRQ中断使能 */
EXTMODE = 0x00; /* 设置外部中断为低电平触发 */
EXTPOLAR = 0x00;
VICIntSelect = 0 << 14; /* 选择EINT0为FIQ中断 */
VICVectCntl0 = 0x20 | 14; /* 将外部中断0分配给向量中断0 */
VICVectAddr0 = (uint32)Eint0IRQ; /* 设置中断服务程序地址 */
VICIntEnable = 1 << 14; /* 使能EINT0中断 */
EXTINT = 0x01; /* 清除EINT0中断标志 */
while(1);
return 0;
}
展开阅读全文