Generic Content

かふぇるね“ はルネサス製品に対して自由に会話をするツールとなります。(回答者はルネサス社内外の方たちとなります) その為ルネサス製品やソリューションに対して正式な回答をご希望の場合はMyRenesasのTicketシステムを使用するようにお願いいたします。 

Smart Configurator生成のクロック設定で無限ループに陥る

お世話になります。

Smart Configuratorで生成したコードがメインループより前で無限ループに陥ってしまいます。

具体的には、mcu_clocks.cの、clock_source_select()で

if (1 == SYSTEM.HOCOCR.BIT.HCSTP)
{
/* Turn off power to HOCO. */
SYSTEM.HOCOPCR.BYTE = 0x01;
}
else
{
/* WAIT_LOOP */
while(0 == SYSTEM.OSCOVFSR.BIT.HCOVF)
{
/* The delay period needed is to make sure that the HOCO has stabilized. */
R_BSP_NOP();
}
}

となっている部分のelse節側のWAIT LOOPで先に進まなくなってしまいます。

実際、レジスタの値はwhileに入る条件は満たしていることは確認しています。

Smart Configuratorのクロック設定でHOCOクロックにチェックは入れておりません。

また、高速オンチップオシレータは使用する設定になっていいません。

解決策をご教授ください。

よろしくお願いします。

使用環境について

・マイコン:RX651

・Smart Configurator:V2.3.0

・r_bsp (Smart Configuratorコンポーネント)バージョン:5.40

・r_usb_basic (Smart Configuratorコンポーネント)バージョン:1.27

・r_usb_pcdc (Smart Configuratorコンポーネント)バージョン:1.27

