RA6M5 CPUにてWDTを試しているがカウントがうまくいかない

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

以上、よろしくお願いいたします。

Parents
  • ososさん、こんにちは。NoMaYと申します。

    すみません、RAマイコンは使ったことはないですが、RXマイコンにもあるオプション設定メモリの設定項目にWDTの設定も追加されていて、そちらの設定が優先される設定になっているということはないでしょうか?

  • NoMaY様
    ご返答ありがとうございます。

    RA(RA6M5)では、ユーザが任意のタイミングでWDTを開始できるモード(レジスタスタートモード)に"していなければ"、
    ご指摘通り、オプション設定メモリの設定値が使用され、プログラムで設定したWDTレジスタ通りにはWDTが動かないようです。

    ただ、改めて確認しましたが、やはり設定としてレジスタスタートモードが選択されており、オプション設定メモリの設定が影響されているようにも見えない様子でした。
    (念のため試しに、オプション設定メモリの設定値を、WDTレジスタの設定と同じにしてみましたが動作は変わりませんでした)

  • ososさん、こんにちは。NoMaYです。

    そうでしたか。他に、マニュアルを見て気になる表現が『セキュアデベロッパーのみがオートスタートモードまたはレジスタスタートモードを選択可能』ですね。(すみません、使ったことがなく私には良く分からないですが、でも気になりました。)

    そこも大丈夫ということになると、私ですと、一般論的ですけれど、以下を調べ始めるかな、と思います。(確認済みでしたら、すみませんけれど、でも、期待通りにダウンカウントして、アンダーフローして、それでも200秒後にリセットが発生するとしたら、マイコンの動作的/仕様的に問題あり、っぽい気もします。)

    ● 本当に50MHzのPCLKBがWDTに供給されているか?

    マニュアルを見ると、カウンタがカウントダウンしていく様子は読み出せるようですので、一時的に、割り込み禁止(クリティカルセクションに入れるだけでなく完全に割り込み禁止)にして、NOPを100個~1万個ほど実行させてみて、どんな風にカウントダウンしていくか調べる

    ちなみに、NOP 9万個までの#defineなら作ったことがあります。(行番号はいずれズレるかも知れません。)

    github.com/NoMaY-jp/FreeRTOS_examples_for_Renesas_R_CPUs/blob/main/13_RTOSDemo/RL78_RL78G14_FPB_GCC_e2studio/src/platform.h#L161
     

  • ososさん、こんにちは。NoMaYです。

    あと、気になるといえば、デバッガの設定で何かあったりしないだろうか?ですね。素直に2秒毎にクリアしないといけないなら、それではデバッグ出来ないですよね?(なぜならブレーク中にリセットが発生してしまいますので。と、ふと頭に思い浮かんだのです。)

  • ososさん、こんにちは。NoMaYです。

    もうひとつ気になったのですが、すみません、ちなみに、WDTCRの設定値を変更して(例えば、タイムアウト期間を変えたり、クロック分周比を変えたり)して、リセットが掛かるまでの時間は変わるのでしょうか?

Reply
  • ososさん、こんにちは。NoMaYです。

    もうひとつ気になったのですが、すみません、ちなみに、WDTCRの設定値を変更して(例えば、タイムアウト期間を変えたり、クロック分周比を変えたり)して、リセットが掛かるまでの時間は変わるのでしょうか?

Children
  • ososさん、こんにちは。NoMaYです。

    ずっと考えていた訳ではもちろんありませんが、RTOS特有で間違えることがあるとしたら、自分では最初のリフレッシュの前にWDTCRを初期化したつもりでも、それぞれのタスクの開始順序が想定通りではなくて、既に他タスクでリフレッシュが行われた後だった、ということもあるかも知れない、と思い浮かびました。

    これは、チェック用のフラグ変数を用意して、リフレッシュと同時にそちらにもフラグを立てて、WDTCRの初期化処理のところでそのフラグを見てみることで分かるかな、とも思いました。

  • NoMaY様
    様々な観点からのご指摘ありがとうございます。

    1.クロック設定レジスタしか確認していなかったですので、もう少し
     PCLKBを怪しんでクロック周りの確認をしてみようと思います。
     参考のコードまで上げていただきありがとうございます

    2.デバッガを付けた状態/外した状態では同じ状況となっています。
     ルネサス様サンプルもそうでしたが、デバッガでCPUブレーク中は
     WDTのカウンタが停止しているようなので、デバッガによる影響は
     あまり無いのかな?と感じております。
    (一応、RA CPUはデバッグに関連して DBGSTOPCRレジスタなるものがあり、
     WDTに影響与える設定があることだけは私も把握しています。
     ただ弄ってみたもののリセット速度に影響を感じられなかったです)

    3.WDTCRの設定のうち、RPESシンボルやCKSシンボルを変えてみたところ
     リセットまでの時間が変わりました。
     どうやら分周機能やコンペア機能は(正しく1/4分周などが為されているかは
     別として)生きている様子です。

    4.デバッグ用に、WDTをリフレッシュするタスクのみを動かすように
     変えてみましたが、問題が起きてしまいました。


    色々ご指摘いただいて調査した感じ、最初のご指摘であり、まだ調べ切れていない
    「本当に50MHzのPCLKBがWDTに供給されているか」という点が問題な気がしてきましたので
    引き続きクロック周りを調べてみようと思います。