嵌入式系统实践实验报告--中断实验.docx
计算机科学技术系上机实践报告课程名称:嵌入式系统实践年级:上机实践成绩:指导教师:姓名:创新实践成绩:上机实践名称:中断实验学号:上机实践日期:上机实践编号:No.5组号:上机实践时间:一实验目的1. 通过实验掌握ARM处理器的中断方式和中断处理;2. 熟悉S3C44B0X中断控制寄存器的使用;3. 了解不同中断触发方式对中断产生的影响;4. 理解S3C44B0X处理器的中断响应过程;5. 熟练掌握如何进行ARM处理器中断处理的软件编程方法。二、实验设备1. 硬件:EmbestEDUKIT-111(实验平台)PC机2. 软件:EmbestIDEProARM集成开发环境GNUAssembler汇编语言三、实验内容编写中断处理程序,实现:由UARTo选择输入使用不同的中断触发方式,使能外部中断Eint4,5,6,7;在不同的中断触发方式下,使用按钮SB1202触发ElNT6,同时点亮LED1204段时间后熄灭;在不同的中断触发方式下,使用按钮SB1203触发ElNT7,同时点亮LEDl205一段时间后熄灭。文档中按钮标号、LED标号均采用实验硬件平台上标号的简写形式:按钮:SB1202->SB2SB1203->SB31.ED:D1204->LEDlD1205->LED2用C语言实现中断程序,要求:-不再选择使用什么触发方式(EXTIyr),而是全部使用下降沿触发-从超级终端输入n=l-9,使得:»当按下按钮SB1202时,LED的D1204闪烁n下»当按下按钮SB1203时,LED的D1205闪烁n下»其中,闪烁是指点亮1秒,延时1秒,然后再熄灭,再延时1秒»假设:delay(10000)为延时1秒四、实验原理1、ARM处理器中断S3C44B0X的中断控制器可以接受来自30个中断源的中断请求。这些中断源来自DMA、UARTsSIO等这样的芯片内部外围或芯片外部引脚。在这些中断源中,有4个外部中断(EINT*7)是逻辑或的关系,它们共用一条中断请求线。UARTO和UARTI的错误中断也是逻辑或的关系。中断控制器的任务是在片内外围和外部中断源组成的多重中断发生时,选择其中一个中断通过FIQ或IRQ向ARM7TDMI内核发出中断请求。实际上最初ARM7TDMI内核只有FlQ(快速中断请求)和IRQ(通用中断请求)两种中断,其它中断都是各个芯片厂家在设计芯片时定义的,这些中断根据中断的优先级高低来进行处理。例如,如果你定义所有的中断源为IRQ中断(通过中断模式寄存器设置),并且同时有10个中断发出请求,这时可以通过读中断优先级寄存器来确定哪一个中断将被优先执行。一般的中断模式在进入所需的服务程序前需要很长的中断反应时间,为了解决这个问题,S3C44B0X提供了一种新的中断模式叫做向量中断模式,它具有ClSC结构微控制器的特征,能够降低中断反应时间。换句话说S3C44B0X的中断控制器硬件本身直接提供了对向量中断服务的支持。当多重中断源请求中断时,硬件优先级逻辑会判断哪一个中断将被执行,同时,硬件逻辑自动执行由0X18(或OXIC)地址到各个中断源向量地址的跳转指令,然后再由中断源向量进入到相应的中断处理程序。和原来的软件实现的方式相比,这种方法可以显著地减少中断反应时间。2 .中断控制 程序状态寄存器的F位和I位如果CPSR程序状态寄存器的F位被设置为1,那么CPU将不接受来自中断控制器的FIQ(快速中断请求),如果CPSR程序状态寄存器的I位被设置为1,那么CPU将不接受来自中断控制器的IRQ(中断请求)。因此,为了使能FlQ和IRQ,必须先将CPSR程序状态寄存器的F位和I位清零,并且中断屏蔽寄存器INTMSK中相应的位也要清零。 中断模式(INTMoD)ARM7TDMI提供了2种中断模式,FIQ模式和IRQ模式。所有的中断源在中断请求时都要确定使用哪一种中断模式。 中断挂起寄存器(INTPND)用于指示对应的中断是否被激活。如果挂起位被设置为1,那么无论标志I或标志F是否被清零,都会执行相应的中断服务程序。中断挂起寄存器为只读寄存器,所以在中断服务程序中必须加入对LISPC和FJSPC写1的操作来清除挂起条件。 中断屏蔽寄存器(INTMSK)当INTMSK寄存器的屏蔽位为1时,对应的中断被禁止;当INTMSK寄存器的屏蔽位为0时,则对应的中断正常执行。如果一个中断的屏蔽位为1,在该中断发出请求时挂起位还是会被设置为1。如果中断屏蔽寄存器的global位设置为1,那么中断挂起位在中断请求时还会被设置,但所有的中断请求都不被受理。3 .S3C44B0X中断源在30个中断源中,有26个中断源提供给中断控制器,其中4个外部中断(EINT4/5/6/7)通过“或”的形式提供一个中断源送至中断控制器,2个URAT错误中断(UERRoRo/1)也是如此。表4-14S3C44B0X的中断源SourcesDescriptionsMasterGroupSlaveIDEINTOExternalinterrupt0mGASGAEINT1Externalinterrupt1mGASGBEINT2Externalinterrupt2mGASGCEINT3Externalinterrupt3mGASGDElNT46/7Externalinterrupt4/5/6/7mGASGKATICKRTCTimetickinterrupt'.'SGKBINTZDMACGeneralDMAOinterruptIll'、,;:INTZDMA1GeneralDMA1interruptmGBsGBINTBDMAOBridgeDMAOinterrupt'.SGCINTBDMA1BridgeDMA1InterruptmGBSGDINT_WDTWatch-DogtimerinterruptmGBSGKAINTERR(V1UARTQderrorInterruptmGB-4:I'INTTIMEROTimeK)InterruptmGCINT_TIMER1Timedinterrupt'.'、,INTTIMER2Time2hterruptmGCsGCINLTlMER3TimrInterruptmGCsGDINTTIMER4Timer4interruptmGCSGKAINTTIMER5Timer5IntemjptIII''SGKBINT_URXD0UARTOreceiveinterruptm4)、,INTRXD1UART1receiveinterrupt.'BINTJICIICinterruptmSGCINTSIOSKDinterruptmGDsGDINTUTXDOUARTOtransmitinterruptmSGKAINTUTXD1UART1transmitinterruptmGDSGKBINTRTCRTCalarminterruptmGKA一INTADCADCEOCintermptmGKB-4 .向量中断模式(仅针对IRQ)S3C44B0X含有向量中断模式,可以减少中断的反应时间。通常情况下ARM7TDMI内核收到中断控制器的IRQ中断请求,ARM7TDMI会在OXOOoOo018地址处执行一条指令。但是在向量中断模式下,当arm7tdmi从OXooooo018地址处取指令的时候,中断控制器会在数据总线上加载分支指令,这些分支指令使程序计数器能够对应到每一个中断源的向量地址。这些跳转到每一个中断源向量地址的分支指令可以由中断控制器产生。例如,假设ElNTO是IRQ中断,如表4-15所示,EINTO的向量地址为0X20,所以中断控制器必须产生从0X18到0X20的分支指令。因此,中断控制器产生的机器码为OXeaOOoOoo.在各个中断源对应的中断向量地址中,存放着跳转到相应中断服务程序的程序代码,在相应向量地址处分支指令的机器代码是这样计算的:向量中断模式的指令机器代码=OXeaOOOOoO+(<目标地址>Y向量地址>-0×8)>>2)例如,如果TimerO中断采用向量中断模式,则跳转到对应中断服务程序的分支指令应该存放在向量地址OXOOoOO060处。中断服务程序的起始地址在OXlOOo0,下面就是计算出来放在0x60处的机器代码:machinecode0x00000060:0xea000000+(0xl0000-0x60-0x8)>>2)=0×ea000000+0×3fe6=0×ea003fe6通常机器代码都是反汇编后自动产生的,因此不必真正象上面这样去计算。表4-15中断源的向量地址InterruptSourcesVectorAddressEINTO0x00000020EINT10x00000024EINT20x00000028EINT30x0000002cEINT45670x00000030INTTICK0x00000034INTZDMAC0x00000040INT_ZDMA1MoOoOo044INTBDMAO0x00000048INT_BDMA10x0000004cINTWDT0x00000050INTUERRO/10x00000054INTTIMERO0x00000060INTTIMER10x00000064INTJlMER20x00000068INTTIMER30x0000006cINT_TIMER40x00000070INTTIMERS0x00000074INTURXDO0x00000080INT一URXDl0x00000084INTIIC0x00000088INLSIO0x0000008cINTUTXDO0x00000090INTUTXD10x00000094INTRTCOxOOOOOOaOINTADCOxOOOOcO向量中断模式的程序举例在向量中断模式下,当中断请求产生时,程序会自动进入相应的中断源向量地址,因此,在中断源向量地址处必须有一条分支指令使程序进入到相应的中断服务程序,如下:ENTRY:bResetHandIer*fordebug*/bHandlerllndef*handlerllndef*/bHandIerSWISWIinterrupthandler*/bHandIerPabort*handlerPAbort*/bHandIerDabort*handlerDAbort*/b.handlerReserved*/Idrpc,=HandIerIRQbHandIerFIQVECT0R_BRANCH:Idrpc,=HandIerEINTO*mGA0x20H/Winterruptvectortable*/Idrpc,=HandIerEINTI7Idrpc,=HandlerEINT2*/Idrpc,=HandIerEINTS*7Idrpc,=HandlerEINT4567*/Idrpc,=HandIerTICK*mGA0x34*/b.b.Idrpc,=HandIerZDMAO*mGB0x40*/Idrpc,=HandIerZDMAI*/Idrpc,=HandIerBDMAO*7Idrpc,=HandIerBDMAI*/Idrpc,=HandIerWDT*/Idrpc,=HandlerlIERROI*mGB0x54*/b.b.Idrpc,=HandIerTIMERO*mGC0x607Idrpc,=HandIerTIMERI*/Idrpc,=HandlerTIMER2*7Idrpc,=HandIerTIMERS*/Idrpc,=HandlerTIMER4*7Idrpc,=HandlerTIMER5*mGC0x747b.b.Idrpc,=HandIerURXDO*mGD0x80*/Idrpc,=HandIerlIRXDI*/Idrpc,=HandIerIIC*/Idrpc,=HandIerSIO*/Idrpc,=HandIerUTXDO*/Idrpc,=HandIerUTXDI*mGD0x94*/b.b.Idrpc,=HandIerRTC*mGKAOxaO7b.*7b.*/b.*7b.*/b.*mGKA0xb47b.b.Idrpc,=HandlerADC*mGKBOxcO*/5 .中断控制专用寄存器中断控制寄存器(INTCON)RegisterAddressR,WDescriptionResetValueINTCON)x01EOOOOOR/WInterruptntlRegister0x7INTCONBitDescriptioninitialstateReserved30UV2Thisbitdisables/fenablesvectormodeforIRQ0=Vectoredinterruptmode1=Non-vectoredinterruptmode1IHlThisbitenablesIRQinterruptrequestlinetoCPU0=IRQinterruptenable1=ReservedNote:BeforeusingtheIRQinterruptthisbitmustbecleared.1F0ThisbitenablesFKinterruptrequestlinetoCPU0=FIQinterruptenable(Notallowedvectoredinterruptrrode)1=ReservedNote:BeforeusingtheFIQinterruptthisbitmustbecleared.1注意:FlQ模式不支持向量中断模式。从表中可以看出,INTCoN寄存器中位0-为FlQ中断使能位,写入0就使能FlQ中断;位1-为IRQ中断使能位,写入0就使能IRQ中断;位2-是选择IRQ中断为向量中断模式(V=O)还是普通模式(V=1)。 中断挂起寄存器(INTPND)中断挂起寄存器INTPND共有26位,每一位对应着个中断源,当中断请求产生时,相应的位会被设置为1。该寄存器为只读寄存器,所以在中断服务程序中必须加入对USPC和FJSPC写1的操作来清除挂起条件。如果有几个中断源同时发出中断请求,那么不管它们有没有被屏蔽,它们相应的挂起位都会置L只是优先级寄存器会根据它们的优先级高低来响应当前优先级最高的中断。RegisterAddressR/WDescriptionResetValueINTPND0x01E00004RIndicatestheinterruptrequeststatus.0=Theinterrupthasnotbeenrequested1=Theinterruptsourcehasassertedtheinterruptrequest0x0000000 中断模式寄存器(INTMoD)中断模式寄存器INTMoD共有26位,每一位对应着一个中断源,当中断源的模式位设置为1时,对应的中断会由ARM7TDMI内核以FlQ模式来处理。相反的,当模式位设置为0时,中断会以IRQ模式来处理。RegisterAddressR/WDescriptionResetValueINTMODOxO1EOO8R/WInterruptmodeRegisterO=IRQmode1=FIQmode0x0000000 中断屏蔽寄存器(INTMSK)在中断屏蔽寄存器INTMSK中,除了全屏蔽位“globalmask”外,其余的26位都分别对应一个中断源。当屏蔽位为1时,对应的中断被屏蔽;当屏蔽位为0时,该中断可以正常使用。如果全屏蔽位“globalmask”被设置为1,则所有的中断都不执行。如果使用了向量中断模式,在中断服务程序中改变了中断屏蔽寄存器INTMSK的值,这时并不能屏蔽相应的中断过程,因为该中断在中断屏蔽寄存器之前已经被中断挂起寄存器INTPND锁定了。要解决这个问题,就必须在改变中断屏蔽寄存器后再清除相应的挂起位(NTPND)oRegisterAddressR/WDescriptionResetValueINTMSK0x01EOOOOCR/WDetermineswhichinterruptsourceismasked.Themaskedinterruptsourcewillnotbeserviced.0=InterruptserviceIsavailable1=InterruptserviceismaskedOxOZffffff IRQ向量模式相关寄存器RegisterAddressR/WDescriptionResetValueLPSLV0×01E00010R/WIRQpriorityofslaveregisterJx1b1b1b1bIPMST0×01E00014R/WIRQpriorityofmasterregisterOxOOOOIfIbLCSLV0×01E00018RCurrentIRQpriorityofslaveregister)×1b1b1b1bICMST0×01E0001CRCurrentIRQpriorityofmasterregisterOOOOxxIbIJSPR0×01E00020RIRQinterruptservicependingregister(OnlyoneSerVlCebitcanbeset)0x00000000IISPCOx01E00024WIRQinterruptserviceclearregister(Whatevertobeset.INTPNDwillbedearedautomatically)Undef.S3C44B0X中的优先级产生模块包含5个单元,1个主单元和4个从单元。每个从优先级产生单元管理6个中断源。主优先级产生单元管理4个从单元和2个中断源。每一个从单元有4个可编程优先级中断源(SGn)和2个固定优先级中断源(kn)。这4个中断源的优先级是由LPSLV寄存器决定的。另外2个固定优先级中断源在6个中断源中的优先级最低。主单元可以通过LPMST寄存器来决定4个从单元和2个中断源的优先级。这2个中断源INT_RTC和INT,ADC在26个中断源中的优先级最低。如果几个中断源同时发出中断请求,这时USPR寄存器可以显示当前具有最高优先级的中断源。 IRQ/FIQ中断挂起清零寄存器(ISPC/FSPC)通过对USPC/FJSPC相应的位写1来清除中断挂起位(INTPND)ORegisterAddressR/WDescriptionResetValueIISPC0x0100024WIRQinterruptservipendingdearregisterUndef.F_ISPCOxO1EO0O3CWFIQinterruptservicependingclearregisterUndef.6.电路原理如图4-5中断实验电路所示,本实验选择的是外部中断EXINT6和EXINT7o中断的产生分别来至按钮SB2和SB3,当按钮按下时,EXINT6或EXINT7和地连接,输入低电平,从而向CPU发出中断请求。当CPU受理中断后,进入相应的中断服务程序,实现LEDl或LED2的显示功能。从前面介绍的中断源部分我们了解到,EXINT6和EXINT7是共用一个中断控制器,所以在同一时间CPU只能受理其中一个中断,也就是说,当钮SB2按下进入中断后,再按SB3是没用的,CPU在处理完EXINT6中断前是不会受理来自EXINT7的中断,大家可以在实验中留意一下这个情况。另外8段数码管显示部分电路在这里没有给出,需要的话可以参考4.6节。R1212GPB4GPB5VDD33S3C44B0XEXINT6EXINT7R1213D1204*D1205图4-5中断实验电路五、实验步骤1 .准备实验环境使用Embest仿真器连接目标板,使用EmbeStEdUKit11I实验板附带的串口线,连接实验板上的UARTc)和PC机的串口。2 .串口接收设置在PC机上运行WindOWS自带的超级终端串口通信程序(波特率115200、1位停止位、无校验位、无硬件流控制);或者使用其它串口通信程序。3 .打开实验例程1)拷贝光盘CDlSoftwareEduKit44b0文件夹到EmbeStlDEExamplesSamsung目录下;2)使用EmbeStIDE通过EmbeStJTAG仿真器连接实验板,打开实验例程目录4.3_int_test子目录下的injtest.pjf例程,编译链接工程;3)点击IDE的DebUg菜单,选择RemoteConneCt项或F8键,远程连接目标板;4)点击IDE的DebUg菜单,选择DoWnIOad下载调试代码到目标系统的RAM中;5)打开VieW菜单>DebugWindows>Register寄存器观察窗口(快捷键Alt+5),在寄存器观察窗口下面选择外围寄存器(PeMpheral),将INTERRUPT中断寄存器组展开,重点观察INTPND和LISPR寄存器值的变化,如下图所示:PerI_ISPR)u$PLLCON:0×O0038O21£INTERRUPT-§INTCON:0x00000003;INTPND:O×00O840Oc6INTMOD:0x00000000:INTMSK:0x03fffFFF6I_PSLU:0x1b1b1b1b:I_PMST:OxOOOOIfIb6I_CSLU:0×1b1b1b1b,I_CMST:0x0000381bISPR:O×000O000LlSPC:WriteOnly6F_ISPC:WriteOnlp亩二一DMA二一ZJRegiSterPeripheral图4-6EmbcstIDE外围寄存器窗口6)在工程管理窗口中双击inttest.c就会打开该文件,分别在“UarJprintf("Pressthebuttonsnz,);,以及“if(fJicIntNesting)”设置断点后,点击DebUg菜单GO或F5键运行程序,程序正确运行后,会在超级终端上输出如下信息bootsuccess.ExternalInterruptTestPleaseSelectthetrigger:1 -Fallingtrigger2 -Risingtrigger3 -BothEdgetrigger4 -Lowleveltrigger5 -Highleveltriggeranykeytoexit.7)使用PC机键盘,输入所需设置的中断触发方式后,程序停留在第一个断点处,此时注意观察图4-6中中断控制寄存器的值,即中断配置情况;8)再次点击DebUg菜单Go或F5键运行程序,并等待按下按钮产生中断;当按下SB2或SB3后,程序停留到中断服务程序入口的断点,再次观察图4-6中中断控制寄存器的值,双击INTPND和ISPR可以打开寄存器窗口,注意观察21位值在程序运行前后的变化(提示:中断申请标志位应该被置位);9)点击DebUg菜单下的StePover或FlO键执行程序,注意观察在执行完该函数返回前后,程序状态寄存器的变化(提示:CPSR在返回时恢复中断产生前的值);继续单步执行程序,从中断返回后,程序会判断被按下的按键点亮相应的LED:按下SB2点亮LEDI或按下SB3点亮LED2;10)结合实验内容和实验原理部分,掌握ARM处理器中断操作过程,如中断使能、设置中断触发方式和中断源识别等,重点理解ARM处理器的中断响应及中断处理的过程。4.观察实验结果等待选择输入所需中断方式设置:bootsuccess.ExternalInterruptTestPleaseSelectthetrigger:1 -Fallingtrigger2 -Risingtrigger3 -BothEdgetrigger4 -Lowleveltrigger5 -Highleveltriggeranykeytoexit.在PC机键盘上输入1选择下降沿触发,并按下按钮SB2PressthebuttonspushbuttonsmayhaveglitchnoiseproblemEINT.EINT6hadbeenoccured.LEDl(D1204)on如果重复按下按钮SB2或再按下另一个按钮(在中断响应后到点亮LEDl之间),将会报告当前正在处理第一个按钮产生的中断,并输出信息表示中断嵌套。PressthebuttonspushbuttonsmayhaveglitchnoiseproblemEINT.EINT6hadbeenoccured.LEDl(D1204)onEINT.CucIntNesting=2六、调试过程、结果和分析本次实验过程中首先按照教材示例运行并观察了寄存器的变化,并且采用中断观察中断配置情况,在学习并理解示例程序的基础上按照习题要求进行了编程。首先本习题要求不选择使用什么触发方式,全部使用下降沿触发,则在程序中设置rEXTINT=0x22222222;从而全部采用FaIlingedgemOde。之后用SW计Ch语句,对9个N的值分类,并利用for循环设置当闪灯次数未达到n值时持续闪灯。在调试过程中未出现较大问题,一开始出现了一些小问题例如SWNCh语句下的CaSe中要将n的类型的转换问题,还有就是一开始写的程序在未运行时设置Print的显示句子不够人性化,有的提示语句出现的时机不恰当,在自己反复多次的试验下最终达到了比较通顺的效果。调试过程部分截图如下所示:£ileYicWprojectguildIoolsWindwXaIP|HAarn elf Id T.connonrara ce.ld -L. . . .-Buldxqcc arn elfarw elflb L. . . .-Buldxgcc a -o.debuglnt-test.elf .debug4>l)init.o .debugU¾blib.o .debugint_test.o .dpbugled.o .d .debuguhal.o -Ic -IgccConnand(三)successfullyexecuted.BuildEahesrtIDEPro-DisasseBblyEiIeYieWprojectPUXldDebytoolsWixido*HelP M z4to善刊济介-U电他爆IQ国口网军11L区以Gl口比犀1Int test filesg EmbestTxtI-wJ source*1 inttestc led.c1 main.c口 includeI common inlcude51 44b.h 44blib.h 1 dcf.h ¾ option.h-j common src囱 44binit.s由 44blib.c uhal.c-口 miscsi cv40boot.csVSl->s%c Bjj J .ClZ>:×Address:×00OOOOOO*T*2dA>menwriteU×01D2Un200×a000D0b÷menvritesuccess.>nurite0×01D2001C0×n0009daa2AmOOmenwritesuccess.(WUU(WQ3EAgUU.D.><w>n*N-it?R×1D2O07fl×111111111100000006OOEA4A.J11)cnwitesuccess.UUOO0OO9UU00EAV>ConnectQa-超级终瑞文件9百¢)查看9呼叫©传送(!)帮助Qp口信32臼囹EINT7hadbeenoccured.LED2(D1205)onEINT.f_ucIntNesting=2PleaseEnterthenumbern:n=l-9PressthebuttonspushbuttonsnhaveglitchnoiseproblemEINT.EINT7hadbeenoccured.LED2(D1205)onPleaseEnterthenumbern:n=l-9PressthebuttonspushbuttonsmayhaveglitchnoiseproblemEINT.EINT6hadbeenoccured.LEDl(D1204)onPleaseEnterthenumbern:n=l-9PressthebuttonspushbuttonsnavhaveglitchnoiseproblemEINT.EINT7hadbeenoccured.LED2(D1205)onPleaseEnterthenumbern:n=l-9巳连接014T6自动检恻1152008TfT)WI超级终端七、总结本次实验整体来说完成得比较顺利,尤其是相对于实验四来说,在读懂本次实验的示例程序的基础上完成习题程序的编写难度不大,示例程序实现的功能更多,在按照书本介绍的步骤对示例程序进行分析后做一些修改即可完成实验要求的功能,加上自己反复实践,逐步微调之后,超级终端上的显示也较为人性化。本次实验完成的时间较短,所以留出了更多的时间继续完成难度更大的实验四。八、附件#include"44blib.h"include"44b.hninclude"def.hnvoidinitjnt(void);voidintjest(void);voidint4567Jsr(void);/_attribute<(interrupt("IRQ");unsignedcharLucIntNesting=0;/Interruptnestingcountunsignedcharf_ucWhichlnt=0;/interruptsourcesymbolvoidinitjnt(void)(/interruptsettingsrl_ISPC=0x3ffffff;/clearinterruptpendingregisterrEXTINTPND=Oxf;/clearEXTINTPNDregisterrlNTMOD=0x0;/allforIRQmoderlNTCON=0x5;/noVectoredmode,IRQdisable,FIQdisablerlNTMSK=-(BIT_GLOBAL|BIT_EINT4567);/setEINTinterrupthandlerplSR_EINT4567=(int)int4567Jsr;/ PORT G configurationrPCONG =Oxffff;rPUPG = 0x0;rEXTINT = rEXTINT 0x22220020;rlSPCI= BIT_EINT4567;rEXTINTPND = Oxf;/ EINT7-0/ pull up enable/ EINT4567 falling edge mode/ clear EXTINTPND regvoidintjest(void)unsignedintuSaveG,unSavePG;initjnt();inti,j;charn;rlNTMSK=rlNTMSKBIT_EINT4567;/disableEINT2int/userinterfaceuart_Printf(''PleaseEnterthenumbern:nM,n=1-9n");/savethecurrentsettingsofPortGControlerUnSaveG=rPCONG;UnSavePG=rPUPG;rPCONG=0xf5ff;/EINT7-0rPUPG=0x0;rEXTINT=0x22222222;/Fallingedgemodeswitch(uart-getch()(case':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("Pressthebuttonsn");uart_printf("pushbuttonsmayhaveglitchnoiseproblemn");rlNTMSK=(BIT_GLOBALlBIT_EINT4567)