ウォッチドッグタイマ(WDG)は、システムが異常停止した際に自動リセットを発生させることで、信頼性を高めるためのハードウェア機構です。STM32マイコンには、独立型(IWDG)とウィンドウ型(WWDG)の2種類が搭載されています。
IWDG:シンプルで堅牢な監視機能
独立型ウォッチドッグは、内部低速クロック(LSI, 約40kHz)で動作し、外部干渉やソフトウェアフリーズからシステムを保護します。主な特徴:
- 専用クロックで動作 → システムクロック障害時も監視可能
- 12ビットカウンタ + プリスケーラで最大約26秒のタイムアウト設定可
- 「餌やり」操作(カウンタリロード)でリセットを回避
制御にはキーレジスタを使用。意図しない書き込みを防ぐため、特定のマジックナンバーが必要です:
| 書き込み値 | 効果 |
|---|---|
| 0xCCCC | ウォッチドッグ有効化 |
| 0xAAAA | カウンタをリロード(餌やり) |
| 0x5555 | プリスケーラ/リロードレジスタの書き込み許可 |
| その他 | 上記レジスタを書き込み禁止 |
タイムアウト時間は以下の式で計算されます:
T = (1 / FLSI) × Prescaler × (Reload + 1)
// 初期化例
void setup_iwdg(void) {
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 書き込み許可
IWDG_SetPrescaler(IWDG_Prescaler_32); // 分周比設定
IWDG_SetReload(0xFFF); // リロード値
IWDG_ReloadCounter(); // 初期リロード
IWDG_Enable(); // 有効化
}
// 定期的に呼び出して「餌やり」
void feed_iwdg(void) {
IWDG_ReloadCounter();
}
WWDG:精密なタイミング制御が必要な用途向け
ウィンドウ型ウォッチドッグはAPB1クロック(最大36MHz)を使用し、より短い監視周期(最短113μs)と「許容窓」による厳密なタイミング管理が可能です。
動作ルール:
- カウンタが0x40未満になると強制リセット
- 指定された「ウィンドウ範囲外」でリロードするとリセット
- カウンタ=0x40時に割り込み(EWI)発生 → リロードの最終チャンス
タイムアウトとウィンドウ幅の計算式:
- タイムアウト: T = TPCLK1 × 4096 × Prescaler × (Counter + 1)
- ウィンドウ幅: Twin = TPCLK1 × 4096 × Prescaler × (Counter - Window)
// 初期化例
void setup_wwdg(void) {
WWDG_SetPrescaler(WWDG_Prescaler_8); // 分周比
WWDG_SetWindowValue(0x5F); // ウィンドウ上限
WWDG_SetCounter(0x7F); // 初期カウンタ値
WWDG_EnableIT(); // 割り込み許可
WWDG_Enable(0x7F); // 有効化
}
// 割り込みハンドラ内でリロード
void WWDG_IRQHandler(void) {
if (WWDG_GetFlagStatus()) {
WWDG_SetCounter(0x7F); // カウンタ再設定
WWDG_ClearFlag(); // フラグクリア
}
}
両者の比較と選定基準
| 特性 | IWDG | WWDG |
|---|---|---|
| リセット条件 | カウンタ=0 | カウンタ<0x40 または ウィンドウ外リロード |
| 割り込み機能 | なし | 早期警告割り込み(EWI)あり |
| クロック源 | LSI (40kHz) | PCLK1 (最大36MHz) |
| タイムアウト範囲 | 0.1ms~26秒 | 113μs~58ms |
| 用途 | 汎用的・冗長性重視 | リアルタイム性・タイミング精度要求 |