Cold Fire V1 で RTCモジュールを使う - 割り込み処理の実例 [ColdFire (ColdeFire) V1]
割り込みを使ったプログラムを書いてみます。
RTCの割り込みで、LEDピカピカ
QEシリーズで新たに追加されたRTCモジュールを使い、 0.5秒毎に割り込みを発生させ、 LEDを点滅させます。
#include/* for EnableInterrupts macro */ #include "derivative.h" /* include peripheral declarations */ void main(void) {
メイン関数の最初の方で、 COPを停止させ、LEDを点滅させるためのRGPIOの設定を行います。
// Configure one-time-write SOPT1 SOPT1 = 0 | SOPT1_WAITE_MASK // Enable WAIT instruction | SOPT1_RSTOPE_MASK // Enable RSTO* port | SOPT1_BKGDPE_MASK // Enable BKGD port | SOPT1_RSTPE_MASK ; // Enable RESET* port // Configure PTC0 as output RGPIO_ENB = RGPIO_ENB_ENB8_MASK; RGPIO_DIR = RGPIO_DIR_DIR8_MASK;
RTCモジュールの初期設定は、こんなものです。 これだけで、RTCは、0.5秒ごとに割り込みを発生させます。
// Configure RTC module RTCSC_RTCLKS = 0; // 1kHz 発振器を使います RTCSC_RTCPS = 11; // プリスケーラを10ミリ秒に設定します RTCMOD = 50-1; // 50カウント (500m秒) ごとにイベントが発生します RTCSC_RTIE = 1; // 割り込みを使います
あとは、CPU全体として割り込みを許可して、 無限ループに突入します。
EnableInterrupts; /* enable interrupts */ for(;;) { __RESET_WATCHDOG(); /* feeds the dog */ } /* loop forever */ /* please make sure that you never leave main */ }
割り込みサービス・ルーチン(ISR)は、このように記述します。
__interrupt VectorNumber_Vrtc rtc_isr(void) { RTCSC_RTIF = 1; // Clear the flag. // Toggle the PTC0 RGPIO_TOG = RGPIO_TOG_TOG8_MASK; }
RTCのイベント発生を知らせるフラグは、RTCSC_RTIFに"1"を書き込むとクリアされます。 RTCのフラグのクリアの仕方は、TPMと異なっているので注意が必要です。何で、統一しないかなあ。 イベント発生ごとにRGPIO8をトグルするので、LEDは、1秒周期で点滅をします。
デバッガでスタックを調べる
デバッガでISRに入ったところに Breakpoint を仕掛けて、スタックを確認しました。
+0x0 0100 0001 0101 1000 0010 0000 0001 0100 +0x4 0000 0000 0000 0000 0000 0100 0110 0000
Format | 0100 | 8バイトスタックフレーム | ||
---|---|---|---|---|
FS[3:0] | 0000 | no fault | ||
Vector | 01 0101 10 | RTC割り込みのベクタ | ||
SR | 0010 0000 0001 0100 | ステータス・レジスタ | ||
T | 0 | トレース不許可 | ||
S | 1 | スーパバイザ・モード | ||
M | 0 | マスター・ステート | ||
I | 000 | 割り込みマスク | ||
CCR | 0001 0100 | コンディション・コード | ||
PC | $00000460 | プログラム・カウンタ |
おぉ、確かにリファレンスマニュアルどおりだ。
割り込みベクタテーブルは、 "Project Settings/Startup Code/exceptions.c" ファイルに作成されます。 このファイルの中では、デフォルトの ISR があてがわれているので、 "main.c" に書いた ISR と競合しそうな気がしますが、 実際には、 "main.c" で書いた "__interrupt" 宣言の方が優先されるようです。
コメント 0