&size(24){&color(darkgreen){''H8/3048のFlashROMを書き換える''};};
#navi(H8)
~''CONTENTS''
#contents
----
~''REFERENCES''
----
**概略 [#rdb448bc]
-RAM上にデータを用意する。
-RAM上に更新プログラムを用意する。
-RAM上の更新プログラムをCALL
-FlashROMを書き換える。。。FlashROMはアクセス不可になる
-RAM上の更新プログラムからRET

**FlashROMの構成 [#xd7c3c99]
|~ブロック|~サイズ|~アドレス|
|EB0|1Kバイト|000000 - 0003FF|
|EB1|1Kバイト|000400 - 0007FF|
|EB2|1Kバイト|000800 - 000BFF|
|EB3|1Kバイト|000C00 - 000FFF|
|EB4|28Kバイト|001000 - 007FFF|
|EB5|32Kバイト|008000 - 00FFFF|
|EB6|32Kバイト|010000 - 017FFF|
|EB7|32Kバイト|018000 - 01FFFF|


**CPUのモード [#u4a914eb]
-ユーザモード FlashROMは書込み禁止
-ユーザプログラムモード FlashROMは読書き可能 ←今回はこれを使う
-ブートモード FlashROMの自動書換え
-PROMモード ROMライタによる書込み

**ユーザプログラムモードの設定 [#q2af9c22]
-FWE端子に5Vを印加する。
-常時印加してはいけない。書込み、消去時のみ印加する。

**スーパーインポーザ基板の変更 [#rb98305f]
-R9の取り外し
#ref(rw-r9.jpg)
-FWEの制御(PB4を割り当て)
#ref(rw-fwe.jpg)

**RAM上のプログラムのコンパイル [#efebcbe7]
-#pragmaを使う
 例  #pragma section abc
     int a; /*  a は,セクションBabc に割り付きます */
     const int c=1; /*  c は,セクションCabc に割り付きます */
     void f(void) /*  f は,セクションPabc に割り付きます */
        {
        a=c;
        }
 
     #pragma section
     int b; /*  b は,セクションB に割り付きます */
     void g(void) /*  g は,セクションP に割り付きます */
        {
        b=c;
        }
 
 備 考・#pragma section、#pragma abs8 section、#pragma abs16 section、#pragma
         indirect section は関数定義の外で宣言しなければなりません。

-あとはsectionのアドレスを決めればOK
-RAM上のアドレスとROM上のアドレスとはどうやって指定する?
-日立超LSIに質問した。
-こんなかな?
--#pragma section 設定。setjmpしてからCALLして、longjmpで戻るのがミソ
 /*=============================================
 
 	update FlashROM
 
 ===============================================*/
 #pragma section rom
 const char	from_dm[] = "1.0";
 int		from_ddm = 1;
 int		from_rdm;
 
 #pragma option nooptimize
 void cmd_from(void)
 	{
 	int		w;
 
 	for(w = 0; w < 30000; ++w)
 		{
 		led2_off();
 		led2_on();
 		}
 
 	longjmp(jmp_env, 1);
 	}
 #pragma option
 #pragma section

--section設定
#ref(section.JPG)
--rom設定
#ref(rom.JPG)


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS