当前位置:文档之家› 嵌入式实验4(中断处理程序设计)

嵌入式实验4(中断处理程序设计)

北华航天工业学院
《嵌入式系统基础》课程实验报告
实验名称编号:实验4 中断处理程序设计
作者所在系部:计算机科学与工程系
作者所在专业:计算机科学与技术
作者所在班级:B09513
作者学号:20094051329
作者姓名:康建云
教师姓名:李建义
一、实验内容
1.本实验涵盖实验手册《ARM嵌入式系统设计及接口编程实验教程》中的实验9 中
断处理程序设计。

2.修改程序,使得当四个中断源中断时分别调用实验二跑马灯实验的实验内容第二项中编写的一个函数,即不同中断将控制四个跑马灯的闪烁顺序。

二、实验要求
1.了解ARM处理器中断处理过程。

2.掌握S3C2440下进行中断编程的方法,包括中断设置、中断服务子程序的编写。

3.理解实验手册中的实验9的实验程序。

4.编程实现实验内容中第2项任务。

5.撰写实验报告描述实现上述个要求的情况。

三、实验思路
在SinoSys-M3中,已经将EINT0、EINT1、EINT2、EINT19、EINT11作为外部中断源和开发板上位号为SW1、SW2、SW3、SW4的这四个小按键相连。

在实验的过程中,在运行之后,按下开关板上这四个按钮,将触发处理器的四个外部中断,处理器转而去执行相应的中断服务程序,在中断服务程序中,向串口打印中断信息,并输出到开发主机的串口终端工具上。

因为key=1、key=3、key=5、key=7分别对应SW1、SW2、SW3、SW4四个按钮。

所以改程序时只需控制key值在不同值下的灯亮情况即可,修改程序实现跑马灯不同亮的次序并循环五次,所修改的程序如下:
四、实验程序
static void __irq Key_ISR(void)
{ int i; U8 key;
if(rINTPND==BIT_EINT8_23) {
ClearPending(BIT_EINT8_23);
if(rEINTPEND&(1<<11))
{ Uart_Printf("eint11\n");
rEINTPEND |= 1<< 11; }
if(rEINTPEND&(1<<19)) {
Uart_Printf("eint19\n"); rEINTPEND |= 1<< 19; }}
if(rINTPND==BIT_EINT0)
{//Uart_Printf("eint0\n");
ClearPending(BIT_EINT0); } if(rINTPND==BIT_EINT2) {
Uart_Printf("eint2\n");
ClearPending(BIT_EINT2); }
key=Key_Scan();
if(key==1)//从左到右依次亮
{ for(i=0;i<5;i++){ rGPFDAT=rGPFD AT&0x0F|0xE0;
Delay(1000);
rGPFDAT=rGPFDAT&0x0F|0xD0;
Delay(1000);
rGPFDAT=rGPFDAT&0x0F|0xB0;
Delay(1000);
rGPFDAT=rGPFDAT&0x0F|0x70;
Delay(2000); }}
if(key==3) //从右到左依次亮
{ for(i=0;i<5;i++){ rGPFDAT=rGPFD AT&0x0F|0x70; Delay(1000);
rGPFDAT=rGPFDAT&0x0F|0xB0; Delay(1000);
rGPFDAT=rGPFDAT&0x0F|0xD0;
Delay(1000);
rGPFDAT=rGPFDAT&0x0F|0xE0;
Delay(2000); }}
if(key==5) //从左边两个到右边两个到两边的两个到中间两个依次亮
{ for(i=0;i<5;i++){ rGPFDAT=rGPFD AT&0x0F|0xC0; Delay(1000);
rGPFDAT=rGPFDAT&0x0F|0x30; Delay(1000);
rGPFDAT=rGPFDAT&0x0F|0x90; Delay(1000);
rGPFDAT=rGPFDAT&0x0F|0x60; Delay(2000); }}
if(key==7) //从中间两个到两边两个到右边的两个到左边两个依次亮
{ for(i=0;i<5;i++){
rGPFDAT=rGPFDAT&0x0F|0x60; Delay(1000);
rGPFDAT=rGPFDAT&0x0F|0x90; Delay(1000);
rGPFDAT=rGPFDAT&0x0F|0x30; Delay(1000);
rGPFDAT=rGPFDAT&0x0F|0xC0; Delay(2000); }}
五、实验结果及实验问题分析
1.实验结果
更改代码后,分别按下sw1、sw2、sw3、sw4按钮,主函数调用keyscan.c文件,继而调用中断服务子程序,根据相应key==1、key==3、key==5、key==7,按实验要求分别实现了使四个灯的闪烁顺序依次为左1灯亮→左2灯亮-→左3灯亮-→左4个灯亮-→四个灯全灭的中断控制;左4灯亮→左3灯亮-→左2灯亮-→左1个灯亮-→四个灯全灭;左1、2灯亮→左3、4个灯亮-→两边两个灯亮-→中间两灯亮-→四个灯全灭;左3、4灯亮-→左1、2个灯亮-→中间两个灯亮-→两边两个灯亮-→四个灯全灭。

并且实验结果都是正确的。

2、实验总结:
原程序每次按键触发中断时,中断发生的次数是不固定的,其原因在于对中断寄存器
设置是低电平触发,若长按键则会多次调用中断服务子程序,即中断发生的次数不固定。

正确做法:设置中断为低电平触发,中断寄存器设置代码更改部分如下:
rEXTINT0 &=~(7|7<<8);
rEXTINT0 |= (2|2<<8); // set EINT0,2 low power
rEXTINT0 &=~(7<<12);
rEXTINT0 |= (2<<12); // set EINT 11 low power
rEXTINT0 &=~(0xF<<12);
rEXTINT0 |= (2<<12); // set EINT 19 low power
通过本次实验,基本掌握了中断程序的中断原理,也掌握了用实验箱上按钮控制跑马灯循环亮的情况,也了解并掌握了中断服务子程序的原理。

并且掌握了在S3c2440控制台下进行中断服务子程序的编程方法。

相关主题