TI MSP430 中断源
-
26-09-2019 - |
题
我知道,当使用 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给出的答案.
请注意,芯片已经有一个中断向量表,因此要执行您在另一个答案中所做的评论中所说的内容,您只需将“未使用”中断的中断向量条目指向引发异常的例程一个错误。
不隶属于 StackOverflow