RA6M5 CPUの開発で WDT制御を試みています。ルネサス様のWDTサンプルプログラム(wdt_ek_ra6m5_ep)を動作させると意図したカウント周期でカウントが行われてリセット条件に到達すれば当然リセットが発生するのですが、当方で作成したプログラムでは、リセット条件に到達するとリセットは発生するものの、なぜだかカウント周期がサンプルプログラムと比較して異常に遅いです。※試しに WDTデバイスのレジスタ(WDTCRなど)や、カウントに関わる クロック発生回路のレジスタ(SCKDIVCRなど)も サンプルプログラムと当方プログラムで全く同じにしてみましたが 状況は変わりませんでした。※ちなみに、使用ボードのクロック速度(PCLKB)は50MHzです)※"異常に遅い"とは PCLKB=50MHzのとき、CPU仕様としてWDTは リセットまでに最大2.6秒ほどまで待てるかと思いますが、 ( 0x3FFF ÷ (50MHz / 8192) ≒ 2.6秒) 現状当方プログラムは200秒以上経ってからリセットがかかるように なっていて、単純に考えてカウント周期が100倍?以上になっており、 クロック設定が明らかにおかしい様子です。当方プログラムは WDT以外にも FreeRTOS+TCPや FreeRTOS+FATなども実装しており、誰かが悪さしているのかもしれませんが現時点では見当もついていません。そこでWDTを使用する際に、WDTやクロック発生回路のレジスタ機能以外に考慮しなくてはならない要素など、何かご存じのことがあればどなたかご教授いただけないでしょうか。〇環境・e2studio:v2021-04・FSP:V3.0.0以上、よろしくお願いいたします。
問題解決いたしました。先週 NoMaY様にご指摘いただいた供給クロック設定について見直しましたが、異常は見つけられませんでした。途方に暮れていたのですが、ふと「カウンタ速度が遅いのではなく、カウンタが高速周期的に止まっているのではないか」ということに思いつきました。そこでWDTやクロック周り以外を確認した結果、作成プログラムが使用している外部ライブラリが省電力のため(?)、高速周期で WFI命令を実行して CPUを停止していました。そしてそのライブラリ内の WFI命令を取りやめたところ、期待した時間でリセットできるようになりました。懸念事項を一つずつ確認していった結果、ようやく辿り着くことができました多くのご指摘くださったNoMaY様、本当にありがとうございました。
ososさん、こんにちは。NoMaYです。解決して良かったです。その一方で、今回の件で頭に浮かんできたことを経て、私には、ひとつ新たな知見の習得になりましたね。(1) ウォッチドッグタイマのオプション的機能として低消費電力モード中に停止させる機能は良くあるものな気がする(2) それはそれで良いけれど実はいとも簡単に命令一発で低消費電力モードに遷移出来る(CortexならWFI、RXならWAIT、等)(3) 運悪く割り込み禁止中に暴走して命令列の隙間へ飛んでその後にたまたまそんな命令を実行したらデッドロックしそう(4) そんな気がしてRX651/65Nのハードウェアマニュアルを見直したらWAIT命令では自動的に割り込み許可になるのでした(5) 他方Cortexでは?と思いマニュアルを探して読んでみたのですがちょっと良く分からなかったです、、、ただ、ループで頻繁にWFIを使うのはArmが推奨しているようでした(以下の引用での赤文字は私によるもの)ARMv7-M Architecture Reference Manualdeveloper.arm.com/documentation/ddi0403/ee「B1.5.19 Wait For Interrupt略Note● Arm recommends that software always uses the WFI instruction in a loop, and does not assume that the processor either enters low-power state, or remains in low-power state, after any particular execution of the WFI instruction. This is because:- The architecture defines WFI as a NOP-compatible hint, that the processor can ignore.- A processor can exit the low-power state spuriously, or because of debug, or for some IMPLEMENTATION-DEFINED reason.● Some implementations of Wait For Interrupt drain down any pending memory activity before suspending execution. This increases the power saving, by increasing the area over which clocks can be stopped. The Arm architecture does not require this operation, and software must not rely on Wait For Interrupt operating in this way.」思うに、そう出来るなら、低消費電力モード中にも停止させない、という設定の方が良いのかも知れないです。
NoMaY様FSPのデフォルトでは CPU停止時に WDTカウンタを停止する設定が選択されていますが、仰る通り Armv7-Mの仕様的には WFI命令を多用しても不思議でない感じですので WDTを使用する際は意識的に CPU停止時にも WDTカウンタは停止させない設定にした方が無難のようですね。(もちろん FSP使用時に限った話ではありませんし、すべて自作コードで 開発する場合は自由にすればよいのでしょうが)大変勉強になりました