外中断的问题

[复制链接]
2058|1
 楼主| h_x_zhong 发表于 2008-5-4 17:53 | 显示全部楼层 |阅读模式
NXP2119&nbsp;ARM&nbsp;有一问题想请高手指点:<br /><br />我的定时器0设为5MS中断一次,外中断0为10MS进来一次.当我断开外中断0,定时器0工作正常,<br /><br />只要接上外中断,定时器0变成了10MS,且是可变的!外中断口是10MS变化一次,而在程序中测试<br /><br />不是这样的,进外中断0相当频繁!!&nbsp;&nbsp;不明白为何?<br /><br />然后我把定时器0功能关掉,只保留外中断0,还是进外中断0相当频繁!!!<br /><br />现附上代码:<br /><br /><br />/********************************************************************************************************<br />**&nbsp;函数名称:&nbsp;IRQ_Time0()<br />**&nbsp;功能描述:&nbsp;定时器0中断服务程序.它作为一个基准时钟源实现5ms的定时.<br />**<br />**&nbsp;输 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;入:&nbsp;无<br />**<br />**&nbsp;输 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;出:&nbsp;无<br />**<br />**&nbsp;全局变量:&nbsp;无<br />**&nbsp;调用模块:&nbsp;无<br />**<br />**&nbsp;作 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;者:&nbsp;<br />**&nbsp;日 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;期:&nbsp;<br />**-------------------------------------------------------------------------------------------------------<br />**&nbsp;修&nbsp;改&nbsp;人:<br />**&nbsp;日 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;期:<br />**-------------------------------------------------------------------------------------------------------<br />********************************************************************************************************/<br />void&nbsp;__irq&nbsp;IRQ_Time0(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(P401_DAT_TST()==0&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;P401_SET();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;测试脚&nbsp;2008.05.04<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P401_CLR();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;测试脚&nbsp;2008.05.04<br />//-------------------------------------------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;T0IR&nbsp;=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除中断标志<br />}<br /><br /><br />/********************************************************************************************************<br />**&nbsp;函数名称:&nbsp;Time0Init()<br />**&nbsp;功能描述:&nbsp;初始化定时器0,定时时间为5ms,并使能中断.<br />**<br />**&nbsp;输 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;入:&nbsp;无<br />**<br />**&nbsp;输 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;出:&nbsp;无<br />**<br />**&nbsp;全局变量:&nbsp;无<br />**&nbsp;调用模块:&nbsp;无<br />**<br />**&nbsp;作 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;者:&nbsp;<br />**&nbsp;日 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;期:&nbsp;<br />**-------------------------------------------------------------------------------------------------------<br />**&nbsp;修&nbsp;改&nbsp;人:<br />**&nbsp;日 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;期:<br />**-------------------------------------------------------------------------------------------------------<br />********************************************************************************************************/<br />void&nbsp;Time0Init(void)<br />{&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;Fcclk&nbsp;=&nbsp;Fosc*4&nbsp;&nbsp;=&nbsp;11.0592MHz*4&nbsp;=&nbsp;44.2368MHz<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;Fpclk&nbsp;=&nbsp;Fcclk/4&nbsp;=&nbsp;44.2368MHz/4&nbsp;=&nbsp;11.0592MHz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />//-------------------------------------------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;T0IR&nbsp;&nbsp;=&nbsp;0xFFFFFFFF;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;T0TC&nbsp;&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;定时器初值设置为0<br />&nbsp;&nbsp;&nbsp;&nbsp;T0PR&nbsp;&nbsp;=&nbsp;00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置定时器0不分频<br />//-------------------------------------------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;T0MR0&nbsp;=&nbsp;(Fpclk/200);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;5ms&nbsp;&nbsp;定时值&nbsp;&nbsp;T0MR0&nbsp;=&nbsp;(Fpclk&nbsp;/&nbsp;OS_TICKS_PER_SEC)<br />//-------------------------------------------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;T0TCR&nbsp;=&nbsp;0x03;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;启动并复位T0TC<br />&nbsp;&nbsp;&nbsp;&nbsp;T0TCR&nbsp;=&nbsp;0x01;<br />//-------------------------------------------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置定时器0中断IRQ&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;|=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;对应位为1则分配为FIQ&nbsp;&nbsp;设置所有通道为IRQ中断<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl4&nbsp;&nbsp;=&nbsp;0x20|4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;定时器0中断通道分配为向量控制器4,&nbsp;00,1,00100&nbsp;(4为定时0中断编号)<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr4&nbsp;&nbsp;=&nbsp;(uint32)IRQ_Time0;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置定时器0中断服务程序地址向量<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;|=&nbsp;(1&lt&lt4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能定时器0中断.写入1使能中断请求或软件中断&nbsp;&nbsp;读出1表示FIQ或IRQ<br />//-------------------------------------------------------------------------------------------------------<br />}<br /><br /><br /><br />/********************************************************************************************************<br />**&nbsp;函数名称:&nbsp;Eint0Init()<br />**&nbsp;功能描述:&nbsp;初始外部中断0,并使能IRQ中断.&nbsp;把相应的引脚设为外部中断功能时,引<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;脚为输入模式,由于内部没上拉电阻,所以要上拉一个电阻,确保不会悬空.<br />**&nbsp;输 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;入:&nbsp;无<br />**<br />**&nbsp;输 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;出:&nbsp;无<br />**<br />**&nbsp;全局变量:&nbsp;无<br />**&nbsp;调用模块:&nbsp;无<br />**<br />**&nbsp;作 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;者:<br />**&nbsp;日 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;期:<br />**-------------------------------------------------------------------------------------------------------<br />**&nbsp;修&nbsp;改&nbsp;人:<br />**&nbsp;日 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;期:<br />**-------------------------------------------------------------------------------------------------------<br />********************************************************************************************************/<br />void&nbsp;Eint0Init(void)<br />{<br />//-------------------------------------------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL1&nbsp;|=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置I/O连接到&nbsp;Eint0&nbsp;&nbsp;&nbsp;&nbsp;P0.16<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;EXTMODE&nbsp;&nbsp;=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置Eint0中断为边沿触发模式<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTPOLAR&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置Eint0中断下降沿触发模式<br />//-------------------------------------------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置外部中断0&nbsp;IRQ&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;|=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;对应位为1则分配为FIQ&nbsp;&nbsp;设置所有通道为IRQ中断<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl2&nbsp;&nbsp;=&nbsp;0x20|14;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Eint0中断通道分配为向量控制器3,&nbsp;00,1,01110&nbsp;(14为外部中断0编号)<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr2&nbsp;&nbsp;=&nbsp;(uint32)IRQ_Eint0;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置外部中断0服务程序地址向量<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTINT&nbsp;=&nbsp;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;清除Eint0中断标志<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;|=&nbsp;(1&lt&lt14);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能外部中断0.写入1使能中断请求或软件中断&nbsp;&nbsp;读出1表示FIQ或IRQ<br />//-------------------------------------------------------------------------------------------------------<br />}<br />/////////////////////////////////////////////////////////////////////////////////////////////////////////<br />/*$PAGE*/ <br />/********************************************************************************************************<br />*&nbsp;函数介绍:以下中断程式处理部分&nbsp;&nbsp;&nbsp;&nbsp;包括了外部中断0&nbsp;&nbsp;&nbsp;&nbsp;定时器中断1<br />*&nbsp;输入参数:无<br />*&nbsp;返&nbsp;回&nbsp;值:无<br />*&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;&nbsp;&nbsp;改:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;日期:<br />*********************************************************************************************************/<br />//交流电的50Hz经过整流桥堆(二极管整流)产生100Hz中断&nbsp;10ms<br /><br />void&nbsp;__irq&nbsp;IRQ_Eint0(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;i;<br />//-------------------------------------------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;if(P403_DAT_TST()==0&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;P403_SET();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;测试脚&nbsp;2008.05.04<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P403_CLR();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;测试脚&nbsp;2008.05.04<br />//-------------------------------------------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTINT&nbsp;=&nbsp;0x01;&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;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;通知VIC中断处理结束<br />//-------------------------------------------------------------------------------------------------------<br />}
 楼主| h_x_zhong 发表于 2008-5-5 16:51 | 显示全部楼层

如此角法!!

<br />按下以下的方法搞定:<br /><br />1:&nbsp;&nbsp;PINSEL1&nbsp;|=&nbsp;0x00000001;&nbsp;&nbsp;&nbsp;//&nbsp;设置I/O连接到&nbsp;Eint0&nbsp;&nbsp;&nbsp;&nbsp;P0.16<br />2:&nbsp;&nbsp;是否端口坏了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

57

帖子

1

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