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 | 予約 |