[ZLG-ARM] 关于ARM中断嵌套的问题

[复制链接]
2799|4
 楼主| postcode 发表于 2009-7-13 13:48 | 显示全部楼层 |阅读模式
ARM的中断管理体系和51系列微控制器的中断管理体系不太一样。熟悉51体系结构的用户需要特别注意这一点。ARM的中断不会自动嵌套,实现ARM微控制器的中断嵌套比较烦琐,我们不提倡中断嵌套。但不排除需要嵌套的应用,因而在启动代码中,有对中断嵌套的处理。模板中的文件IRQ.S用于处理中断嵌套,是以下中断处理方法的依据。用户要根据自己的应用更改此文件,只需要在文件末尾添加中断处理程序的句柄即可。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;中断嵌套的原则:低优先级的中断嵌套高优先级的中断。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可嵌套中断服务程序编写方法:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、保存当前中断使能寄存器VICIntEnable的值;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、禁止当前中断和低优先级中断;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、清除中断逻辑,使VIC能够响应更高优先级的中断;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、中断处理服务程序;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5、恢复保存的中断使能寄存器的值。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;声明需要嵌套的中断服务程序时,不能使用'__irq'关键字,而需要通过句柄的方式进行。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请注意IRQ.S中宏$IRQ_Label&nbsp;HANDLER&nbsp;$IRQ_Exception_Function的用法。<br /><br />例子如下:<br /><br />/********************************************************************************************<br />*&nbsp;文&nbsp;件&nbsp;名:VIC_Nesting.c<br />*&nbsp;功&nbsp;能:本实验演示中断嵌套现象。程序开启了两个中断:定时器0和外部中断0。定时器0使LED8~LED1<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;闪烁,而外部中断0取反蜂鸣器控制口。分配定时器0中断优先级高于外部中断0的优先级。设置<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KEY1连接外部中断0。按住KEY1键后全速运行程序,看LED8~LED1能否闪烁,若闪烁,则说明中<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;断嵌套成功。需要在文件IRQ.S末尾添加句柄:<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Timer0_Handler&nbsp;HANDLER&nbsp;IRQ_Timer0<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Eint0_Handler&nbsp;&nbsp;&nbsp;HANDLER&nbsp;IRQ_Eint0<br />*&nbsp;说&nbsp;明:用跳线帽短接KEY1,BEEP,74HC595_2相关跳线。<br />*<br />*在产生IRQ中断,进入服务程序之前,IRQ中断将自动禁止,而Fiq中断依然使能,故在IRQ中断下依然要响应Fiq中断。<br />*<br />*********************************************************************************************/<br />#include&nbsp;'config.h'<br />#define&nbsp;&nbsp;&nbsp;&nbsp;BEEPCON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((uint32)0x01&lt&lt7)&nbsp;&nbsp;&nbsp;//&nbsp;P0.7引脚控制蜂鸣器,低电平蜂鸣<br />#define&nbsp;&nbsp;&nbsp;&nbsp;BEEP_ON()&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=BEEPCON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;P0.7引脚输出低电平,蜂鸣器蜂鸣<br />#define&nbsp;&nbsp;&nbsp;&nbsp;BEEP_OFF()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=BEEPCON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;P0.7引脚输出高电平,蜂鸣器不蜂鸣<br />#define&nbsp;&nbsp;&nbsp;&nbsp;SPI_CS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((uint32)0x01&lt&lt20)&nbsp;//&nbsp;P1.20引脚模拟SPI的片选信号<br />#define&nbsp;&nbsp;&nbsp;&nbsp;SPI_DATA&nbsp;&nbsp;&nbsp;&nbsp;((uint32)0x01&lt&lt22)&nbsp;//&nbsp;P0.22引脚模拟SPI的数据信号<br />#define&nbsp;&nbsp;&nbsp;&nbsp;SPI_CLK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((uint32)0x01&lt&lt25)&nbsp;//&nbsp;P1.25引脚模拟SPI的时钟信号<br />#define&nbsp;&nbsp;&nbsp;&nbsp;H_SPI_CS()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO1SET=SPI_CS&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPI的片选信号置高&nbsp;<br />#define&nbsp;&nbsp;&nbsp;&nbsp;L_SPI_CS()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO1CLR=SPI_CS&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPI的片选信号置低<br />#define&nbsp;&nbsp;&nbsp;&nbsp;H_SPI_DATA()&nbsp;IO0SET=SPI_DATA&nbsp;//&nbsp;SPI的数据信号置高<br />#define&nbsp;&nbsp;&nbsp;&nbsp;L_SPI_DATA()&nbsp;IO0CLR=SPI_DATA&nbsp;//&nbsp;SPI的数据信号置低<br />#define&nbsp;&nbsp;&nbsp;&nbsp;H_SPI_CLK()&nbsp;IO1SET=SPI_CLK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPI的时钟信号置高<br />#define&nbsp;&nbsp;&nbsp;&nbsp;L_SPI_CLK()&nbsp;IO1CLR=SPI_CLK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPI的时钟信号置低<br />void&nbsp;Timer0_Handler(void);<br />void&nbsp;Eint0_Handler(void);<br />uint8&nbsp;data;<br />/********************************************************************************************<br />*&nbsp;函数名称:SendDataTo74HC595()<br />*&nbsp;功&nbsp;能:向74HC595发送一字节数据<br />*&nbsp;入口参数:data&nbsp;要发送的数据<br />*&nbsp;出口参数:无<br />*&nbsp;注&nbsp;意:发送数据时,高位先发送<br />*********************************************************************************************/<br />void&nbsp;SendDataTo74HC595(uint8&nbsp;data)<br />{<br />&nbsp;&nbsp;&nbsp;uint8&nbsp;i;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;L_SPI_CS();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPI_CS=0<br />&nbsp;&nbsp;&nbsp;for(i=0;i&lt8;i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;发送8位数据(1个字节)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;L_SPI_CLK();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPI_CLK=0<br />&nbsp;&nbsp;&nbsp;/*&nbsp;设置SPI_DATA输出值&nbsp;*/<br />&nbsp;&nbsp;&nbsp;if((data&nbsp;&&nbsp;0x80)!=0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H_SPI_DATA();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPI_DATA=1<br />&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L_SPI_DATA();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPI_DATA=0<br />&nbsp;&nbsp;&nbsp;data&lt&lt=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;将要发送的1字节数据左移一位<br />&nbsp;&nbsp;&nbsp;H_SPI_CLK();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPI_CLK=1<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;H_SPI_CS();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPI_CS=1&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />/********************************************************************************************<br />*&nbsp;函数名称:IRQ_Timer0()<br />*&nbsp;功&nbsp;能:Timer0中断服务函数,LED8~LED1闪烁<br />*&nbsp;入口参数:无<br />*&nbsp;出口参数:无<br />*********************************************************************************************/<br />void&nbsp;IRQ_Timer0(void)<br />{<br />&nbsp;&nbsp;&nbsp;uint32&nbsp;bak;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;bak='VICIntEnable';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;备份当前VICIntEnable的值<br />&nbsp;&nbsp;&nbsp;VICIntEnClr=(1&lt&lt4)|(1&lt&lt14);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;禁止当前优先级中断及低优先级中断<br />&nbsp;&nbsp;&nbsp;VICVectAddr='0x00';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除中断逻辑,以便VIC可以响应更高优先级IRQ中断<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;/*&nbsp;LED8~LED1闪烁&nbsp;*/<br />&nbsp;&nbsp;&nbsp;if(data==0x00)&nbsp;<br />data='0xff';<br />&nbsp;&nbsp;&nbsp;else<br />data='0x00';<br />&nbsp;&nbsp;&nbsp;SendDataTo74HC595(data);<br />&nbsp;&nbsp;&nbsp;T0IR=0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除Timer0中断标志<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICIntEnable='bak';<br />}<br />/********************************************************************************************<br />*&nbsp;函数名称:IRQ_Eint0()<br />*&nbsp;功&nbsp;能:外部中断0中断服务函数,取反蜂鸣器控制口,允许中断嵌套<br />*&nbsp;入口参数:无<br />*&nbsp;出口参数:无<br />*********************************************************************************************/<br />void&nbsp;IRQ_Eint0(void)<br />{<br />&nbsp;&nbsp;&nbsp;uint32&nbsp;bak;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;bak='VICIntEnable';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;备份当前VICIntEnable的值<br />&nbsp;&nbsp;&nbsp;VICIntEnClr='1'&lt&lt14;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;禁止当前中断<br />&nbsp;&nbsp;&nbsp;VICVectAddr='0x00';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除中断逻辑,以便VIC可以响应更高优先级IRQ中断<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;IRQEnable();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能IRQ中断&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;/*&nbsp;取反蜂鸣器控制口&nbsp;*/<br />&nbsp;&nbsp;&nbsp;if((IO0PIN&nbsp;&&nbsp;BEEPCON)==0)<br />BEEP_OFF();<br />&nbsp;&nbsp;&nbsp;else<br />BEEP_ON();<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;等待外部中断信号恢复为高电平,清除EINT0中断标志*/<br />&nbsp;&nbsp;&nbsp;while((EXTINT&nbsp;&&nbsp;0x01)!=0)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXTINT='0x01';<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICIntEnable='bak';<br />}<br /><br />/********************************************************************************************<br />*&nbsp;函数名称:main()<br />*&nbsp;功&nbsp;能:初始化定时器0,设置定时器0中断和外部中断0<br />*********************************************************************************************/<br />int&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;PINSEL0&=~((uint32)0x03&lt&lt14);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;将P0.7引脚选择为GPIO功能<br />&nbsp;&nbsp;&nbsp;IO0DIR|=BEEPCON;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置P0.7为输出<br />&nbsp;&nbsp;&nbsp;BEEP_OFF();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;蜂鸣器禁止蜂鸣<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;PINSEL1&=~((uint32)0x03&lt&lt0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;将P0.16引脚选择为EINT0功能<br />&nbsp;&nbsp;&nbsp;PINSEL1|=0x00000001;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;PINSEL1&=~((uint32)0x03&lt&lt12);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置P0.22引脚为GPIO<br />&nbsp;&nbsp;&nbsp;PINSEL2&=~((uint32)0x01&lt&lt3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置P1.20和P1.25引脚为GPIO<br />&nbsp;&nbsp;&nbsp;IO0DIR|=SPI_DATA;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置P0.22,P1.20,P1.25引脚为输出<br />&nbsp;&nbsp;&nbsp;IO1DIR|=(SPI_CS&nbsp;|&nbsp;SPI_CLK);&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;/*&nbsp;Timer0初始化*/<br />&nbsp;&nbsp;&nbsp;T0TC=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;定时器设置为0&nbsp;<br />&nbsp;&nbsp;&nbsp;T0PR=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;时钟不分频<br />&nbsp;&nbsp;&nbsp;T0MCR=0x03;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置T0MR0匹配后复位T0TC,并产生中断标志<br />&nbsp;&nbsp;&nbsp;T0MR0=Fpclk/10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;0,1秒定时<br />&nbsp;&nbsp;&nbsp;T0TCR=0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;启动定时器<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;IRQEnable();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能IRQ中断<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;data='0x00';<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;/*&nbsp;初始化Timer0、Eint0中断(使用向量IRQ)*/<br />&nbsp;&nbsp;&nbsp;VICIntSelect='0x00000000';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置所有中断分配为IRQ中断<br />&nbsp;&nbsp;&nbsp;VICVectCntl0=0x20&nbsp;|&nbsp;4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;分配Timer0中断到向量中断0<br />&nbsp;&nbsp;&nbsp;VICVectAddr0=(uint32)Timer0_Handler;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置中断服务程序地址<br />&nbsp;&nbsp;&nbsp;VICVectCntl1=0x20&nbsp;|&nbsp;14;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;分配EINT0中断到向量中断1<br />&nbsp;&nbsp;&nbsp;VICVectAddr1=(uint32)Eint0_Handler;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置中断服务程序地址<br />&nbsp;&nbsp;&nbsp;T0IR=0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除Timer0中断标志<br />&nbsp;&nbsp;&nbsp;EXTINT='0x01';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除EINT0中断标志<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;VICIntEnable=(1&lt&lt4)|(1&lt&lt14);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能Timer0、EINT0中断<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;while(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;等待中断&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;return&nbsp;0;&nbsp;<br />}&nbsp;<br /><br />
tmake 发表于 2009-7-15 12:51 | 显示全部楼层

很详细,顶

  
armqt 发表于 2009-7-15 13:01 | 显示全部楼层

很实用的例子

  
chun1chun 发表于 2009-7-17 13:25 | 显示全部楼层

学习了

  
chun1chun 发表于 2009-7-17 13:25 | 显示全部楼层

真的很不错

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

86

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部