ADI 技术
直播中

孙雅念

7年用户 546经验值
私信 关注
[问答]

为什么ADuC7060运行的时候始终处于中断函数__irq __arm void IRQ_Handler(void)里面

因为项目要通过485传送数据,所以要用到串口,在调试串口的时候接收用的是中断,发送准备用查询模式。发送的中断用的是下面一段程序:
__irq
__ARM void IRQ_Handler(void)
{
unsigned long IRQSTATUS = 0;
unsigned
char ucCOMIID0 = 0;
IRQSTATUS = IRQSTA;    // Read off IRQSTA
register
ucCOMIID0 = COMIID0;   // Read the UART IRQ ID register
if
((IRQSTATUS & BIT11) == BIT11) //UART interrupt source
{
  if
((ucCOMIID0 & 0x1) == 0x1)   // Receive buffer Full   
  {
   ucRxChar
= COMRX;     // read COMRX register
   RX_falg = 1;    // Set flag to return
a string to the
PC
  }
}
}
现在有一个不明白的问题,就是在调试程序的时候,程序一直在这段中断里面运行,在ucCOMIID0 =
COMIID0;   // Read the UART IRQ ID
register这句设置断点,程序全速运行会一直运行到停在这里,不管PC是否有数据发送过来,我的程序里面只开了串口的中断,但是串口又没有数据发送过来产生中断,所以现在比较迷惑。是否有可能是我的中断用的不对?或者是片子初始化不对?或者是片子在焊接不好的问题导致一直产生错误中断(但是我已经点亮了LED灯,按道理硬件不会有问题啊)?
后来我看了IRQSTA和IRQEN寄存器,发现这两个寄存器timer1(唤醒寄存器)的这意位都置1了,更奇怪的是我在前面的初始化里面已经把这两位Timer1的中断和中断允许都已经清零了。
后来为了证明是Timer1产生的中断,我又在中断里面加了一段语句,代码如下:

__irq
__arm void IRQ_Handler(void)
{
  unsigned long IRQSTATUS =
0;
  unsigned char ucCOMIID0 = 0;
  
  IRQSTATUS = IRQSTA;            
    //read off IRQSTA Register
  ucCOMIID0 = COMIID0;                // Read
the UART IRQ ID register
  
  if((IRQSTATUS&BIT11)==BIT11)      
//UART Interrupt
  {
    if ((ucCOMIID0 & 0x1) == 0x1)  // Receive
buffer Full
    {
      RX_BUF=COMRX;
      //Send_data(RX_BUF);
   
}
  }
  if((IRQSTATUS&BIT4)==BIT4)
  {
    Delay(1);
   
GP0DAT^=(0x10000<<1);
  }
}
这个时候会发生两个情况:首先,编译的时候会报错,在Delay(1)这个函数这里会报:Cannot
call the __thumb function "Delay" from arm
mode。
然后我注释掉这句通过编译后,运行,会出现第二个情况,我在GP0DAT^=(0x10000<<1);这句话设置断点,发现函数会运行到这句话停下来,所以可以证明确实是Timer1产生的中断。但是我前面已经关闭了和Timer1相关的所有中断。
现在我就产生了两个疑问:1、Cannot
call the __thumb function "Delay" from arm
mode。这句话代表了什么?为什么我前面编的函数都处于Thumb模式?而中断却是ARM模式?我应该怎么修改我的程序?
2、为什么我关闭了所有和Timer1相关的中断,这个定时器还是会产生中断?应该怎么样才能关闭这个中断呢?




另外需要明确的一点是:我前面因为要用到外部晶振,所以在初始化的时候有这么一段语句,是从数据手册上摘抄下来的:

void
Init_CLK(void)
{
  T1LD=0x80;            //count number
  T1CON=0xC0;   
        //32768HZ, Enable Timer1 interrupt,count down
  
  IRQEN|=0x10;   
       //Enable Timer1 interrupt
source
  
  PLLKEY1=0xAA;
  PLLCON=0x2;           //switch to external
crystal
  PLLKEY2=0x55;
  
  POWKEY1=0x1;
  POWCON0=0x73;         
//Enter nap
mode
  POWKEY2=0xF4;
}

麻烦ADI的工程师了!!!!
谢谢你们!!!
附件

回帖(1)

张虎豹

2018-11-21 09:42:55
您好,
 
关于中断优先级,中断服务程序的入口只能有一个,优先级是可以通过IRQPx来设置,参见table69~71;
 
关于模式切换的问题,我会向产品线去咨询。
举报

更多回帖

×
20
完善资料,
赚取积分