FDL使用時、TARGET_BLOCKを変更したい場合

はじめまして。

私、マイコン初心者でいきなり実践をさせられている者です。

初質問でお手数ですが、わかる方ご返信をお願い致します。

FDLの環境構築は済まされていて、前回は工場内の試験工程で#define TARGET_BLOCK 0の、00xF1010のアドレスから4bytesフラッシュ(xxA電流値)を書き換えれば良いだけでした。

流れとしては、

user_define.hでの#define

#define FLASH_START_ADDRESS (0xF1000)   /* Start address of data flash */
#define TARGET_BLOCK (0)   /* Block number of target(0 ~ 3) 
#define BLOCK_SIZE (0x400)   /* Block size */
#define WRITE_SIZE (1)   /* Size of data to be written at once */
#define MAX_VALUE (0xFF)   /* Maximum value of writing */
#define MAX_ADDRESS ((TARGET_BLOCK + 1) * BLOCK_SIZE - 1)   /* Maximum address of writing */
#define PFDL_NG (1)   /* Failure to Data Flash */
#define FDL_FRQ (32)   /* Setting frequency (MHz) */
#define FDL_VOL (0x00)   /* Voltage mode */

r_main.c

#define EEPROM_START_ADDRESS 0x0010   //EEPROMアクセス先頭アドレス

今回は1度上記と同じ工程を踏んだ後、納入先の工場で再度違う情報を書き込む必要があり、書き込む前には

R_FDL_ClearDataFlash(); 又は R_FDL_Erase();を用いて消去する必要がある。と認識しています。

但し、上記の2関数共に1TARGETブロック(1KBytes)を丸々消去(all 0xFF)してしまうので、工場で1度書き込んだ値が消去されます。

理想的なのは、工場検査工程後又は納入先の工場で、例えばTARGET_BLOCKを1に切り替えてR_FDL_ClearDataFlash(); 又は R_FDL_Erase();を用いて消去して

納入先の工場で必要な情報をTARGET_BLOCK 1に書き込む。としたいのですが、可能なものでしょうか?

使用しているマイコンはRL78 G13 RF5F100AA 30pin フラッシュ領域4kbytesです。

逆にTARGET_BLOCKを切り替えられないとなると、4kBYTESを1kBYTES毎に区切る必要も無いような気がしますが如何なものでしょうか?

拙い文書で恐縮ですが、ご回答よろしくお願い致します。

Parents
  • わわいです

    > #define TARGET_BLOCK (0)   /* Block number of target(0 ~ 3) 

    これを修正する必要はありませんし、これを変えてはいけないものです

    消去するブロック番号は、その関数の引数に与えます。上記定数はこれには関係しません

  • ちょこ様

    わわい様

    ご連絡ありがとうございます。

    #undef TARGET_BLOCK

    #define TARGET_BLOCK   1

    とした後に、以下ソースのようにすると、相対アドレス0x410-0x403、絶対アドレス0xF1410-0xF1413となるはずが、

    相対アドレス0x010-0x013、絶対アドレス0xF1010-0xF10103に書き込まれます。

    #define TARGET_BLOCK   1とした後に、変数に代入して値を確認すると1にはなっていました。

    for( adrs=0; adrs < 4; adrs++)
    {
    g_write_value = data_eeprom[adrs];
    g_write_address = adrs + EEPROM_START_ADDRESS + TARGET_BLOCK * BLOCK_SIZE; 

    //↑うまくいけば相対アドレス:adrs(0-3)+0x0010+1*0x400==0x410-0x413
    R_WDT_Restart();
    R_FDL_Init();
    ret = R_FDL_Write();
    PFDL_Close();
    }

    また、

    g_write_address = adrs + 0x400; とすると、そのアドレスに書込み出来ていました。

    #unde-#defineを使うと、挙動がおかしいので、現在変数を使うよう変更しています。

    今回の変更前は他の方が環境構築とコーディングを行っており、FDLの詳しいことは良く分かりません。

    ですので、現在はTARGET_BLOCK 0のみ使用して、自社工場でフラッシュに書き込んだ値を

    納入先の工場で読み込んで、他に必要な情報をまとめて書き込むようにしています。

    本当はTARGET_BLOCK 1も使いたいのですが、上手くいかない。と言った状況です。

    g_target_block = 0;(TARGET_BLOCKを変数化した変数)で、R_FDL_ClearDataFlash();が1回目はOK、

    2回目はハングアップする。ような状態です。g_target_block = 1;の時に不具合は発生しません。

    長々と長文失礼しました。

Reply
  • ちょこ様

    わわい様

    ご連絡ありがとうございます。

    #undef TARGET_BLOCK

    #define TARGET_BLOCK   1

    とした後に、以下ソースのようにすると、相対アドレス0x410-0x403、絶対アドレス0xF1410-0xF1413となるはずが、

    相対アドレス0x010-0x013、絶対アドレス0xF1010-0xF10103に書き込まれます。

    #define TARGET_BLOCK   1とした後に、変数に代入して値を確認すると1にはなっていました。

    for( adrs=0; adrs < 4; adrs++)
    {
    g_write_value = data_eeprom[adrs];
    g_write_address = adrs + EEPROM_START_ADDRESS + TARGET_BLOCK * BLOCK_SIZE; 

    //↑うまくいけば相対アドレス:adrs(0-3)+0x0010+1*0x400==0x410-0x413
    R_WDT_Restart();
    R_FDL_Init();
    ret = R_FDL_Write();
    PFDL_Close();
    }

    また、

    g_write_address = adrs + 0x400; とすると、そのアドレスに書込み出来ていました。

    #unde-#defineを使うと、挙動がおかしいので、現在変数を使うよう変更しています。

    今回の変更前は他の方が環境構築とコーディングを行っており、FDLの詳しいことは良く分かりません。

    ですので、現在はTARGET_BLOCK 0のみ使用して、自社工場でフラッシュに書き込んだ値を

    納入先の工場で読み込んで、他に必要な情報をまとめて書き込むようにしています。

    本当はTARGET_BLOCK 1も使いたいのですが、上手くいかない。と言った状況です。

    g_target_block = 0;(TARGET_BLOCKを変数化した変数)で、R_FDL_ClearDataFlash();が1回目はOK、

    2回目はハングアップする。ような状態です。g_target_block = 1;の時に不具合は発生しません。

    長々と長文失礼しました。

Children
No Data