So-net無料ブログ作成
検索選択

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
Format01008バイトスタックフレーム
FS[3:0]0000no fault
Vector01 0101 10RTC割り込みのベクタ
SR0010 0000 0001 0100ステータス・レジスタ
T0トレース不許可
S1スーパバイザ・モード
M0マスター・ステート
I000割り込みマスク
CCR0001 0100コンディション・コード
PC$00000460プログラム・カウンタ

おぉ、確かにリファレンスマニュアルどおりだ。

割り込みベクタテーブルは、 "Project Settings/Startup Code/exceptions.c" ファイルに作成されます。 このファイルの中では、デフォルトの ISR があてがわれているので、 "main.c" に書いた ISR と競合しそうな気がしますが、 実際には、 "main.c" で書いた "__interrupt" 宣言の方が優先されるようです。


nice!(0)  コメント(0)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。