コンフィギュレーション領域(オプション設定メモリ)へのセルフプログラム方法について

はじめまして。

困りごとがあり、ここで質問させてください。

RX651(or RX65N)を使用しているのですが、コンフィギュレーション領域(オプション設定メモリ)への
セルフプログラムが出来ません。
マニュアルの通りに実行して一見書き換えられている様に見えるのですが、
実際は書き換えられていない様で、本当にコンフィギュレーション領域を
セルフプログラミングできるのか疑問に思っています。

試した内容は以下です。

「RX65Nグループ、RX651グループ フラッシュメモリ ユーザーズマニュアル ハードウェア インタフェース編」
を参考に実装していて、CS+のメモリウィンドウ上では書き換えに成功している様に見えるのですが、
「デバッグ」→「デバッグ・ツールから切断」→「デバッグ・ツールへ接続」とすると値が書き込み前の状態に戻っています。
同様の処理手順(FACIコマンドは相応の物に変更している)でプログラム領域を書き換える事は出来ているのですが、
コンフィギュレーション領域が書き換える事が出来ていません。
セルフプログラミングにより、コンフィギュレーション領域を書き換えることはできるのでしょうか?

書き込み前

書き込み後

デバッグツール再接続後

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

    以前に、かふぇルネのスレッドで、以下のような印象を持ったことがあります。今回の件は、CS+で(つまりHEWで無くても)その通りのことが行われたのではないか、という可能性が気になりました。

    HEWで作成したソフトのE1エミュレータでのライト(ダウンロード)の違い
    community-ja.renesas.com/cafe_rene/forums-groups/mcu-mpu/rx/f/forum5/5905/hew-e1/32796#32796

    (A) HEWはデバッグ情報のみのダウンロードでもフラッシュメモリ上のエンディアン指定データ用のアドレスの内容を書き換えている可能性が高そうな予感がします。さらに、接続することだけでも書き換えてる可能性がありそうな予感がします。(以下からの推測ですが。)


    それで、こちらでちょっと分からないのは、添付されていた2枚目の画面コピーは、エンディアンを切り替えた後なので、FE7F_5D03番地が書き換わっているように見ているけれども(そのこと自体はCS+の何かの事情?内部処理的には常にワード長で読み出している?なのかな、とも思いましたが)、もともと書き換えたのはFE7F_5D00番地のエンディアン設定データでしょうか?

    および、電圧検出0レベル、でしょうか。

    それから、もうひとつちょっと分からないのは、電圧検出0レベルはともかくとして、エンディアン設定データをセルフプログラミングで書き換える、ということをされようとしているのは、ダウンロードするアプリケーションに応じて切り替えられる、そういう汎用的なブートローダを開発しておられるのでしょうか?それとも、なにかCS+の不具合のようなものが関係しているのでしょうか?

  • NoMaYさん、ご連絡ありがとうございます。

    下記回答致します。

    >FE7F_5D03番地が書き換わっているように見ているけれども
    CS+の設定をビッグエンディアンにしてコンパイルした時に
    出力されるmotファイルの中身を見たところ、FE7F_5D03にF8を書き込む
    内容となっていました。

    実際のmotファイルの該当部分は以下です。
    S311FE7F5D00FFFFFFF8FFFFFFFFFFFFFFFF27

    この事からコンフィギュレーション領域はエンディアンビットに関係なく
    ビッグエンディアンで書かれていると推測しています。


    >エンディアン設定データをセルフプログラミングで書き換える、
    >ということをされようとしているのは、ダウンロードするアプリケーションに応じて切り替えられる、
    >そういう汎用的なブートローダを開発しておられるのでしょうか?
    基板製造工場で動作試験を行うプログラムがリトルエンディアン、
    製品プログラムがビッグエンディアンという不整合があり、
    試験の最後に製品プログラムに書き換えるという工程があるため、
    本課題が発生しております。


    ビッグエンディアンのプロジェクトをCS+で開きマイコンに書き込み、
    CS+を閉じてリトルエンディアンのプロジェクトをCS+で開き、
    「デバッグ」→「デバッグ・ツールへ接続」を行うと以下のメッセージが出ました。

     >Warning: 内蔵フラッシュROMのMDEレジスタのMDEビットを書き換えました。(W1811110)

    デバッグ・ツールへ接続するだけでコンフィギュレーション領域を
    書き換えられてしまうようですので、
    違う確認方法を検討&実験してみます。

  • d,nさん、
    かふぇルネ管理人です。

    d,nさんの上記書込みはシステムがSPAMと判断したため非公開となっていました。
    同じ文字の繰り返しがSPAMと判断されたようです。
    管理人の権限で書込みを公開の設定に変更しました。

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

  • d.nさん、こんにちは。NoMaYです。

    ちょっと気になったのですけれども、書き換えプログラムというのは、ビッグエンディアン、リトルエンディアン、どちらなのでしょうか?以下で、試験の最後に製品プログラムに書き換える、ということであれば、動作試験を行うプログラムのリトルエンディアン、ということになるのでしょうかね。[追記] ごめんなさい、最初の御質問を振り返ってみれば、そもそもそういう状況についてのスレッドでしたね、失礼しました。

    > >エンディアン設定データをセルフプログラミングで書き換える、
    > >ということをされようとしているのは、ダウンロードするアプリケーションに応じて切り替えられる、
    > >そういう汎用的なブートローダを開発しておられるのでしょうか?
    > 基板製造工場で動作試験を行うプログラムがリトルエンディアン、
    > 製品プログラムがビッグエンディアンという不整合があり、
    > 試験の最後に製品プログラムに書き換えるという工程があるため、
    > 本課題が発生しております。

    他方で、そういえば、I/Oレジスタでは以下の記載がハードウェアマニュアルにあるのですけれども、しいて言えばエンディアンとしてはどちらなのかということに関しては、記載は無かったのでした。I/Oレジスタに関しては、例えば、32ビットのリード/ライトが正しく動く、のであればエンディアン自体は気にしなくて良い、ということで良いと思うのですけれども、オプション設定メモリに対するFACIコマンドって、16バイト単位、での書き換えですよね?だから、私は、エンディアンをきちんと把握出来ていないとちょっと怖い気がしたのですけれども、ビッグエンディアンであると推測しても大丈夫なのでしょうか、、、

    > >FE7F_5D03番地が書き換わっているように見ているけれども
    > CS+の設定をビッグエンディアンにしてコンパイルした時に
    > 出力されるmotファイルの中身を見たところ、FE7F_5D03にF8を書き込む
    > 内容となっていました。

    > 実際のmotファイルの該当部分は以下です。
    > S311FE7F5D00FFFFFFF8FFFFFFFFFFFFFFFF27

    > この事からコンフィギュレーション領域はエンディアンビットに関係なく
    > ビッグエンディアンで書かれていると推測しています。


    2.5.2 I/O レジスタアクセス
    I/O レジスタはビッグエンディアン、リトルエンディアン設定に関わらず、固定アドレスに配置されています。したがってI/O レジスタへのアクセスは、エンディアン変更の影響を受けません。I/O レジスタの配置については、各章のレジスタの説明を参照してください。


    なお、そのmotファイルのそのデータに関しては、FITのBSPモジュールの以下のソースから、確かにそのようにコンパイル/リンクされてmotファイルに出力されるもの、というのは理解出来るのです。ただ、単に、コンパイルオプションでビッグエンディアン指定したから、そのバイトの並び順で出力された、だけ?、ということもあったりしないだろうかと気になるのですけれども。

    vecttbl.c

    #ifdef __BIG
        #define BSP_PRV_MDE_VALUE (0xfffffff8)    /* big */
    #else
        #define BSP_PRV_MDE_VALUE (0xffffffff)    /* little */
    #endif



    #if defined(__CCRX__)

    #pragma address __MDEreg     = 0xFE7F5D00



    const uint32_t __MDEreg     = (BSP_PRV_MDE_VALUE & BSP_PRV_BANK_MODE_VALUE);

     

  • d.nさん、こんにちは。NoMaYです。

    既に時間が経過していますので、既に把握済みかも知れませんが、ちょっと気になったので、今一度FITのBSPモジュールのvecttbl.cを確認してみました。オプション設定メモリに対してエンディアンを固定するような記述はされていませんので、例えば以下のような設定に対し、リトルエンディアンとビッグエンディアンとで、コンパイル/リンクしたmotファイル上でのバイトの並び順は以下のように異なったものになります。ですので、FACIコマンドで(16バイト単位で)オプション設定メモリを書き替える場合、どちらのバイトの並び順でなければいけないのか、やはりデリケートな案件な気がするのですけれども。

    /* Configure WDT and IWDT settings.
       OFS0 - Option Function Select Register 0
           b31:b29 Reserved When reading, these bits return the value written by the user. The write value should be 1.
           b28     WDTRSTIRQS - WDT Reset Interrupt Request - What to do on underflow (0=take interrupt, 1=reset MCU)
           b27:b26 WDTRPSS   - WDT Window Start Position Select - (0=25%, 1=50%, 2=75%, 3=100%,don't use)
           b25:b24 WDTRPES   - WDT Window End Position Select - (0=75%, 1=50%, 2=25%, 3=0%,don't use)
           b23:b20 WDTCKS    - WDT Clock Frequency Division Ratio - (1=PCLKB/4, 4=PCLKB/***, 0xF=PCLKB/128, 6=PCLKB/256,
                                                                     7=PCLKB/2048, 8=PCLKB/8192)
           b19:b18 WDTTOPS   - WDT Timeout Period Select (0=1024 cycles, 1=4096, 2=8192, 3=16384)
           b17     WDTSTRT   - WDT Start Mode Select - (0=auto-start after reset, 1=halt after reset)
           b16:b15 Reserved (set to 1)
           b14     IWDTSLCSTP - IWDT Sleep Mode Count Stop Control - (0=can't stop count, 1=stop w/some low power modes)
           b13     Reserved (set to 1)
           b12     IWDTRSTIRQS - IWDT Reset Interrupt Request - What to do on underflow (0=take interrupt, 1=reset MCU)
           b11:b10 IWDTRPSS - IWDT Window Start Position Select - (0=25%, 1=50%, 2=75%, 3=100%,don't use)
           b9:b8   IWDTRPES - IWDT Window End Position Select - (0=75%, 1=50%, 2=25%, 3=0%,don't use)
           b7:b4   IWDTCKS - IWDT Clock Frequency Division Ratio - (0=none, 2=/16, 3 = /32, 4=/***, 0xF=/128, 5=/256)
           b3:b2   IWDTTOPS - IWDT Timeout Period Select - (0=1024 cycles, 1=4096, 2=8192, 3=16384)
           b1      IWDTSTRT - IWDT Start Mode Select - (0=auto-start after reset, 1=halt after reset)
           b0      Reserved (set to 1)
       Default value is 0xFFFFFFFF.
    */
    //#define BSP_CFG_OFS0_REG_VALUE  (0xFFFFFFFF) /* Generated value. Do not edit this manually */
    #define BSP_CFG_OFS0_REG_VALUE  (0x12345678) /* Generated value. Do not edit this manually */

     
    プロジェクトの設定でリトルエンディアンでコンパイル/リンクした場合:

    S311FE7F5D00FFFFFFFF78563412FFFEFFFF09

     
    プロジェクトの設定でビッグエンディアンでコンパイル/リンクした場合:

    S311FE7F5D00FFFFFFF812345678FFFFFEFF10

     

