TI MSP430 割り込みソース
-
26-09-2019 - |
質問
MSP430F2619 と TI の CCSv4 を使用する場合、次のようなコードを使用すると、複数の割り込みを取得して同じ割り込みハンドラーを使用できることがわかりました。
#pragma vector=TIMERA1_VECTOR
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void){
ServiceWatchdogTimer();
}
私の質問は、その割り込みに陥ったときに、どの割り込みが私をここに導いたのかを知る方法はあるのかということです。
解決
あなたの質問への一般的な答えは、現在呼び出されている割り込みを検出する直接的な方法が全くありませんです。あなたは、割り込みで各フラグを確認することができますので、しかし、それぞれの割り込みには、独自の割り込みフラグを持っています。あなたはすべきであり、あなたが実際に呼び出されたことを割り込みを処理している作るために有効とフラグ。また、MSP430のタイマーでA1ハンドラで処理するために何を伝えることができ、ベクターTAIVがあります。 TAIVの場合0は、あなたがそれがA0ハンドラであると仮定することができ、その場合のためのように、A1ハンドラの割り込みがなかったということです。
私は、次のような何かを行うだろう。
#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 つの別個の割り込みベクトルを用意するか、どちらのデバイスにサービスが必要かを確認するために両方のデバイスにクエリを実行する必要があります。
2 つの割り込みベクトルを使用する場合、同じルーチンを呼び出すか (アセンブリを使用している場合) ジャンプして、大部分の作業を実行できます。 アールズが出した答え.
チップにはすでに割り込みベクトルテーブルがあることに注意してください。そのため、別の回答で作成したコメントで話していることを行うには、「未使用」割り込みの割り込みベクトルエントリを、スローするルーチンにポイントするだけです。エラー。