フラッシュ書き換えについて

使用CPU:R5F104JG(RL78/G14)

フラッシュセルフプログラミングライブラリType01を使っております。

目的の内容は以下のことです。

  • 実行中プログラムで、別プロブラムのmotファイル内容をシリアルで受け取る。
  • ライブラリを使用して、motファイル内容を書き込む。
  • 別プログラムを実行する。

 このとき、実行中プログラムはベクタ領域0x0000~と、プログラム領域0x3000~を使用しています。

 別プログラムはセクション設定でプログラム領域を0x4000~に変更しました。

 ここから質問になります。

  • ベクタ領域は「セクション設定」で変更する項目がありませんでしたが、変更する方法はあるのでしょうか?
  • 変更する方法がなければ、別プログラムのベクタ領域(0x0000~)を、ブートクラスタ1のベクタ領域(0x1000~)へ書き込んで良いのでしょうか?
  • ブートクラスタ1のベクタ領域(0x1000~)とプログラム領域(0x4000~)の書き換え後、アドレスジャンプで、0x1000へ飛べば、別プログラムは実行されるのでしょうか?(次回からは、最初の実行中プログラムから立ち上げたいので)

誠に申し訳ありませんが、宜しくお願い致します。

  • Kirin様 NoMaY様

    管理人のAyrです。

    プログラムのソースコード等で書き込みが上手くいかないときは

    プログラムの部分だけ、テキストファイルにしておいて

    書込みフォームに入ってから画面下の"USE RICH FORMATTING"をクリックした後に

    テキストをドラッグアンドドロップしてみてください。

     

    ここにテキストファイルをリンクしてみます。

    TEST.txt
    
    
    
    -----------------------------------------------------------------
    EVP(Chip/BOOTSWAP) 01 00 08 05 04 00 10 00 04 00 26
    ACK 01 00 03 05 00 09
    WRITEDATA 01 01 02 06 
    D8 00 FF FF 05 02 0C 20 0A 02 14 20 18 20 1C 20 
    20 20 24 20 28 20 2C 20 30 20 34 20 38 20 3C 20 
    40 20 44 20 48 20 4C 20 50 20 54 20 58 20 5C 20 
    60 20 64 20 68 20 6C 20 70 20 74 20 78 20 7C 20 
    80 20 84 20 88 20 8C 20 90 20 94 20 98 20 9C 20 
    A0 20 A4 20 A8 20 AC 20 B0 20 B4 20 B8 20 BC 20 
    C0 20 C4 20 C8 20 CC 20 D0 20 D4 20 D8 20 DC 20 
    E0 20 E4 20 E8 20 EC 20 F0 20 F4 20 F8 20 FC 20 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF E8 84 00 00 00 00 00 00 00 00 00 00 FF FF 
    FF FF FF FF FF FF FF FF 61 CF 51 00 71 8C 71 09 
    FE CB F8 20 FE FC 7E 07 00 36 C2 F5 FC 0B 0B 00 
    53 C0 F6 93 93 58 20 FE DF F9 41 00 36 44 02 34 
    BC 01 00 08 05 08 00 20 00 04 00 3A
    -----------------------------------------------------------------
    EPV(Block) 01 00 08 05 04 00 10 00 04 00 26 
    ACK 01 00 03 05 00 09 
    WRITEDATA 01 01 02 06 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
    0A

  • NoMaYさん
    FTDIのNull modem cable usb(ケーブルの両端がUSB Aコネクタ)を使うとCOMポート出力を別のCOMポートで受けられるので、GUIから出力されたデータをターミナルソフトで簡単に見ることができます。
    (RL78のボードを使わず確認してます^-^)
  • Ayrさんコメントありがとうございます。
    Ayrさんは非表示になった投稿見えるんですねー^^
  • 返答が遅くなり、大変申し訳ありません。
    検証が終わりました。


    NoMaY様が2019/3/24に回答されました方法を試しました。

    アプリケーション(0x1000~0x1FFF、0x4000~0x4FFF)、
    ブートローダ(0x0000~0x0FFF、0x3000~0x3FFF)に配置されるように作成。
    ※アプリケーションは単体での動作確認済み。

    以下、検証結果になります。



    1)0x04000~0x17FFFをFSL_Eraseで消去。
    ※戻り値が全て「FSL_OK」なのを確認。

    2)ブートローダ側で、アプリケーションのmotファイルを読み込み、FSL_Writeにて全て書き込みました。
    ※戻り値が全て「FSL_OK」なのを確認。
    ※アプリケーションのベクタ配置は変更が出来なかったので、ブートローダでmotファイル読み込み時に、0x0000~0x0FFF→0x1000~0x1FFFへ振替。
    ※書き込み後、ブートローダは正常に実行されていた。

    3)書き込み後、FSL_SwapBootClusterを実行するとCPUがリセットされ、ブートローダ側が再び起動した。
    電源を入れ直しても、ブートローダ側が起動された。

    4)FSL_SwapBootClusterのマニュアルを読むと、「FSL_ChangeInterruptTableで割り込みの飛び先をRAMの~」とあるが、
    RAMのどの位置を指定すればよいのか、また、RAMへ何かデータをコピーする必要があるのか不明です。



    CPUがリセットするのは、FSL_ChangeInterruptTableでRAMを指定してないのが原因でしょうが、使い方が判りません。

    色々と回答を書いて頂き、誠にありがとうございます。
  • FSL_SwapBootClusterの処理が完了する前に割り込みの必要がなければ、FSL_ChangeInterruptTableを実行する必要はありませんでした。
    誠に申し訳ありません。


    しかし、FSL_SwapBootClusterを実行するとCPUがリセットしてしまい、ブートローダ側が起動する問題の原因が判りません。

    試しに、FSL_InvertBootFlagを実行してブートフラグを反転してみたら、CPUがリセットして何も起動しなくなり、
    電源を入れ直しても、何も起動しなくなりました。切替部分を教えて頂けないでしょうか?
  • 誠に申し訳ありません。
    FSL_SwapBootClusterで、アプリケーション側に正常に切り替わりました。

    FSL_Write時のアドレス指定を間違えており、修正すると正常に動きました。

    色々と教えて頂き、誠にありがとうございます。
    本当に助かりました。
  • こんにちは。NoMaYです。#私の過去のリプライへの自己フォローです。すみません。

    CC-RLを使った場合にアドレス上位側のブートクラスタの領域を空けるプロジェクトの例を以下のスレッドに投稿しました。(なお、このスレッドですけれど、かふぇルネの投稿システムの変更が過去にあった影響で、投稿が表示される順番が当時とは変わってしまっていて、さすがにちょっと時系列が分かり難くなってしまっているところがありますね。)

    CS+ for CCでのセクション割り当ての方法
    community-ja.renesas.com/cafe_rene/forums-groups/beginners/f/002-2095199602/9859/cs-for-cc/48057#48057
    issue_RL78F13_64K_20230128.zip

    時系列の件:

    その当時も、ちょっと話が飛んでいた箇所もあったのですけれども、整理すると、以下の順番でリプライが続いていました。


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

    RL78のブートスワップ機能を使おうとされていますでしょうか?



    miesuge2さん、こんにちは。NoMaYです。

    以下はType01のマニュアルの画面コピーなのですが、FSL_InvertBootFlag()を呼び出す必要は無く、



    miesuge2さん、こんにちは。NoMaYです。

    質問された内容を何度も読み返しているうちに、私が勘違いしたかも知れない気がしてきました。