&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)