Copyright (C)SUWA TSUSHIN NETWORK.
All Rights Reserved. TOPへ戻る
スポンサードリンク

No.0034 2021.3.31




ルネサス RA4W1マイコン 初心者(4) ウォッチドッグタイマーを使って簡単なデバッグをしてみる





今回のソースファイル: hal_entry.c のみ (2.87 KB)


□ 1.ウォッチドッグタイマーとは?

ウォッチドッグタイマーは、ウォッチドック、WD、WDT(WatchDog Timer)とも呼ばれ、マイコン処理のフリーズ、暴走を監視する機能です。
タイマー付き時限爆弾のようなもので、タイムアップとなる前にリセットボタンを押さないと爆発(リセット)してしまいます。

図 ウォッチドッグタイマーの概念



例えば、良くないコーディング例ですが、

while(xyz != 0){};

というxyzが0になるまで待つ処理があったとします。
通常であればすぐに0になるため、ここでの待ち時間はほとんどありません。
しかし何かしらの理由で0にならない場合、無限ループになってしまい、ここで処理が止まってしまいます。 ウォッチドックタイマーを有効にしていれば、そのときリセットが掛かり、最初から処理が行われるようになります。

もちろん0にならない場合が続けば、
リセット → 最初から処理が行われる → リセット → 最初から処理が行われる → ・・・
と繰り返します。




□ 2.ウォッチドッグのない処理

まずは、ウォッチドッグのない普通の処理を書いてみます。
まず最初に、main()関数への記述は禁止です。 main()関数は、「ra_gen」の中のmain.c にあります。 FSPの「Generate Project Content」をクリックして自動コード生成をすると、main()関数に記述してあった内容は消去されてしまいます。





では、どうすればいいかと言えば、 「src」の「hal_entry.c」にある、hal_entry()関数内に記述をします。 この関数は、main()関数から呼び出されます。
これをビルド&デバッグして実行しても、while(1){ の部分を永遠に繰り返すだけです。





17行目にブレイクポイントを設定してみます。 ブレイクポイントは、アドレス表示がされている行のみ設定できます。 該当行の列番号の左側をダブルクリックすると設定できます。 ブレイクポイントにはアイコンが表示されて、アドレス表示が青くなります。 アイコンをクリックすると、ブレイクポイントが解除されます。





ブレイクポイントを設定して実行すると、17行目で処理が止まります。 変数 count_i の部分にマウスカーソルを当てると、変数の値が表示されます。





VisualStudioのように変数にウォッチを設定することもできます。 ウォッチしたい変数を選択状態にして右クリックし、「監視式を追加...」を選択します。





「監視式を追加」のダイアログが表示されます。選択した変数が入力されていることを確認し、OKを押します。





式ビューに、選択した変数が追加されます。 変数の値は、ここの一覧で確認できます。





もし式ビューが表示されない場合、「ウィンドウ(W)」の「ビューの表示(V)」の「式」を選ぶと表示されます。





変数の値は、16進数などで表示させることも可能です。





17行目のブレイクポイントで止まった状態で実行ボタンを押すと、 while(1){} の処理をし続けるため、以後において17行目でブレイクが掛からなくなります。
21行目のif文のところでブレイクポイントを設定すると、ブレイクが掛かります。 ブレイクポイントの設定は、プログラム実行中でもできます。



□ 3.RA4W1のウォッチドッグ

実際にRA4W1でウォッチドッグを使用してみます。
「RA4W1グループ ユーザーズマニュアル ハードウェア編 R01UH0883JJ0100」
「26. ウォッチドッグタイマ(WDT)」の機能です。
今回は、「26.3.1.1 レジスタスタートモード」を使用します。


まず最初に、オンチップデバッグ時にもWDTを有効にさせます。 「何のこと?」と、初っ端から意味が分からないと思うかもしれません。このRAマイコンではオンチップデバッグ時に特定の機能が無効となる設定があり、それが有効になっています。 「2.6.4.2 デバッグストップコントロールレジスタ(DBGSTOPCR)」のDBGSTOP_WDTが該当のレジスタです。初期値は1でWDTのカウントが無効になっています。





ソースコードでは以下のように記述します。


  R_DEBUG->DBGSTOPCR_b.DBGSTOP_WDT = 0;     //OCD時のWDTリセットを許可


このRAマイコンでのレジスタの指定方法は、

  R_$$$$$->*****_b.&&&&&

もしくは、

  R_$$$$$->*****

 $$$$$:機能名
 *****:レジスタ名 32bitまたは16bitまたは8bit
 &&&&&:シンボル名

となります。最初は「 R_ 」で始まるのと、レジスタの指定が構造体ポインタであるのが特徴です。
レジスタの指定時は、インテリセンスのように選択することができます。






次に、ウォッチドッグの1カウント(サイクル)分の時間を決めます。 「26.2.2 WDT コントロールレジスタ(WDTCR)」のCKS レジスタを使用します。今回は、0x06 = PCLKB/512 の分周比を設定します。





このときの PCLKB の値は、FSPのclocksの設定を参照すると24MHzとなっています。24MHz ÷ 512 = 21.3μs が1カウント分の時間になります。





ソースコードでは以下のように記述します。


  R_WDT->WDTCR_b.CKS = 0x06;     // クロック分周比選択


次に、何カウントでリセットとするかの時間を決めます。上記の分周比の設定と同じ 「26.2.2 WDT コントロールレジスタ(WDTCR)」のTOPS レジスタを使用します。今回は、0x01 = 4096 カウントを設定します。 4096 x 21.3us = 87ms 以内にウォッチドッグタイマーのカウンタをリセットしないと、マイコンがリセットすることになります。

ソースコードでは以下のように記述します。


  R_WDT->WDTCR_b.TOPS = 0x01;     // タイムアウト期間


最後に、ウォッチドッグタイマーを動作させます。リフレッシュレジスタを1回リセットすると、カウンタ動作が開始します。 「26.2.1 WDT リフレッシュレジスタ(WDTRR)」レジスタを使用します。「0x00の書き込み後、0xFFの書き込みでダウンカウンタがリフレッシュ」と書いてあるので、その通りに記述します。





ソースコードでは以下のように記述します。


  R_WDT->WDTRR = 0x00; 
  R_WDT->WDTRR = 0xFF;     // WDTリフレッシュ


以上の説明をソースコードで書くと、 以下のようになります。






ビルドしてからデバッグを実行し、21行目のレジスタ設定の行 にブレイクポイントを設定して実行すると、1回だけブレイクが掛かって停止します。再び実行すると、while(1)の中の処理が続くため、ブレイクが掛かりません。





26、27行目のリフレッシュレジスタのリセットをコメントアウトし、再びビルドしてデバッグを実行してみます。 21行目のブレイクポイントで停止します。再び実行すると、すぐにまた21行目でブレイクが掛かるようになったと思います。
これは、タイマカウンタがアンダーフローしてリセットが掛かり、処理の最初に戻ったためです。





本来であればリセットが掛からない(=処理が止まらない)ようにコーディングするのが当たり前です。しかし保険的な機能としてウォッチドッグがあります。また最初で述べた通り、例外条件を設けないなどのバグ等でタイマカウンタが初期化できない場合は、永遠にリセットを繰り返すことになります。


スポンサードリンク

TOPへ戻る


ご利用条件
 Copyright (C)SUWA TSUSHIN NETWORK. All Rights Reserved.