Spansionに譲渡されたと思ったらSpansionはCypressに吸収されて今後どうなるのか不安も感じる元富士通セミコンダクタのFM3マイコンですが、
これのWDT、タイマアンダーフローでいきなりリセットする、という設定ができないようだ。
タイマスタートビットと割り込み許可ビットが兼用で、リセット許可ビットを単独で立ててもタイマはスタートされないので、リセットだけかけたい、という設定ができない。
タイマスタート兼割り込み許可ビットと、リセット許可ビットを立てておくと、
1回目のタイマアンダーフローで割り込みがかかる
(その際タイマはオートリロードされまたカウントダウンが開始される)
2回目のタイマアンダーフローでリセットがかかる
WDTでリセットしたい場合はどうするのか?
ロードレジスタには、希望するインタバル値 / 2 を設定しておいて、
WDTタイマ割込エントリを用意して、そこではWDT割り込みをクリアすればいい?
しかし、WDT割り込みをクリアするには、WDTクリアするしか方法がないようだ。
WDTクリアをすると・・・1回目のアンダーフローだったっていうこともクリアされてしまって・・・ただ単にWDT割り込みが周期的にかかる状態となり、リセットはかからない。
なんだよこれ。
じゃあ、リセットかけたい場合はWDT割り込みを無視するしかないのか?
でもそうすると2回目のアンダーフローまでの間、WDT割り込みかかりっぱなしになるでしょ?その間、無駄なフリーズ状態時間じゃないの?
割り込みマスクしようにも、HWWDTの割り込みベクタ、NMIと兼用だしなあ・・・
どうなってんのかなこれ?
データシートの「動作例」には、WDTタイマ割り込み発生後にロードレジスタのインタバル値を小さい値に書き換えてやればあまり遅滞なく次のアンダーフローが発生してリセットがかかるよ!的な示唆が含まれているように思える例が書かれているが、ロードレジスタを書き換えるとWDTタイマ割込はクリアされる、とも、データシートには書いてあるんですけど(少なくともHWWDTのほうは)。だから動作例の動作はしないとおもうんですけど。
SWWDTは割り込みが不要なら無視することもできるから、HWWDTは最後の手段的にしておいて、通常はSWWDTも併用しろってことなのかな??
追記。データシートに、ロードレジスタに0を書き込めばすぐに割り込みがかかる、と書いてあった。割り込みハンドラでそうすれば、実質的には遅滞なくWDTリセットがかけられた。なるほど・・・。
(でもやっぱり動作例は間違ってるんじゃないの?)
(でもやっぱり割り込みは使わずにいきなりリセットかけられるようにしてほしかったなあ・・・)
コメント