ウォッチドックタイマ(WDT)
ウォッチドッグタイマはシステムの不具合を検出するためのタイマです。
現在の組み込みシステムはその内容が非常に複雑なものとなってきており、テストやデバッグを繰り返したとしても、完全無欠なプログラムを作ることが難しくなってきています。
また組み込みシステムではマイコンに多くの外部機器が接続されており、これらの外部機器の不具合がマイコンの動作に影響を与えることがあります。
そこでマイコンが何らかの理由で動作を停止したことを検出できるようにすることが重要になります。
ウォッチドッグタイマは異常検出のための手法の一つです。ウォッチドッグとは番犬のことで、システムの見張り番として動作するタイマということになります。
STM32のウォッチドッグタイマはダウンカウントのタイマなのですが、一旦スタートさせてカウンタがアンダーフローすると、マイコンが強制的にリセットされます。そのためカウンタがアンダーフローする前に、カウンタをリセットして初期値に戻さなければいけません。
この「カウンタのリセット」という作業を、プログラムのループのどこかに組み込んでおきます。そうするとプログラムが途中で停止すると、ウォッチドッグタイマをリセットできなくなり、システムがリセットされます。タイマ割込みでウォッチドッグタイマをリセットすることもできます。この場合には割込みコントローラの設定を誤ってタイマ割込が発生しないような状況になると、システムがリセットされることになります。
STM32には2つのウォッチドッグタイマが内蔵されています。このうちの一つが独立型ウォッチドッグ(IWDG:Independent WatchDoG)です。
ここでいう「独立」はカウンタのクロック源がシステムクロックから独立しているという意味です。
システムクロックにはHSE又はHSIクロックが使用されますが、独立型ウォッチドッグはLSIクロックを使用します。
そのためHSE又はHSIクロックに問題が発生した場合でも、独立型ウォッチドッグには影響がありません。
そのため独立型ウォッチドッグは信頼性・安全性が高い強固なウォッチドッグと言えます。
CubeMXでは、IWDGの設定が可能で、以下のような項目を設定することができます。
Prescaler(プリスケーラー):IWDGカウンタークロックの分周比を設定します。
Reload Value(リロード値):IWDGカウンターがリセット信号を発生させるまでに必要なカウント数を設定します。
Window(ウィンドウ):IWDGカウンターが指定された範囲内に収まっているかどうかを検出するための、最大値と最小値の差を設定します。
これらの設定を行うことで、IWDGを有効にし、マイクロコントローラーの安定動作を確保することができます。ただし、IWDGは誤動作を防ぐために、定期的なリセットを行う必要があります。そのため、適切なリロード値とウィンドウ幅を設定することが重要です。
WWDG(Window Watchdog)とIWDG(Independent Watchdog)の違い
WWDGとIWDGは、STM32マイコンに搭載された2種類のウォッチドッグタイマーです。
WWDGは、一定の時間内にリフレッシュ(更新)されなかった場合にリセットを発生させることで、システムの安全性を確保するために使用されます。リフレッシュは、WWDGによって指定された範囲内に入力されることが必要です。つまり、WWDGは、設定された時間内にタスクが実行されない場合にリセットを発生させます。
一方、IWDGは、内部リングオシレーターから供給される時計信号を使用してカウントを実行し、あらかじめ設定された時間内にリフレッシュされなかった場合にシステムをリセットするために使用されます。IWDGは、クロックの安定性が低下した場合や、ソフトウェアの無限ループ、フリーズなどのシステムが停止した場合に有効です。
つまり、WWDGはソフトウェアによって設定されたタイムアウト期間内にシステムがアクティブであることを保証し、IWDGは、タイムアウト期間内にシステムの正常な動作が確認されなかった場合にシステムをリセットします。
IWDGの設定
"Pinout & Configuration" タブで "IWDG" を選択します。
"Independent Watchdog" を "Enable" にします。
"Prescaler" を選択します。これは、IWDGタイマーの入力周波数を割り込む周波数に変換する係数です。
設定可能な値は、4、8、16、32、64、128、256、512です。
"Reload" を設定します。これはIWDGタイマーのカウントダウン値を指定するもので、IWDGがリセットを発生させる前にリロードされなければなりません。この値は、IWDGの設定によって異なりますが、8ビットまたは12ビットの場合が多いです。
"Window" を設定します。これはIWDGタイマーが窓制御モードで動作する場合に、IWDGがリセットを発生させる前にIWDGの値が範囲内にある必要があることを示すものです。
"Option byte configuration" で "IWDG freeze in stop mode" を有効にするかどうかを選択します。このオプションは、STM32マイコンがSTOPモードに入ったときにIWDGタイマーを停止させるかどうかを制御します。
これらの設定を行うと、IWDGが有効になり、設定されたタイムアウト期間が経過するとシステムが自動的にリセットされます。IWDGをリセットするには、IWDGリロードレジスタに正しいキーを書き込む必要があります。
IWDGの秒数計算
ペリフェラルクロック(PCLK1:APB1 peripheral clocks)の周波数を計算します。
PCLK1 = HCLK / APB1 Prescaler
(HCLKはシステムクロック、APB1 PrescalerはRCC設定で指定します)
IWDGのプリスケーラを計算します。
IWDG Prescaler = 4^(IWDG_PRレジスタの値)
IWDGのリロード値を計算します。
Reload Value = (IWDG Time-out period (sec) x PCLK1) / IWDG Prescaler
(IWDG Time-out periodは設定したいタイムアウトの秒数です)
例えば、IWDGを32kHzのLSIクロックで駆動し、8秒でタイムアウトさせたい場合、以下のように計算します。
PCLK1 = 72MHz / 2 = 36MHz
IWDG Prescaler = 4^4 = 256
Reload Value = (8s x 36MHz) / 256 = 1,125,000
以上の計算結果から、IWDG_PRレジスタに4を、IWDG_RLRレジスタに1,125,000を設定すれば、8秒ごとにIWDGのリセットを回避することができます。
CubeMXで秒数計算
IWDG (Independent Watchdog) は、マイクロコントローラーが正常に動作していることを確認するためのタイマーです。IWDGの秒数は、以下の2つのレジスターの設定によって決まります。
IWDG counter clock prescaler(IWDGカウンタクロックプリスケーラ):IWDGのクロック周波数を設定します。この周波数は、IWDGのタイムアウト期間に直接影響します。具体的には、IWDGカウンタクロックプリスケーラの値が大きくなるほど、IWDGのタイムアウト期間が長くなります。
IWDG down-counter reload(IWDGダウンカウンタリロード):IWDGがタイムアウトするまでの時間を設定します。この値はIWDGカウンタクロックプリスケーラと一緒に使われ、IWDGのタイムアウト期間を計算するために使用されます。
具体的には、IWDGのタイムアウト期間は以下の式で計算できます。
IWDGタイムアウト期間 = (IWDG down-counter reload × IWDGカウンタクロックプリスケーラ) / LSIクロック周波数
ここで、LSIクロック周波数は、IWDGカウンタクロックプリスケーラによって設定されたIWDGのクロック周波数を生成するために使用される内部低速オシレータの周波数です。LSIクロック周波数は、一般的に32kHzです。
たとえば、IWDGカウンタクロックプリスケーラを64、IWDG down-counter reloadを625に設定する場合、IWDGのタイムアウト期間は約10秒になります。
IWDGタイムアウト期間 = (625 × 64) / 32,768 = 9.996秒
IWDG計算 
IWDGタイムアウト期間 = (IWDG down-counter reload × IWDGカウンタクロックプリスケーラ) / LSIクロック周波数
IWDG Clock(LSI クロック周波数) = 32kHz
IWDGカウンタクロックプリスケーラ = 256
IWDGタイムアウト時間 = 2s
IWDG down-counter reload = タイムアウト時間 * IWDG clock /プリスケーラ
= 32k * 2 /256
= 250
参考:
http://www.picfun.com/pic18/pic18xx13.html
https://wa3.i-3-i.info/word16698.html
http://miqn.net/periph/184.html
スタックについて