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

更新时间:2023-10-08 08:42:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

北华航天工业学院

《嵌入式系统基础》课程实验报告

实验名称编号: 实验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(\ rEINTPEND |= 1<< 11; } if(rEINTPEND&(1<<19)) { Uart_Printf(\ rEINTPEND |= 1<< 19; }} if(rINTPND==BIT_EINT0) {//Uart_Printf(\ ClearPending(BIT_EINT0); } if(rINTPND==BIT_EINT2) { Uart_Printf(\ ClearPending(BIT_EINT2); } key=Key_Scan();

if(key==1)//从左到右依次亮

{ for(i=0;i<5;i++){ rGPFDAT=rGPFDAT&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=rGPFDAT&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=rGPFDAT&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控制台下进行中断服务子程序的编程方法。

本文来源:https://www.bwwdw.com/article/p3ud.html

Top