在调试程序过程中遇到了以下问题: 程序中设置了3个中断,EINT0为快速中断,Timer0和UART1为IRQ中断,程序如下:当屏蔽掉EINT0快速中断[// FIQEnable();]时,UART1中断正常;屏蔽掉IRQ中断[// IRQEnable();]时快速中断EINT0也正常;但是中断都打开时,即按照如下的程序全速运行时,程序会停止在Startup.s中的 ;取指令中止 PrefetchAbort B PrefetchAbort 单步运行程序到main函数的 VICIntEnable=(1<<4)| (1<<7)| (1<<EINT0); 处就走不下去了,按停止运行,同样停在Startup.s中的 ;取指令中止 PrefetchAbort B PrefetchAbort
不知道是何原因,一般出现取指令中止的原因有那些呢,我个人怀疑是中断没用好,挺大家指教,谢谢!
int main(void) { /*定时器寄存器设置*/ T0PR=99; //设置分频系数 T0CCR=(0<<0)| (0<<1)| (0<<2)| (1<<3)| //设置CAP0.1为上升沿捕获 (1<<5)| //允许产生中断 (1<<6)| //设置CAP0.2为上升沿捕获 (1<<8); //允许产生中断 T0CTCR=(0x03<<0)| //计数器在CAP的上升和下降沿递增 (0x00<<2); //选择CAP0.0 T0TC=0; T0TCR=0x01; //启动定时器 /*串口寄存器设置*/ UART1_Init(115200, set); // 串口初始化 U1FCR = 0x01; // 使能FIFO,并设置触发点为8字节 U1IER = 0x01;
PINSEL0=(PINSEL0&0xFFFFFFC3)|(0x02<<4)|(0x03<<2);//P0.2接捕获0.0, //P0.1为EINT0 PINSEL1=(PINSEL1&0xFC3FFCFF)|(0x0A<<22); EXTMODE=0x01; //设置EINT0为边沿激活 EXTPOLAR=0x01; //上升沿有效 FIQEnable(); IRQEnable(); /*设置Timer0EINT1中断*/ VICIntSelect=0x00004000; //设置除EINT0外的通道为IRQ中断 VICVectCntl0=0x20|0x04; //Timer0分配到IRQslot0 VICVectAddr0=(uint32)IRQ_Timer0; //设置Timer0向量地址 VICVectCntl1 = 0x20 | 0x07;// UART1分配到IRQ slot1 VICVectAddr1 = (uint32)IRQ_UART1;// 设置UART1向量地址
T0IR=0x01; //使能Timer0中断 EXTINT=0x01; //清除EINT0中断标志 VICIntEnable=(1<<4)| (1<<7)| (1<<EINT0); while(1) { if (rcv_new == 1) { rcv_new =0; UART1_SendBuf(); } } return(0): } |