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