1、 中 南 大 学 嵌入式系统实验(二) 中断实验 学 院:************** 专业班级:********* 姓 名:************* 学 号:************* 中断实验 一. 实验目的 1. 熟悉arm开发板中断原理。并产生中断。 2. 了解快速中断和普通中断。编写嵌套中断实验。 二. 实验器材 PC机一台,周立功开发板一块 三.实验原理 EasyARM2103开发板提供了4个绿色发光二极管用作显示,电路如图
2、1.1所示。显示电路采用了灌电流的方式来驱动发光二极管,由于微控制器LPC2103 I/O口提供的灌电流大于其拉电流,采用此驱动方式可以保证二极管发光的亮度。 1.1 Led电路原理 四. 实验原理 ARM体系的CPU有7种工作模式,可以通过软件来进行模式切换,或者发生各类中断、异常进行相应模式。CPU可以识别两种类型中断,正常中断(IRQ)和快速响应中断(FIQ)状态寄存器的PSR中F和R位决定是中断的启闭。为了使能中断,必须将PSR中F或R位清零,并且中断屏蔽寄存器相应位也要清零。 ARM中断分为子中断源和一般中断源,子中断源多了两个寄存器SUBRC
3、PN(标识子中断源是否发生)INTSUBMSK(屏蔽子中断源)。 ARM中断发生过程如下: 1.如果为子中断源,则SUBSRCPND寄存器相应位置1,然后根据子中断源屏蔽寄存器(INTSUBMSK)的设置来判断该中断是否被屏蔽,如未屏蔽,则在SRCPND寄存器相应位置1。 2.如果为非子中断则直接在SRCPND寄存器相应位置1。 3. 如果INTMOD寄存器中该中断被设置为FIQ快速中断(相应位置1),即该中断立即执行。如不是,则判断INTMSK寄存器中该中断是否被屏蔽,如未屏蔽,则进入中断优先仲裁器进行中断优先设置(PRIORITY寄存器) 经过中断优先
4、仲裁后,最高优先级的中断在INTPND寄存器中相应位置1(同一时间,此寄存器只有一位置1),INTOFFSET寄存器值用来表示INTPND寄存器置1位(即INTPND寄存器中位[x]为1时,INTOFFSET寄存器值为x,可以用它确定是什么中断。 要启用一个中断,我们主要设置以下寄存器: 1、INTMOD设置是否为快速中断(一个系统中只能有一个快速中断,默认没有快速中断,如不使用,可以不用设置) 2、INTMSK设置该中断是否被屏蔽 3、 PRIORITY设置该中断的优先级 如为子中断源,还需设置 4、INTSUBMSK设置子中断源是否被屏蔽 如果外接中断,还需设置以下寄存器:
5、 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的中
6、断测试程序为例,熟悉EasyJTAG-H软件的使用方法,程序功能设计为控制单路LED闪烁,硬件电路如图1.1所示。 2. 打开示例工程。示例工程路径:配套光盘内容->光盘内容v1.00->3.EasyARM2103安装手册->GPIO Test,将此文件夹复制到其它目录下打开,要求存放目录必须无中文路径。打开文件夹后,建议用户先删掉“GPIO_Test_Data”文件夹,然后双击打开“GPIO Test.mcp”文件,即打开示例工程。 3. 点击“user”文件夹,打开main.c文件,见到示例代码 4. 编译连接工程。项目目标栏处选择DebugInFlash模式,然后编译连接工程。
7、 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窗口,点击“
8、ADD”添加仿真器的驱动程序,在添加文件窗口选择如D:\Program Files\H-JTAG 目录下的H-JTAG .dll,点击“打开”即可。 7. 为实现嵌套中断,修改main.c函数,重复上述步骤。 8. 在AXD环境点击运行,即可看到主程序led亮。通过中断按键,使其他led灯亮。 六. 附源代码如下: #include "config.h" #define LED 1 << 17 /*******************************************************************************
9、 ** Function name: Eint0IRQ ** Descriptions: 外部中断0服务程序 ** input parameters: 无 ** ouput parameters: 无 ** Returned value: 无 *********************************************************************************************************/ void __irq Ein
10、t0IRQ(void) { /* 进入中断取反LED */ if ((IO0PIN & (1 << 17)) == 0) { IO0SET = 1 << 17; /* 熄灭发光二极管 */ }
11、 else { IO0CLR = 1 << 17; /* 点亮发光二极管 */ } while((IO0PIN & (1 << 16)) == 0); /* 等待按键松开 */ EXTINT = 0x01;
12、 /* 清中断标志 */ VICVectAddr = 0x00; /* 通知VIC中断处理结束 */ } /********************************************************************************************************* ** Function name: main ** Descriptions:
13、 P0.16低电平触发外部中断主函数 ** input parameters: 无 ** ouput parameters: 无 ** Returned value: 无 *********************************************************************************************************/ int main (void) { PINSEL1 = PINSEL1 & (~0x03); PINSEL1 = PINSEL1 | 0x01;
14、 /* 设置P0.16为外部中断0管脚 */ PINSEL1 = PINSEL1 & (~(0x03 << 2)); /* 设置P0.17为GPIO功能 */ IO0DIR = LED; /* 设置P0.17为输出 */ IO0SET = LED
15、 /* 设置输出为高电平 */ IRQEnable(); /* IRQ中断使能 */ EXTMODE = 0x00; /* 设置外部中断为低电平触发 */ E
16、XTPOLAR = 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; }
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818