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