Reply
  • d.nさん、こんにちは。NoMaYです。

    既に時間が経過していますので、既に把握済みかも知れませんが、ちょっと気になったので、今一度FITのBSPモジュールのvecttbl.cを確認してみました。オプション設定メモリに対してエンディアンを固定するような記述はされていませんので、例えば以下のような設定に対し、リトルエンディアンとビッグエンディアンとで、コンパイル/リンクしたmotファイル上でのバイトの並び順は以下のように異なったものになります。ですので、FACIコマンドで(16バイト単位で)オプション設定メモリを書き替える場合、どちらのバイトの並び順でなければいけないのか、やはりデリケートな案件な気がするのですけれども。

    /* Configure WDT and IWDT settings.
       OFS0 - Option Function Select Register 0
           b31:b29 Reserved When reading, these bits return the value written by the user. The write value should be 1.
           b28     WDTRSTIRQS - WDT Reset Interrupt Request - What to do on underflow (0=take interrupt, 1=reset MCU)
           b27:b26 WDTRPSS   - WDT Window Start Position Select - (0=25%, 1=50%, 2=75%, 3=100%,don't use)
           b25:b24 WDTRPES   - WDT Window End Position Select - (0=75%, 1=50%, 2=25%, 3=0%,don't use)
           b23:b20 WDTCKS    - WDT Clock Frequency Division Ratio - (1=PCLKB/4, 4=PCLKB/***, 0xF=PCLKB/128, 6=PCLKB/256,
                                                                     7=PCLKB/2048, 8=PCLKB/8192)
           b19:b18 WDTTOPS   - WDT Timeout Period Select (0=1024 cycles, 1=4096, 2=8192, 3=16384)
           b17     WDTSTRT   - WDT Start Mode Select - (0=auto-start after reset, 1=halt after reset)
           b16:b15 Reserved (set to 1)
           b14     IWDTSLCSTP - IWDT Sleep Mode Count Stop Control - (0=can't stop count, 1=stop w/some low power modes)
           b13     Reserved (set to 1)
           b12     IWDTRSTIRQS - IWDT Reset Interrupt Request - What to do on underflow (0=take interrupt, 1=reset MCU)
           b11:b10 IWDTRPSS - IWDT Window Start Position Select - (0=25%, 1=50%, 2=75%, 3=100%,don't use)
           b9:b8   IWDTRPES - IWDT Window End Position Select - (0=75%, 1=50%, 2=25%, 3=0%,don't use)
           b7:b4   IWDTCKS - IWDT Clock Frequency Division Ratio - (0=none, 2=/16, 3 = /32, 4=/***, 0xF=/128, 5=/256)
           b3:b2   IWDTTOPS - IWDT Timeout Period Select - (0=1024 cycles, 1=4096, 2=8192, 3=16384)
           b1      IWDTSTRT - IWDT Start Mode Select - (0=auto-start after reset, 1=halt after reset)
           b0      Reserved (set to 1)
       Default value is 0xFFFFFFFF.
    */
    //#define BSP_CFG_OFS0_REG_VALUE  (0xFFFFFFFF) /* Generated value. Do not edit this manually */
    #define BSP_CFG_OFS0_REG_VALUE  (0x12345678) /* Generated value. Do not edit this manually */

     
    プロジェクトの設定でリトルエンディアンでコンパイル/リンクした場合:

    S311FE7F5D00FFFFFFFF78563412FFFEFFFF09

     
    プロジェクトの設定でビッグエンディアンでコンパイル/リンクした場合:

    S311FE7F5D00FFFFFFF812345678FFFFFEFF10

     

Children
  • ご連絡、ありがとうございます。
    お返事いただいた内容、こちらでも把握し、
    リトルエンディアンのプログラムで、ビッグエンディアンのmotファイルをセルフプログラミングする場合、4byteエンディアン変換を行いながら書き込まないと並び順が変わってしまい正しく書き込めないという結論に至りました。

    4byteエンディアン変換を行いながら書き込むことで、リセット後、ビッグエンディアンのプログラムが動作することまで確認できました。

    重ね重ね、ありがとうございました。