はじめまして。
私、マイコン初心者でいきなり実践をさせられている者です。
初質問でお手数ですが、わかる方ご返信をお願い致します。
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毎に区切る必要も無いような気がしますが如何なものでしょうか?
拙い文書で恐縮ですが、ご回答よろしくお願い致します。
チョコです。
RL78でFDLは使ったことはありませんが、誰もリプライしていないようなので、コメントします。
FDLのマニュアルには、以下のような記述があります。
FDLのライブラリでは以下のような引数になっていると書かれています。
つまり、ブロックを自由に指定できるということです。
>但し、上記の2関数共に1TARGETブロック(1KBytes)を丸々消去(all 0xFF)してしまうので、工場で1度書き込んだ値が消去されます。
消去が必要なら、残したいデータは前もって読み出し、消去が完了したら、書き戻すようなことも考えられます。
>工場検査工程後又は納入先の工場で、例えばTARGET_BLOCKを1に切り替えてR_FDL_ClearDataFlash(); 又は R_FDL_Erase();を用いて消去して
>納入先の工場で必要な情報をTARGET_BLOCK 1に書き込む。としたいのですが、可能なものでしょうか?
FDLのライブラリの引数を適切に設定すれば、問題なくできるはずです。問題なのは、引数を#defineで定義してしまっていることです。
そのようにしたことをきちんと明確化すべきですが。
以上
チョコ様
ご回答頂き、ありがとうございます。
チョコ様のご指摘を受け、#define TARGET_BLOCK 0を必要な場所で
#undef TARGET_BLOCK
#define TARGET_BLOCK 1
に変更して対応してますが、その後が中々うまくいきません。
とりあえずはご回答ありがとうございました。
TARGET_BLOCKを1に変更するのは、いいのですが、実際に書き込むときのアドレスもこれに合わて、F1400~F17FFの範囲のアドレスになっていますか。
ブロックとアドレスの関係がきちんとしていないとおかしな結果になります。
わわいです
> #define TARGET_BLOCK (0) /* Block number of target(0 ~ 3)
これを修正する必要はありませんし、これを変えてはいけないものです
消去するブロック番号は、その関数の引数に与えます。上記定数はこれには関係しません
ちょこ様
わわい様
ご連絡ありがとうございます。
とした後に、以下ソースのようにすると、相対アドレス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;の時に不具合は発生しません。
長々と長文失礼しました。