我用KEIL 3。03A 做软仿,程序可以进入所有的中断,但是一旦下载LPC2148内部的时候,就不能够进入中断。<br /> 可以确定目标板没有问题,我换了多块。用ULINK 调试,也是进入不了。<br /> 拜托帮忙!谢谢!<br /><br /> 如下是程序部分的描述,有些程序是比较长,我把用一个函数代替,有些用空函数代替。那些代码都与硬件没有关系。<br /> 做软仿,非常容易进入定时中断,下载后,没有(可看到有个测试灯在定时任务中),用是示波器测试也没有波形。<br /> 郁闷中!<br /> void Timer1Handler (void) __irq //定时器1中断<br /> {<br /> //T1IR=0xff;//清除中断<br /> T1IR=1;<br /> Timer1Pro(); <br /> VICVectAddr = 0; /* Acknowledge Interrupt */<br /> }<br /><br /> // 这部分程序还没有完善<br />void UartHandler (void ) __irq //UartHandler: //串口中断 <br /> {<br />// IENABLE; /* handles nested interrupt */ <br /> UartPro(); <br /> VICVectAddr = 0; /* Acknowledge Interrupt */<br /> }<br /><br />void USTrigInHandler (void) __irq //超声输入中断<br />{ <br /> EXTINT=0X2; /* clear EINT1 flag */ //如果使用<br /> USTrigPro(); <br /> VICVectAddr = 0; /* Acknowledge Interrupt */<br />}<br /><br /><br />unsigned int PwmOutFreshData[10];<br /><br />void PWM0Handler (void) __irq <br /> {<br /> PWMIR=PWMIR|0X04; //清除中断寄存器 pwm2通道<br /> PWM0Pro();<br /> VICVectAddr = 0; /* Acknowledge Interrupt */<br /> }<br /><br />void IRHandler (void) __irq //红外输入中断<br />{ <br /> EXTINT=0X1; /* clear EINT0 flag */<br /> IRPro(); <br /> VICVectAddr = 0; /* Acknowledge Interrupt */<br />}<br /><br />//***************************Tasks********************************************<br />void Timer0Handler (void) __irq <br /> { <br /> T0IR = 1; /* clear interrupt flag */<br /> T0MR0=cInterVal_100uS;<br /> T0MCR=0x03;//T0和MR0匹配时候产生中断,<br /> T0IR=0;//清除中断<br /> T0TCR= 0x01;// 定时器控制寄存器。 T0CTCR=0;<br /> <br /> switch(++Cnt_Task)<br /> { <br /> case 1: //硬件驱动<br /> {<br /> IOCLR0=1<<TestLed;<br /><br /> //喂狗程序<br /> WDMOD=0x03;//WDMOD=0x00;//0x03 ; WDTC=cWatchDog_10mS;<br /> WDFEED=0xaa;<br /> WDFEED=0x55;<br /> }break;<br /><br /> case 2://软件定时器处理<br /> {<br /> //软件定时器处理 <br /> }break;<br /> <br /> case 3: //计算<br /> {<br /> }break;<br /> <br /> case 4://输出控制<br /> {<br /> IOSET0=1<<TestLed;<br /> }break;<br /><br /> case 5: //显示控制<br /> {<br /> <br /> }break;<br /> case 6: <br /> { <br /> }break;<br /><br /> case 7: { <br /> <br /> }break;<br /> case 8:<br /> {<br /> Cnt_Task=0; <br /> }break;<br /> }<br /> VICVectAddr = 0; /* Acknowledge Interrupt */<br /> }<br /><br /><br /><br />//***************************fuctions define**************************************<br /><br />void OSCInit(void) //初始化OSC PLL<br /> {<br /> }<br />void InitTimer0(void)//初始化T0<br /> {<br /> //用匹配寄存器产生中断<br /> T0IR=1;//清除中断<br /> T0TCR= 0x03;// 定时器控制寄存器。使能定时器/计数器 <br /> T0PR=0; //预分频率为<br /> T0MR0=cInterVal_100uS;<br /> T0MCR=0x03;//T0和MR0匹配时候产生中断,同时复位T0<br /> T0CTCR=0;<br /> //T0TC内部的计数值。<br /> T0TCR= 0x01;// 定时器开始运行<br /><br /> }<br />void InitAD(void)//初始化AD转换器<br /> {<br /> AD0CR=0x1207702<br /> AD0INTEN=0x0;<br /> }<br />void InitUart0(void<br /> {<br /> U0LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */<br /> U0DLM = ( 22118400 / 16 ) / 9600 / 256; <br /> U0DLL =( 22118400 / 16 ) / 9600 % 256; <br /> U0LCR = 0x03; /* DLAB = 0 */<br /> }<br /><br />void VICInit(void)<br /> {<br /> VICIntEnable=0x1c170;//0x00000010;//全部需要使能<br /> VICIntSelect=0x00000000; //全部选择为IRQ<br /><br /> VICVectCntl0=0X00000025;// 定时器T1中断<br /> VICVectCntl1=0X0000002F;// <br /> VICVectCntl2=0X00000028;//PWM中断<br /> VICVectCntl3=0X0000002E;//红外中断 使用EINT0输入<br /> VICVectCntl4=0X00000026;//串口中断<br /> VICVectCntl5=0X00000024;//定时器T0<br /><br /> VICVectAddr=0;<br /><br /> VICVectAddr0=(unsigned)Timer1Handler;<br /> VICVectAddr1=(unsigned)USTrigInHandler;<br /> VICVectAddr2=(unsigned)PWM0Handler;<br /> VICVectAddr3=(unsigned)IRHandler;<br /> VICVectAddr4=(unsigned)UartHandler;<br /> VICVectAddr5=(unsigned)Timer0Handler;<br /><br /> }<br /><br /> <br />void PinInit(void)//设置引脚<br /> {<br /> PINSEL0=0x800080c5;<br /> PINSEL1=0x05400001 <br /> PINSEL2=0X00000004;<br /> SCS=0x02; //P1使用高速控制,P0使用低速控制<br /> IODIR0 =0xc07e1f74 <br /> //port initialized<br /> FIO1DIR2=0xFF;//定义P1.16~P1.23为输出<br /> }<br /> <br />void EintInit(void)<br /> {<br /> EXTINT=0x00;<br /> INTWAKE=0;<br /> EXTMODE=0x07;<br /> EXTPOLAR=0x07;<br /> }<br /><br />void PWMInit(void)//使用PWM2输出<br /> {<br /> PWMIR=0x70f; //清除所有的PWM中断寄存器<br /> PWMMR2=cPwmPeroid/2;//匹配寄存器赋值<br /> PWMMR0=cPwmPeroid; //PMW周期<br /> PWMLER=0x05;//允许最后写入PWM 匹配0 ,匹配2<br /> PWMPCR=0x0400;//使能PWM2 输出,PWM2选择单边沿控制模式。<br /> PWMTCR=0x09; //pwm使能<br /> PWMMCR=0X00000003; //MR0匹配的时候同步复位 开启中断<br /> PWMPC=(26-1);//预分频系数为(26/20*25000=32500us) <br /> }<br /><br /><br />void CopyFlashDatatoRam(void)<br /> {<br /> }<br />void MoveBmpTempData(void)<br /> {<br /> int32 i;<br /> for (i=0;i<122;i++)<br /> {<br /> LcdRamH=*pBmpDataH;<br /> LcdRamL=*pBmpDataL;<br /> pBmpDataH++;<br /> pBmpDataL++;<br /> }<br /> }<br /><br /><br />void IAPPro(void)<br /> {<br /> }<br />void InitParaData(void)<br /> {<br /> **TimerEn=1;<br /> }<br /><br /> int main(void)<br /> {<br /> PinInit();//设置引脚定义,方向<br /> OSCInit(); //初始化OSC PLL<br /> InitTimer0();//初始化T0<br /> InitAD();//初始化AD转换器<br /> InitUart0();//初始化串口0<br /> EintInit();//红外接受器输入<br /> PWMInit();//使用PWM2输出<br /> VICInit();//初始化中断系统<br /> InitParaData();<br />__asm{MSR CPSR_c, #0x5f } <br /> CopyFlashDatatoRam();<br /> for(;;)<br /> {<br /> IAPPro();//IAPSaveEn做完毕后应该清除<br /><br /> }<br /><br /> } <br /> |
|