r_flash_rx のサンプルについて

RX71M StarterKit を使用してフラシュアクセスのデモ(flash_demo_rskrx64m)をテストしています。

デモ単体では動作確認できたのですが、CMT(r_cmt_rx)を組み込んでLEDを点灯させようとしました。

フラシュのデモは動作して、CMTのLED点灯だけでも動作しましたが、両方を同時に実行したらフラッシュのアクセス時に停止してしまいました。

(たぶん、CMTの割り込みでハングした)

RXのフラッシュ・アプリケーションノートによると、FRDYI割り込み(ベクタ23)を使用しているとの事で、

デモプログラムでは

static void flash_copy_vector_table(void)
{
uint32_t *pvect_table;

pvect_table = (uint32_t *)__sectop("C$VECT");
ram_vector_table[23] = pvect_table[23];
set_intb((void *)ram_vector_table);
}

と在ったので、23以外(0~255)もコピーするようにしました。(CMTの割り込みベクタもコピー??)

ベクタテーブルのコピーだけではだめで、

さらに、フラッシュにアクセス(R_FLASH_Open)する前に R_CMT_Stop(cmt_hdl); を使用してCMTを停止しないと

フラッシュのEraseで停止する。(停止して、フラッシュアクセス終了で R_CMT_Control(cmt_hdl,CMT_RX_CMD_RESTART,0); でリスタートで問題なし)

フラッシュアクセスとCMT動作は何か関連があるのでしょうか?

フラッシュアクセス時はCMTを停止する必要がある? (とは思えないので)、

割り込みベクタ関連でコピー以外に何か必要な事があるのでしょうか?

r_flash_fcu.c にある

R_BSP_PRAGMA_STATIC_INTERRUPT(Excep_FCU_FRDYI,VECT(FCU,FRDYI))
FLASH_PE_MODE_SECTION
R_BSP_ATTRIB_STATIC_INTERRUPT void Excep_FCU_FRDYI(void)
{

が関係しているのかな?とは思うのですが、R_BSP_PRAGMA_STATIC_INTERRUPT(Excep_FCU_FRDYI,VECT(FCU,FRDYI)) が

何をしているのか理解できていません。これは一体何を示しているのでしょうか?

よろしくお願いいたします。

  • 失礼しました、flash_demo_rskrx64m_runrom の方でしたか。

    こちらで使用していたのは、flash_demo_rskrx64mでした。

  • ka.makiharaさん、こんにちは。NoMaYです。

    試しに、flash_demo_rskrx64m_runromのmain.cを手元のRX72Nのプロジェクトで使ってみましたが、コードフラッシュの書き換えは出来ました。(RX72Nはタイプ4ということでしたのでR_FLASH_Control(FLASH_CMD_LOCKBIT_DISABLE, NULL)は外しましたけれども。逆にRX71MはRX64Mと同じくタイプ3ということのようですので必要なままの筈と思います。)

  • NoMaYさん、こんにちは。

    こちらも試しに、runrom のプロジェクトを実行してみました。(スマートコンフィグでRX71Mに変更)

    コードフラッシュの書き換えも無事に実行することができました。

    一点、気になったのが、セクション設定で設定していたRPFRAMの追加やROM,RAMマッピングの設定が無いという事です。コードのコピーが無いので当然と思えるので

    実際にテストしているプロジェクト(CS+)でセクション設定、ROM,RAMマッピングを消去しましたが、

    こちらは、(E) F0563100 F0563100:Section address overflow out of range : "RPFRAM" となってしまいました。

    r_flash_rx のコンポーネント設定はどちらも同じにしてあるので、何が影響してoverflow... となっているのか、わかりません。

    runromプロジェクトのmapファイルを見ると、PFRAMセクションはありましたが、RPFRAMはありませんでした。

    何がRPFRAMを必要としているのか調べる方法をご存知ないでしょうか?

  • 自己解決しました。

    内部にR_BSP_SECTOP(RPFRAM);があったので、こちらを消去したところoverflow はなくなりました。

    記述してあるだけで、overflowになるんですね。

    エラーがなくなったところで実行して、無事にベクタコピー無し、ROMでの実行でコードフラッシュの書き換えが実行できました。

    ありがとうございます。