UART を持たないアプリケーションに MSP430F2013 プロセッサを使用しています。UART が必要なので、TI のサンプル コード「msp430x20x3_ta_uart2400.c」を使用して、Timer モジュールを使用して UART をエミュレートしました。これはすべて正常に機能し (IAR Embedded Workbench でコンパイル)、PuTTY を使用して文字を開発ボードに送信し、ループバックを使用して文字を端末にエコーすることをテストしました。
これはリスクを回避するための作業であり、今ではそのコードをアプリケーションのステート マシンに移植することになりました。これを行った後、タイマー割り込みと低電力スリープ モードに関連する問題が発生しています。低電力(スリープ)モードへのエントリの周りのコードのスニペットは次のとおりです。
// Prepare the UART to receive one byte.
prepare_receiver();
// Enter low power mode 1.
__bis_SR_register(LPM1_bits + GIE);
// Check whether the full message has been received.
if(true == get_message_complete())
{
process_event(e_euart_message_received, NULL);
}
デバッガー (C-Spy) で見ているのは、bis_SR_register()
最初のエントリで行を実行してからif
ステートメントに移動する場合があることです。つまり、スリープ状態にするように要求したという事実を無視します。他の場合には、スリープ状態になるべきときに ISR が正しくトリガーされ、最終的にif
ステートメントに戻ってプログラムの実行を続行します (予想どおり)。しかし、次のステートメントに移動しようとすると、アプリケーションがその最初の行でフリーズします。つまり、先に進むことができません。
私がやっているTIの例と機能的に異なるものは何も考えられないので、私の問題は私がそれを移植した方法に関係しているに違いないと思います。たとえば、Timer ISR とここに投稿したコードは、異なるコンパイル ユニットにあります。この種の決定は何か関係がありますか? 私の質問は少し漠然としているかもしれませんが、残念ながらすべてのコードを投稿することはできません.陥ってしまったのかもしれません。