/home/tnishinaga/TechMEMO

日々行ったこと、面白かったことを書き留めます。

mbed LPC1768でWatchDogTimerを扱う

mbed LPC1768でWDTを使う方法を調べたので、備忘録として記す。

リファレンス

WDTとは

Watch Dog Timer、直訳で番犬タイマー。 マイコンの暴走や無限ループに陥った際、強制的にリセットをかける機構。

WDTはカウントダウンタイマーである。値がセットされるとカウントダウンを開始し、0になるとマイコンをリセットさせる。 この機能を活かして、マイコンの動作を監視する。

以下、監視の手順を簡単に説明する。 監視対象のプログラムに、一定時間以内にWDTのカウンタを再セット(タップ)する処理を入れる。すると、正常に動作している間はWDTが0になる前にタップが行われるため、WDTによるリセットはかからない。 しかし、マイコンの暴走や無限ループなどの理由によりWDTへのタップが行われなくなった場合、WDTのカウンタが0となり、強制リセットが行われる。

register description

以下、LPC1768のWDTに関するレジスタとその説明を記す。

Name Description
WDMOD WDTのモード設定とステータス確認用レジスタ
WDTC タイムアウト値設定レジスタ
WDFEED 0xAAの後に0x55を書き込むと、WDTCにセットした値がWDTのカウンタにセットされる
WDTV 現在のWDTカウンタ値を確認するレジスタ
WDCLKSEL WDTのクロックソースを選択するレジスタ

WDMOD

Bit Symbol Description
0 WDEN WDTを有効化する。1の場合はWDT実行中。
1 WDRESET WDTによる強制リセットを有効化する。1にすると有効となる
2 WDTOF WDTのタイムアウトフラグ。WDTによるリセットが行われると1になる。自動でクリアされないので、ソフトウェアでクリアする
3 WDINT WDT割り込みフラグ。読み込み専用
31:4 - 予約

WDENとWDRESETは一度設定すると、その後ソフトウェアからは無効化できない。

WDTは独立して動作する。そのため、デバッグ等で動作を止める場合、WDEN,WDRESETがともに1となっているとWDTによるリセットがかかり、デバッグができない。

WDTC

WDTのカウンタ値をセットする。 初期値は0xFFとなっている。

最小値はT_WDCLK * 256 * 4 (T_WDCLK = 1 / WDTクロックソースの周波数 ) 最大値は書かれていないため 0xffffffff と予想する。

WDFEED

ここに0xAA,0x55が書き込まれると、WDTCにセットされた値がカウンタにリロードされる。 つまり、WDTのタップ操作になる。

WDTV

現在のWDTカウンタの値を表示する。 ただしカウンタとの同期に6 WDCLKサイクル、加えて6 PCLKサイクルかかるため、実際のクロックの値に比べてWDTVの値は古くなる。

Name Description
WDCLK WDTのクロックソースから供給されるクロック
PCLK ペリフェラルクロック

WDCLKSEL

Bit Symbol Description
0:1 WDSEL クロックソースを設定する。詳細は後述
30:2 - 予約
31 WDLOCK 1を書き込むとWDTのクロックソースをロックできる。一度ロックされると、リセットがかかるまでクロックソースが変更不可となる。

WDSELは0x00~0x10をセットすることでクロックソースを設定できる。

Value Description
0x00 内蔵RCオシレータ
0x01 ペリフェラルクロック
0x02 RTCオシレーター
0x03 予約

プログラム例

mbed LPC1768でWatchDogTimerの動作を確認するコード