[英]TI MSP430 Interrupt source
我知道在使用MSP430F2619和TI的CCSv4時,我可以獲得多個中斷來使用相同的中斷處理程序,其代碼如下所示:
#pragma vector=TIMERA1_VECTOR
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void){
ServiceWatchdogTimer();
}
我的問題是,當我發現自己處於那個中斷時,有沒有辦法弄清楚這些中斷中的哪一個讓我在這里?
你的問題的一般答案是沒有直接的方法來檢測當前正在調用哪個中斷。 但是,每個中斷都有自己的中斷標志,因此您可以檢查中斷中的每個標志。 你應該和帶有enable的標志一起確保你正在處理實際被調用的中斷。 還有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();
}
這不是一個“好”的答案,但為什么不讓兩個獨立的中斷處理程序調用相同的函數?
就像是
__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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.