STM32F7 IWDG(独立ウォッチドッグ)

また前回から時間が空いてしまったが引き続きSTM32F7の機能について記述していく。今回IはIWDG(独立ウォッチドッグ)について。以下にマニュアルと書かれているのはリファレンスマニュアル(RM0410 Rev4)のことを指している。

概要

IWDGのタイマーは内蔵RCクロックによってmainとは完全に独立で動作する。RCクロックの名の通りRC発振回路で動作しているため時間精度は悪い。
0xFFFから0x000までのダウンカウンタとなっている。

リセット要因

以下のいずれかが発生するとマイコンがリセットされる
・カウンタの値が0x000になる
・カウンタがウィンドウ期間外でリロード(特定の値に戻す)される
ウィンドウ期間とはカウンタの値がIWDG_WINRレジスタにセットされた値以下、かつ0x000以上となっている期間のことをいう。

ロック解除

まず、IWDG_KRレジスタに0x0000CCCCを書き込んでIWDGを有効にした状態でないとIWDGに関するあらゆるレジスタへの書き込みができない。

以下のレジスタはロックされており、IWDG_KRレジスタに0x00005555を書き込むことで書き込みアクセスできるようになる。
・IWDG_PR
・IWDG_RLR
・IWDG_WINR
IWDG_KRレジスタに0x00005555以外の値を書き込むと再度ロックされる。

IWDG_PRレジスタに書き込む際には上記のロックに加えてIWDG_SRレジスタのPVUビットがクリアされている必要がある。
IWDG_RLRレジスタに書き込む際には上記のロックに加えてIWDG_SRレジスタのRVUビットがクリアされている必要がある。
IWDG_WINRレジスタに書き込む際には上記のロックに加えてIWDG_SRレジスタのWVUビットがクリアされている必要がある。

動作

IWDG_KRレジスタに0x0000CCCCが書き込まれるとカウントダウン開始(リセット直後だと0xFFFからのカウントダウンになる)。
IWDG_KRレジスタに0x0000AAAAが書き込まれるとカウンタをIWDG_RLRに書き込まれた値にセット(リロード)する。

IWDG_WINRの値を0xFFF未満に設定した状態だとウィンドウモードが有効になる。ウィンドウモードが有効になっている場合、カウンタの値がIWDG_WINRレジスタにセットされた値以下のときにリロードしないとリセットが発生する。
IWDG_WINRの値を0xFFFにしておけばウィンドウモードが無効になる。

IWDG_SRレジスタのビットが全て0になっている場合、IWDG_WINRの値を変更すると、同時にカウンタの値もIWDG_RLRの値にリセットされる。

IWDG_KRレジスタについてまとめると
・0x00005555を書き込み→PR、RLR、WINRレジスタの書き込みロック解除(0x00005555以外の値を書き込むと再度ロック)
・0x0000AAAAを書き込み→RLRレジスタの値をカウンタにリロード(PR、RLR、WINRレジスタはロックされる)
・0x0000CCCCを書き込み→カウントダウン開始(PR、RLR、WINRレジスタはロックされる)

具体的なIWDGの設定はマニュアルP1114に書かれている。

オプションバイト(FLASH_OPTCRレジスタ)でIWDG_SWビットがクリアされている場合はマイコンが起動すると同時にIWDGのダウンカウントが始まる。
IWDG_SWビットがセットされている場合はIWDG_KRレジスタに0x0000CCCCを書き込まない限りダウンカントは始まらない。

IWDGは一旦カウントを始めると止める方法は無い。

DBGMCU_APB1_FZレジスタのDBG_IWDG_STOPビットがクリアされている場合はCPUコアがHalt状態でもIWDGのカウントは止まらない。DBG_IWDG_STOPビットがセットされている場合はCPUコアがHalt状態になるとIWDGのカウントは止まる。

機能の少ない単純なウォッチドッグなので、IWDG_RLRレジスタでリセットまでの時間を設定してIWDG_WINRレジスタでウィンドウ期間を設定、IWDG_KRレジスタで動作を制御すると覚えておけばいいだろう。