我知道,当使用 MSP430F2619 和 TI 的 CCSv4 时,我可以获得多个中断来使用相同的中断处理程序,其代码如下所示:

#pragma vector=TIMERA1_VECTOR
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void){

ServiceWatchdogTimer();
}

我的问题是,当我发现自己处于该中断中时,有没有办法找出这些中断中的哪一个让我来到这里?

有帮助吗?

解决方案

在一般回答你的问题是不存在的检测,目前正在称为其中断没有直接的方法。然而,每个中断都有自己的中断标志,所以你可以在中断检查每个标志。你应该和与该标志启用,以确保您正在处理中断,实际上被调用。另外随着对MSP430的定时器有载体TAIV它可以告诉你在A1处理程序处理。在TAIV的情况下,0是有是为A1的处理程序没有中断所以这种情况下,您可以假定它是A0处理程序。

我会做一些像下面这样。

#pragma vector=TIMERA0_VECTOR
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A (void)
{
   switch (TAIV)         // Efficient switch-implementation
   {
     case  TAIV_NONE:          // TACCR0             TIMERA0_VECTOR
        break;
     case  TAIV_TACCR1:        // TACCR1             TIMERA1_VECTOR
        break;
     case  TAIV_TACCR2:        // TACCR2             TIMERA1_VECTOR
        break;
     case TBIV_TBIFG:          // Timer_A3 overflow  TIMERA1_VECTOR
        break;
     default;
        break;
   }
   ServiceWatchdogTimer();
}

其他提示

不是一个真正的“好”的答案,但为什么不把2个独立的中断处理程序调用同一个函数?

__interrupt void Timer_A0_handler (void){
  Timer_Handler(0);
}
__interrupt void Timer_A1_handler (void){
  Timer_Handler(1);
}
void Timer_Handler(int which){
  if(which==1){
    ...
  }else{
    ...
  }
  ...
  ServiceWatchdogTimer();
}

看着 MSP430x1xx 系列用户指南, ,看起来设备没有直接维护带有该信息的中断状态寄存器。您要么需要两个独立的中断向量,以便可以直接识别差异,要么需要查询两个设备以查看哪个设备需要服务。

如果您使用 2 个中断向量,它们当然可以调用或跳转(如果您使用汇编)到同一个例程来执行大部分工作,如 Earlz给出的答案.

请注意,芯片已经有一个中断向量表,因此要执行您在另一个答案中所做的评论中所说的内容,您只需将“未使用”中断的中断向量条目指向引发异常的例程一个错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top