STM32における独立・ウィンドウ型ウォッチドッグの仕組みと使い方

ウォッチドッグタイマ(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();       // フラグクリア
    }
}

両者の比較と選定基準

特性IWDGWWDG
リセット条件カウンタ=0カウンタ<0x40 または ウィンドウ外リロード
割り込み機能なし早期警告割り込み(EWI)あり
クロック源LSI (40kHz)PCLK1 (最大36MHz)
タイムアウト範囲0.1ms~26秒113μs~58ms
用途汎用的・冗長性重視リアルタイム性・タイミング精度要求

タグ: STM32 watchdog IWDG WWDG EmbeddedSystems

6月15日 21:08 投稿