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

No.0016 2021.3.7




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





今回のソースファイル: rx62_test1.zip (178 KB)


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

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

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



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

while(xyz != 0){};

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

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




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

まずは、ウォッチドッグのない普通の処理を書いてみます。
前回作成した空のプロジェクトのmain()関数があるソースファイルに、以下のように記述します。 iodefine.h は、マイコン機能を使うためのヘッダファイルです。 これをビルド&ダウンロードして実行しても、while(1){ の部分を永遠に繰り返すだけです。





12行目にブレイクポイントを設定してみます。 ブレイクポイントは、ダウンロードして停止中に人差し指の列の該当行をクリックすると設定できます。 ブレイクポイントにはアイコンが表示されて、行が赤くなります。 アイコンをクリックすると、ブレイクポイントが解除されます。





ブレイクポイントを設定して実行すると、12行目で処理が止まります。





変数 count_i の部分にマウスカーソルを当てると、変数の値が表示されます。





VisualStudioのように変数にウォッチを設定することもできます。 メニューは右クリックで表示させます。





設定した変数は、ウォッチウィンドウで確認できます。





変数の値は、表示を2進数やASCIIなど様々な表現に変更できます。




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



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

実際にRX621でウォッチドッグを使用してみます。
「RX621グループ ユーザーズマニュアル ハードウェア編 R01UH0033JJ0140」
「24. ウォッチドッグタイマ(WDT)」の機能です。


「24.2.2 タイマコントロール/ステータスレジスタ(TCSR)」を読むと、 TMSビットを1にして、TMEビットを1にするとウォッチドッグが動くよ、と書いてあります。 ただし書き込むときはWINAレジスタを使ってね、と書いてあります。




「24.2.3 リセットコントロール/ステータスレジスタ(RSTCSR)」を読むと、 RSTEビットを1にすると、カウンタがオーバーフローしてタイムオーバーになるとリセットが掛かるよ、と書いてあります。 ただし書き込むときはWINBレジスタを使ってね、と書いてあります。




「24.2.1 タイマカウンタ(TCNT)」を読むと、 タイマカウンタを初期化するために書き込むときはWINAレジスタを使ってね、と書いてあります。




「24.5.1 レジスタアクセス時の注意」を読むと、 WINA、WINBにアクセスするときの上位1バイトの指定ルールが記載されています。
RSTCSRの設定をWINBに書き込むには、2バイトで値を設定して、上位1バイトは0x5Aにしてね、
TCSRの設定をWINAに書き込むには2バイトで値を設定して、上位1バイトは0xA5にしてね、
TCNTの値をWINAに書き込むには2バイトで値を設定して、上位1バイトは0x5Aにしてね、
と書いてあります。






以上のお約束を踏まえた上でソースコードを書くと、 以下のようになります。
12行目でRSTCSRレジスタの設定、13行目でTCSRレジスタの設定、 19行目でタイマカウンタ(TCNT)の初期化を行っています。
TCSRレジスタのCKSクロック選択ビットは適当にしました。この設定はタイマカウンタの1カウントの時間をいくつにするかの設定です。システムクロックの分周比で決定するため、ハードウェアマニュアル表中の周期時間とは異なります。

ちなみに今回は CKS=0b100 にしたので、PCLK/2048です。PCLKレジスタの初期値は、ハードウェアマニュアル「8.2.1 システムクロックコントロールレジスタ(SCKCR)」より、 0b0010:x2 です。外部クロックは12MHzですので、
1÷(12MHz×2)× 2048 = 85.3μs
となります。タイマカウンタ(TCNT)は8ビットですので、85.3μs × 255 = 約21.7ms以内にTCNT=0としないとリセットが掛かることになります。





ビルド&ダウンロードし、15行目のcount_i=0 にブレイクポイントを設定して実行すると、1回だけブレイクが掛かって停止します。再び実行すると、while(1)の中の処理が続くため、ブレイクが掛かりません。





19行目のタイマカウンタ(TCNT)の初期化をコメントアウトして、ビルド&ダウンロードし実行してみます。 15行目のブレイクポイントで停止します。再び実行すると、すぐにまた15行目でブレイクが掛かるようになったと思います。
これは、タイマカウンタ(TCNT)がオーバーフローしてリセットが掛かり、処理の最初に戻ったためです。





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


スポンサードリンク

TOPへ戻る


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