这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 为什么ADuC7060运行的时候始终处于中断函数irqarmvoidIRQHan

共2条 1/1 1 跳转至

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

工程师
2024-01-16 18:55:41     打赏

因为项目要通过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;
}




关键词: ADuC7060     Handler    

助工
2024-01-16 18:56:22     打赏
2楼

判断接收中断
    {
        // 接收中断处理逻辑
    }

    if ((IRQSTATUS & BIT12) == BIT12)  // UART interrupt source
    {
        if ((ucCOMIID0 & 0x2) == 0x2)   // 判断是否是发送中断
        {
            // 发送中断处理逻辑
        }
    }

    IRQSTA = IRQSTATUS;  // 清除中断标志位

}

根据代码来看,ADuC7060处于中断函数__irq __arm void IRQ_Handler(void)里面是因为串口相关的中断发生时会进入该中断处理函数进行相应的处理逻辑。
在运行过程中,如果接收到UART的数据,则会执行接收中断处理逻辑。如果在发送数据时,发送缓冲区为空,则会产生发送中断,执行相应的发送中断处理逻辑。
中断处理函数的设计是为了在接收和发送数据时能够即时地处理相应的中断事件,确保数据的可靠传输。 


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]