嵌入式系统实践实验报告-中断实验_第1页
嵌入式系统实践实验报告-中断实验_第2页
嵌入式系统实践实验报告-中断实验_第3页
嵌入式系统实践实验报告-中断实验_第4页
嵌入式系统实践实验报告-中断实验_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第?次实验实验名称 学号姓名第1页共22页计算机科学技术系上机实践报告课程名称:嵌入式系统实践年级:上机实践成绩:指导教师:姓名:创新实践成绩:上机实践名称:中断实验学号:上机实践日期:上机实践编号:No.5组号:上机实践时间:实验目的通过实验掌握ARM处理器的中断方式和中断处理;熟悉S3C44BOX中断控制寄存器的使用;了解不同中断触发方式对中断产生的影响;理解S3C44BOX处理器的中断响应过程;熟练掌握如何进行ARM处理器中断处理的软件编程方法。实验设备硬件:EmbestEDUKIT-III(实验平台)PC机软件:EmbestIDEProARM集成开发环境GNUAssembler汇编语言实验内容编写中断处理程序,实现:由UART0选择输入使用不同的中断触发方式,使能外部中断Eint4,5,6,7;在不同的中断触发方式下,使用按钮SB1202触发EINT6,同时点亮LED1204一段时间后熄灭;在不同的中断触发方式下,使用按钮SB1203触发EINT7,同时点亮LED1205一段时间后熄灭。文档中按钮标号、LED标号均采用实验硬件平台上标号的简写形式:按钮:SB1202–>SB2SB1203–>SB3LED:D1204–>LED1D1205–>LED2用C语言实现中断程序,要求:–不再选择使用什么触发方式(EXTINT),而是全部使用下降沿触发–从超级终端输入n=1-9,使得:»当按下按钮SB1202时,LED的D1204闪烁n下»当按下按钮SB1203时,LED的D1205闪烁n下»其中,闪烁是指点亮1秒,延时1秒,然后再熄灭,再延时1秒»假设:delay(10000)为延时1秒实验原理ARM处理器中断S3C44B0X的中断控制器可以接受来自30个中断源的中断请求。这些中断源来自DMA、UART、SIO等这样的芯片内部外围或芯片外部引脚。在这些中断源中,有4个外部中断(EINT4/5/6/7)是逻辑或的关系,它们共用一条中断请求线。UART0和UART1的错误中断也是逻辑或的关系。中断控制器的任务是在片内外围和外部中断源组成的多重中断发生时,选择其中一个中断通过FIQ或IRQ向ARM7TDMI内核发出中断请求。实际上最初ARM7TDMI内核只有FIQ(快速中断请求)和IRQ(通用中断请求)两种中断,其它中断都是各个芯片厂家在设计芯片时定义的,这些中断根据中断的优先级高低来进行处理。例如,如果你定义所有的中断源为IRQ中断(通过中断模式寄存器设置),并且同时有10个中断发出请求,这时可以通过读中断优先级寄存器来确定哪一个中断将被优先执行。一般的中断模式在进入所需的服务程序前需要很长的中断反应时间,为了解决这个问题,S3C44B0X提供了一种新的中断模式叫做向量中断模式,它具有CISC结构微控制器的特征,能够降低中断反应时间。换句话说S3C44B0X的中断控制器硬件本身直接提供了对向量中断服务的支持。当多重中断源请求中断时,硬件优先级逻辑会判断哪一个中断将被执行,同时,硬件逻辑自动执行由0X18(或0X1C)地址到各个中断源向量地址的跳转指令,然后再由中断源向量进入到相应的中断处理程序。和原来的软件实现的方式相比,这种方法可以显著地减少中断反应时间。2.中断控制程序状态寄存器的F位和I位如果CPSR程序状态寄存器的F位被设置为1,那么CPU将不接受来自中断控制器的FIQ(快速中断请求),如果CPSR程序状态寄存器的I位被设置为1,那么CPU将不接受来自中断控制器的IRQ(中断请求)。因此,为了使能FIQ和IRQ,必须先将CPSR程序状态寄存器的F位和I位清零,并且中断屏蔽寄存器INTMSK中相应的位也要清零。中断模式(INTMOD)ARM7TDMI提供了2种中断模式,FIQ模式和IRQ模式。所有的中断源在中断请求时都要确定使用哪一种中断模式。中断挂起寄存器(INTPND)用于指示对应的中断是否被激活。如果挂起位被设置为1,那么无论标志I或标志F是否被清零,都会执行相应的中断服务程序。中断挂起寄存器为只读寄存器,所以在中断服务程序中必须加入对I_ISPC和F_ISPC写1的操作来清除挂起条件。中断屏蔽寄存器(INTMSK)当INTMSK寄存器的屏蔽位为1时,对应的中断被禁止;当INTMSK寄存器的屏蔽位为0时,则对应的中断正常执行。如果一个中断的屏蔽位为1,在该中断发出请求时挂起位还是会被设置为1。如果中断屏蔽寄存器的global位设置为1,那么中断挂起位在中断请求时还会被设置,但所有的中断请求都不被受理。3.S3C44B0X中断源在30个中断源中,有26个中断源提供给中断控制器,其中4个外部中断(EINT4/5/6/7)通过“或”的形式提供一个中断源送至中断控制器,2个URAT错误中断(UERROR0/1)也是如此。表4-14S3C44B0X的中断源4.向量中断模式(仅针对IRQ)S3C44B0X含有向量中断模式,可以减少中断的反应时间。通常情况下ARM7TDMI内核收到中断控制器的IRQ中断请求,ARM7TDMI会在0X00000018地址处执行一条指令。但是在向量中断模式下,当ARM7TDMI从0X00000018地址处取指令的时候,中断控制器会在数据总线上加载分支指令,这些分支指令使程序计数器能够对应到每一个中断源的向量地址。这些跳转到每一个中断源向量地址的分支指令可以由中断控制器产生。例如,假设EINT0是IRQ中断,如表4-15所示,EINT0的向量地址为0X20,所以中断控制器必须产生从0X18到0X20的分支指令。因此,中断控制器产生的机器码为0xea000000.在各个中断源对应的中断向量地址中,存放着跳转到相应中断服务程序的程序代码,在相应向量地址处分支指令的机器代码是这样计算的:向量中断模式的指令机器代码=0xea000000+((<目标地址>-<向量地址>-0x8)>>2)例如,如果Timer0中断采用向量中断模式,则跳转到对应中断服务程序的分支指令应该存放在向量地址0x00000060处。中断服务程序的起始地址在0x10000,下面就是计算出来放在0x60处的机器代码:machinecode@0x00000060:0xea000000+((0x10000-0x60-0x8)>>2)=0xea000000+0x3fe6=0xea003fe6通常机器代码都是反汇编后自动产生的,因此不必真正象上面这样去计算。表4-15中断源的向量地址向量中断模式的程序举例在向量中断模式下,当中断请求产生时,程序会自动进入相应的中断源向量地址,因此,在中断源向量地址处必须有一条分支指令使程序进入到相应的中断服务程序,如下:ENTRY:bResetHandler/*fordebug*/bHandlerUndef/*handlerUndef*/bHandlerSWI/*SWIinterrupthandler*/bHandlerPabort/*handlerPAbort*/bHandlerDabort/*handlerDAbort*/b./*handlerReserved*/ldrpc,=HandlerIRQbHandlerFIQVECTOR_BRANCH:ldrpc,=HandlerEINT0/*mGA0x20H/Winterruptvectortable*/ldrpc,=HandlerEINT1/**/ldrpc,=HandlerEINT2/**/ldrpc,=HandlerEINT3/**/ldrpc,=HandlerEINT4567/**/ldrpc,=HandlerTICK/*mGA0x34*/b.b.ldrpc,=HandlerZDMA0/*mGB0x40*/ldrpc,=HandlerZDMA1/**/ldrpc,=HandlerBDMA0/**/ldrpc,=HandlerBDMA1/**/ldrpc,=HandlerWDT/**/ldrpc,=HandlerUERR01/*mGB0x54*/b.b.ldrpc,=HandlerTIMER0/*mGC0x60*/ldrpc,=HandlerTIMER1/**/ldrpc,=HandlerTIMER2/**/ldrpc,=HandlerTIMER3/**/ldrpc,=HandlerTIMER4/**/ldrpc,=HandlerTIMER5/*mGC0x74*/b.b.ldrpc,=HandlerURXD0/*mGD0x80*/ldrpc,=HandlerURXD1/**/ldrpc,=HandlerIIC/**/ldrpc,=HandlerSIO/**/ldrpc,=HandlerUTXD0/**/ldrpc,=HandlerUTXD1/*mGD0x94*/b.b.ldrpc,=HandlerRTC/*mGKA0xa0*/b./**/b./**/b./**/b./**/b./*mGKA0xb4*/b.b.ldrpc,=HandlerADC/*mGKB0xc0*/5.中断控制专用寄存器中断控制寄存器(INTCON)注意:FIQ模式不支持向量中断模式。从表中可以看出,INTCON寄存器中位[0]为FIQ中断使能位,写入0就使能FIQ中断;位[1]为IRQ中断使能位,写入0就使能IRQ中断;位[2]是选择IRQ中断为向量中断模式(V=0)还是普通模式(V=1)。中断挂起寄存器(INTPND)中断挂起寄存器INTPND共有26位,每一位对应着一个中断源,当中断请求产生时,相应的位会被设置为1。该寄存器为只读寄存器,所以在中断服务程序中必须加入对I_ISPC和F_ISPC写1的操作来清除挂起条件。如果有几个中断源同时发出中断请求,那么不管它们有没有被屏蔽,它们相应的挂起位都会置1。只是优先级寄存器会根据它们的优先级高低来响应当前优先级最高的中断。中断模式寄存器(INTMOD)中断模式寄存器INTMOD共有26位,每一位对应着一个中断源,当中断源的模式位设置为1时,对应的中断会由ARM7TDMI内核以FIQ模式来处理。相反的,当模式位设置为0时,中断会以IRQ模式来处理。中断屏蔽寄存器(INTMSK)在中断屏蔽寄存器INTMSK中,除了全屏蔽位“globalmask”外,其余的26位都分别对应一个中断源。当屏蔽位为1时,对应的中断被屏蔽;当屏蔽位为0时,该中断可以正常使用。如果全屏蔽位“globalmask”被设置为1,则所有的中断都不执行。如果使用了向量中断模式,在中断服务程序中改变了中断屏蔽寄存器INTMSK的值,这时并不能屏蔽相应的中断过程,因为该中断在中断屏蔽寄存器之前已经被中断挂起寄存器INTPND锁定了。要解决这个问题,就必须在改变中断屏蔽寄存器后再清除相应的挂起位(INTPND)。IRQ向量模式相关寄存器S3C44B0X中的优先级产生模块包含5个单元,1个主单元和4个从单元。每个从优先级产生单元管理6个中断源。主优先级产生单元管理4个从单元和2个中断源。每一个从单元有4个可编程优先级中断源(sGn)和2个固定优先级中断源(kn)。这4个中断源的优先级是由I_PSLV寄存器决定的。另外2个固定优先级中断源在6个中断源中的优先级最低。主单元可以通过I_PMST寄存器来决定4个从单元和2个中断源的优先级。这2个中断源INT_RTC和INT_ADC在26个中断源中的优先级最低。如果几个中断源同时发出中断请求,这时I_ISPR寄存器可以显示当前具有最高优先级的中断源。IRQ/FIQ中断挂起清零寄存器(I_ISPC/F_ISPC)通过对I_ISPC/F_ISPC相应的位写1来清除中断挂起位(INTPND)。6.电路原理如图4-5中断实验电路所示,本实验选择的是外部中断EXINT6和EXINT7。中断的产生分别来至按钮SB2和SB3,当按钮按下时,EXINT6或EXINT7和地连接,输入低电平,从而向CPU发出中断请求。当CPU受理中断后,进入相应的中断服务程序,实现LED1或LED2的显示功能。从前面介绍的中断源部分我们了解到,EXINT6和EXINT7是共用一个中断控制器,所以在同一时间CPU只能受理其中一个中断,也就是说,当钮SB2按下进入中断后,再按SB3是没用的,CPU在处理完EXINT6中断前是不会受理来自EXINT7的中断,大家可以在实验中留意一下这个情况。另外8段数码管显示部分电路在这里没有给出,需要的话可以参考4.6节。图4-5中断实验电路实验步骤1.准备实验环境使用Embest仿真器连接目标板,使用EmbestEduKit-III实验板附带的串口线,连接实验板上的UART0和PC机的串口。2.串口接收设置在PC机上运行windows自带的超级终端串口通信程序(波特率115200、1位停止位、无校验位、无硬件流控制);或者使用其它串口通信程序。3.打开实验例程1)拷贝光盘CD1\Software\EduKit44b0文件夹到EmbestIDE\Examples\Samsung\目录下;2)使用EmbestIDE通过EmbestJTAG仿真器连接实验板,打开实验例程目录4.3_int_test子目录下的int_test.pjf例程,编译链接工程;3)点击IDE的Debug菜单,选择RemoteConnect项或F8键,远程连接目标板;4)点击IDE的Debug菜单,选择Download下载调试代码到目标系统的RAM中;5)打开View菜单>DebugWindows>Register寄存器观察窗口(快捷键Alt+5),在寄存器观察窗口下面选择外围寄存器(Peripheral),将INTERRUPT中断寄存器组展开,重点观察INTPND和I_ISPR寄存器值的变化,如下图所示:图4-6EmbestIDE外围寄存器窗口6)在工程管理窗口中双击int_test.c就会打开该文件,分别在“uart_printf("Pressthebuttons\n");”以及“if(f_ucIntNesting)”设置断点后,点击Debug菜单Go或F5键运行程序,程序正确运行后,会在超级终端上输出如下信息7)使用PC机键盘,输入所需设置的中断触发方式后,程序停留在第一个断点处,此时注意观察图4-6中中断控制寄存器的值,即中断配置情况;8)再次点击Debug菜单Go或F5键运行程序,并等待按下按钮产生中断;当按下SB2或SB3后,程序停留到中断服务程序入口的断点,再次观察图4-6中中断控制寄存器的值,双击INTPND和I_ISPR可以打开寄存器窗口,注意观察[21]位值在程序运行前后的变化(提示:中断申请标志位应该被置位);9)点击Debug菜单下的Stepover或F10键执行程序,注意观察在执行完该函数返回前后,程序状态寄存器的变化(提示:CPSR在返回时恢复中断产生前的值);继续单步执行程序,从中断返回后,程序会判断被按下的按键点亮相应的LED:按下SB2点亮LED1或按下SB3点亮LED2;10)结合实验内容和实验原理部分,掌握ARM处理器中断操作过程,如中断使能、设置中断触发方式和中断源识别等,重点理解ARM处理器的中断响应及中断处理的过程。4.观察实验结果等待选择输入所需中断方式设置:在PC机键盘上输入1选择下降沿触发,并按下按钮SB2如果重复按下按钮SB2或再按下另一个按钮(在中断响应后到点亮LED1之间),将会报告当前正在处理第一个按钮产生的中断,并输出信息表示中断嵌套。六、调试过程、结果和分析本次实验过程中首先按照教材示例运行并观察了寄存器的变化,并且采用中断观察中断配置情况,在学习并理解示例程序的基础上按照习题要求进行了编程。首先本习题要求不选择使用什么触发方式,全部使用下降沿触发,则在程序中设置rEXTINT=0x22222222;从而全部采用Fallingedgemode。之后用switch语句,对9个N的值分类,并利用for循环设置当闪灯次数未达到n值时持续闪灯。在调试过程中未出现较大问题,一开始出现了一些小问题例如switch语句下的case中要将n的类型的转换问题,还有就是一开始写的程序在未运行时设置print的显示句子不够人性化,有的提示语句出现的时机不恰当,在自己反复多次的试验下最终达到了比较通顺的效果。调试过程部分截图如下所示:BuildConnect超级终端七、总结本次实验整体来说完成得比较顺利,尤其是相对于实验四来说,在读懂本次实验的示例程序的基础上完成习题程序的编写难度不大,示例程序实现的功能更多,在按照书本介绍的步骤对示例程序进行分析后做一些修改即可完成实验要求的功能,加上自己反复实践,逐步微调之后,超级终端上的显示也较为人性化。本次实验完成的时间较短,所以留出了更多的时间继续完成难度更大的实验四。八、附件#include "44blib.h"#include "44b.h"#include "def.h"voidinit_int(void);voidint_test(void);voidint4567_isr(void);//__attribute__((interrupt("IRQ")));unsignedcharf_ucIntNesting=0; //Interruptnestingcountunsignedcharf_ucWhichInt=0; //interruptsourcesymbolvoidinit_int(void){ //interruptsettings rI_ISPC=0x3ffffff; //clearinterruptpendingregister rEXTINTPND=0xf; //clearEXTINTPNDregister rINTMOD=0x0; //allforIRQmode rINTCON=0x5; //nonVectoredmode,IRQdisable,FIQdisable rINTMSK=~(BIT_GLOBAL|BIT_EINT4567); //setEINTinterrupthandler pISR_EINT4567=(int)int4567_isr; //PORTGconfiguration rPCONG=0xffff; //EINT7~0 rPUPG=0x0; //pullupenable rEXTINT=rEXTINT|0x22220020; //EINT4567fallingedgemode rI_ISPC|=BIT_EINT4567; rEXTINTPND=0xf; //clearEXTINTPNDreg}voidint_test(void){ unsignedintunSaveG,unSavePG; init_int(); inti,j;charn; rINTMSK=rINTMSK|BIT_EINT4567; //disableEINT2int //userinterface uart_printf("PleaseEnterthenumbern:\n" "n=1-9\n"); //savethecurrentsettingsofPortGcontroler unSaveG=rPCONG; unSavePG=rPUPG; rPCONG=0xf5ff; //EINT7~0 rPUPG=0x0; rEXTINT=0x22222222; //Fallingedgemode switch(uart_getch()) { case'1': n=1; break; case'2': n=2; break; case'3': n=3; break; case'4': n=4; break; case'5': n=5; break; case'6': n=6; break; case'7': n=7; break; case'8': n=8; break; case'9': n=9; break; default: rPCONG=unSaveG; rPUPG=unSavePG; return; } uart_printf("Pressthebuttons\n"); uart_printf("pushbuttonsmayhaveglitchnoiseproblem\n"); rINTMSK=~(BIT_GLOBAL|BIT_EINT4567); while(!f_ucWhichInt); //waitingfortheinterrupt f_ucIntNesting=1; //AllowtoNesting. switch(f_ucWhichInt) { case1: uart_printf("EINT4hadbeenoccured...\n"); break; case2: uart_printf("EINT5hadbeenoccured...\n"); break; case4: //SB2flashLED1 uart_printf("EINT6hadbeenoccured...LED1(D1204)on\n");

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论