打印
[ZLG-ARM]

调试问题求助,怀疑是中断问题

[复制链接]
1126|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
active329|  楼主 | 2007-4-11 20:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在调试程序过程中遇到了以下问题:
程序中设置了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):
}

相关帖子

沙发
zlgARM| | 2007-4-11 22:17 | 只看该作者

active329

     取指中止发生时,查看一下此时的PC。确定是在何处发生取指中止。

使用特权

评论回复
板凳
active329|  楼主 | 2007-4-12 10:18 | 只看该作者

继续

查过了,取指中止发生时的PC为0x400000A0,应该在片内RAM中,不知道什么原因,如何解决,请指教,谢谢

还有,我的程序设定了一个快速中断(EINT0),两个IRQ中断(Timer0和UART1。知道快速中断和Timer0中断不会同时发生,Timer0和UART1中断可能同时发生,要求Timer0中断发生时必须执行Timer0中断程序,完成一定数量的AD采集,要不就会错过采集时间(就是要在Timer0中断中完成AD采集,必须完成),所以将Timer0分配为Slot0,UART1分配为Slot1;快速中断(EINT0)和UART1可能同时发生。所以就将3者设定成一个快速中断(EINT0),两个IRQ中断(Timer0和UART1。不知道这样合理么,还有一个程序中设定3个中断,会乱么,会有问题么?
大家谈谈看法,谢谢了,我还是初学者,好多不懂,请大家多多指教。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

14

帖子

0

粉丝