独立型ウォッチドッグタイマ【STM32のIWDG詳細】
ウォッチドッグタイマとは
ウォッチドッグタイマとはプログラムが暴走・フリーズしてしまったときに、これを検出してプログラムを終了させてリセットかける機能のことです。プログラムの異常を見張る役目のためウォッチドッグ(番犬)タイマと呼ばれています。
PCで何らかの影響でアプリケーションプログラムが突然フリーズすることはよくあると思います。これは何らかのはずみでプログラムが無限ループに入ってしまい、外からの操作を受け付けることができなくなる、つまり固まってしまう状態になってしまっているのです。こうなればPCの場合は強制的に電源を再投入して再起動するしかないのですが、組み込み機器ではそうはいきません。
そこで、ウォッチドッグタイマ機能を使用して問題が発生した異常時にプログラムを終了し、自動的に強制リセットかけます。ウォッチドッグタイマ機能が異常を検出するのではなく、正常であればカウンタ値をクリアされるところをクリアされずにタイムアウトに達してしまうことで異常とみなし、プログラムを終了させ強制リセットをかけるのです。
趣味の電子工作では必要ないかもしれませんが24時間稼働の産業機器や医療機器などでは必要な機能です。
独立型ウォッチドッグタイマ
STM32マイコンではウォッチドッグタイマのクロックはLSI内部クロックを使用しています。システムクロックは外部HSEまたは内部HISから供給したものですので、独立したクロックで、万一システムクロックにトラブルが発生しても影響を受けずに問題を検出できます。このため、独立型ウォッチドッグと呼ばれています。
タイマはダウンカウンタとなっていて、カウント値クリア直後の設定値からスタートしてダウンカウントしていきます。カウント値が途中でクリアされずにアンダーフローに達するとマイコンは強制リセットされます。そのため、アンダーフローつまりタイムアウトに達する前にカウンタ値をクリアする必要があります。
実際のプログラムおける設定を解説していきます。
プログラム起動直後、独立型ウォッチドッグはデフォルトでレジスタへの書き込みは禁止ですのでIWDG_WriteAccessCmd関数で書き込みアクセス許可します。引数は、IWDG_WriteAccess_Enableでアクセス許可、IWDG_WriteAccess_Disableでアクセス禁止です。
関数実行例: IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
次にウォッチドッグタイマのクロック分周比をIWDG_SetPrescaler関数で設定します。関数の引数は4から256まで7通りあります。下表はLSIが40kHzであるときに分周比による設定できる時間をまとめたものです。
LSIは内部クロックですので多少の周波数のばらつきはありますが約2500msにウォッチドッグタイマを設定したい場合は分周比32を指定します。
関数実行例: IWDG_SetPrescaler(IWDG_Prescaler_32);
カウント数の設定はIWDG_SetReload関数で指定します。関数の引数は0x0から0xFFF(4095)の範囲内で、3000を指定します。
関数実行例: IWDG_SetReload(3000);
ウォッチドッグタイマのカウンタ値クリアはIWDG_ReloadCounter関数で行います。設定したカウンタ値(3000で約2500ms)で強制リセットとなりますので、この期間以内、例えば100ms間隔で実施するTaskD内でカウンタクリアを行います。
カウンタクリアはウォッチドッグの機能を考えると優先度の最も低いタスクで実施することが好ましいです。正常運転中は最低優先度のTaskDでもほぼ設定周期100msで実施されますのでカウンタクリアはできますが、何らか異常が発生してフリーズしている場合はTaskDが実施されずカウンタクリアはできず、ウォッチドッグタイマはタイムアウトに到達して強制リセットに至ります。