になります。

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

    シミュレータで動作させようとされていますか?もしシミュレータで動作させることを意図してなければ、CS+のデバッガ選択の設定が間違ってシミュレータ選択のままになっていないか確認してみて頂けませんか?あるいは、逆にシミュレータで動作させようとされているのであれば、その旨リプリライ頂けますか?

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

    シミュレータとは、RXシミュレータのことでしょうか?

    環境としてはRX E20(JTAG)でデバックしている状態です。

    よろしくお願いします。

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

    デバッガ選択は大丈夫ということですね。外部発振子などが搭載されたボード(RX65N Envision Kit)はあるのですけれども、引っ張り出すのがちょっと難儀なので、今しばらく机上の確認をしたいです。

    この部分の処理はRX Driver Packageの最新版でも同じでしたので、一応前後も分かるようにソースのURLを貼っておきます。この処理は、発想的には、HOCOを使わない場合の念の為の処理、みたいなものとなっているようです。

    github.com/renesas/rx-driver-package/blob/master/source/r_bsp/r_bsp_vx.xx/r_bsp/mcu/rx65n/mcu_clocks.c#L491-L505

    ハードウェアマニュアルを確認したところ、else節のWAIT LOOPの箇所に来たのであれば、デフォルトでHOCOを動作させる設定になっていると思われるのです。(そのこと自体は問題があるわけでは無く、この部分の処理も間違っていないようにも感じているのですが、、、) 気付かずにデフォルトでHOCOを動作させていてトラブルに遭遇した例として、以下のスレッドに関わったことがあるのですけど、同じようにデフォルトでHOCOを動作させる設定にしていないかどうか気になりました。そこはどうでしょうか?(繰り返しますけど、ハードウェアマニュアル上は処理に問題は無い筈のように感じているのですが、、、)

    RX64M スマートコンフィグレータ 期待する速度で動作しない
    japan.renesasrulz.com/cafe_rene/f/forum5/7170/rx64m/38282#38282

    ちなみに、もしも、コンパイラの最適化を有効にしたまま確認したのであれば、最適化を無効にして再度確認してみて頂けますか?(そうしたら、本当の問題箇所はソースの別の場所だった、ということもあり得ますので、、、)

    以下、ハードウェアマニュアルの画面コピーです。

    RX65Nグループ、RX651グループ ユーザーズマニュアル ハードウェア編
    www.renesas.com/jp/ja/document/mah/rx65n-group-rx651-group-users-manualhardware-rev230


     

  • ご返信ありがとうございます。

    最適化を無効にしても変化はありませんでした。

    質問ですが、リンクいただいた過去のスレッドに記載の「リセット後からHOCOを動かす、というチェックボックス」とはどこにあるのでしょうか?

    スクリーンショット頂けるとありがたいです。

    よろしくお願いします。

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

    以下の画面コピーの赤枠の部分です。なお、以下はRXスマートコンフィグレータV2.11のものです。ひょっとするとV2.3では存在しない(まだ実装されていなかった)のかなぁ、、、


     

  • ありがとうございます。

    私の環境ではそのようなチェックボックスが無かったです。

    V2.3だとデフォルトでチェックが入った状態なのでしょうか?

    仮に「リセット後、HOCO発振が有効」となっていることが原因とすると、V2.3で回避するにはどうしたらよいでしょうか?

    V2.3にこだわる必要はないのでバージョンアップすればよいのですが、参考までに教えて頂きたいです。

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

    今の設定がどうなっているかは以下のファイルの以下の部分を見れば分かります。変更方法は、可能性としてですけど、RXスマートコンフィグレータのBSPモジュールの設定画面の中に、OFS1の値、を設定する箇所があるのではないかと思うのです。もし無ければ、次の可能性は、(使っていないかも知れませんが)LVDモジュールですけど、そこにも無ければ、ちょっと思い付かないです。どこにも無ければ、以下のファイルを試しに手作業で変更して、コードを再生成して、そのまま値が残っていれば、手作業で変更するやり方でやることになると思います。再生成して、値が戻ってしまったら、ちょっとやっかいです。

    src/smc_gen/r_config/r_bsp_config.h

    /* Configure whether voltage detection 0 circuit and HOCO are enabled after reset.
       OFS1 - Option Function Select Register 1
           b31:b9 Reserved (set to 1)
           b8     HOCOEN - Enable/disable HOCO oscillation after a reset (0=enable, 1=disable)
           b7:b3  Reserved When reading, these bits return the value written by the user. The write value should be 1.
           b2     LVDAS - Voltage Detection 0 circuit start (1=monitoring disabled)
           b1:b0  VDSEL - Voltage Detection 0 level select (1=2.94v, 2=2.87v, 3=2.80v)
           NOTE: If HOCO oscillation is enabled by OFS1.HOCOEN, HOCO frequency is 16MHz.
                 BSP_CFG_HOCO_FREQUENCY should be default value.
       Default value is 0xFFFFFFFF.
    */
    #define BSP_CFG_OFS1_REG_VALUE  (0xFFFFFFFF)

     
    [追記]

    ちなみに、この定義は以下のソースの以下の場所で使われています。

    src/smc_gen/r_bsp/mcu/rx65n/vecttbl.c

    #if defined(__CCRX__)

    #pragma address __MDEreg     = 0xFE7F5D00
    #pragma address __OFS0reg    = 0xFE7F5D04
    #pragma address __OFS1reg    = 0xFE7F5D08
    #pragma address __TMINFreg   = 0xFE7F5D10
    #if defined(BSP_MCU_RX65N_2MB)
    #pragma address __BANKSELreg = 0xFE7F5D20
    #endif
    #pragma address __SPCCreg    = 0xFE7F5D40
    #pragma address __TMEFreg    = 0xFE7F5D48
    #pragma address __OSIS1reg   = 0xFE7F5D50
    #pragma address __OSIS2reg   = 0xFE7F5D54
    #pragma address __OSIS3reg   = 0xFE7F5D58
    #pragma address __OSIS4reg   = 0xFE7F5D5C
    #pragma address __FAWreg     = 0xFE7F5D64
    #pragma address __ROMCODEreg = 0xFE7F5D70

    const uint32_t __MDEreg     = (BSP_PRV_MDE_VALUE & BSP_PRV_BANK_MODE_VALUE);
    const uint32_t __OFS0reg    = BSP_CFG_OFS0_REG_VALUE;
    const uint32_t __OFS1reg    = BSP_CFG_OFS1_REG_VALUE;
    const uint32_t __TMINFreg   = 0xffffffff;
    #if defined(BSP_MCU_RX65N_2MB)
    const uint32_t __BANKSELreg = BSP_PRV_START_BANK_VALUE;
    #endif
    const uint32_t __SPCCreg    = 0xffffffff;
    const uint32_t __TMEFreg    = BSP_CFG_TRUSTED_MODE_FUNCTION;
    const uint32_t __OSIS1reg   = BSP_CFG_ID_CODE_LONG_1;
    const uint32_t __OSIS2reg   = BSP_CFG_ID_CODE_LONG_2;
    const uint32_t __OSIS3reg   = BSP_CFG_ID_CODE_LONG_3;
    const uint32_t __OSIS4reg   = BSP_CFG_ID_CODE_LONG_4;
    const uint32_t __FAWreg     = BSP_CFG_FAW_REG_VALUE;
    const uint32_t __ROMCODEreg = BSP_CFG_ROMCODE_REG_VALUE;