※ ChatGPTを利用し、要約された質問です(原文:アルファーボード AP-AH4A)
アルファーボードでフラッシュROMにデータを書き込む方法について
このQ&Aのポイント
アルファーボード上のCPU-SH4AをC言語で書いたプログラムから動かす設計をしています。
アルファーボードには8MBのフラッシュROMが搭載されており、そのフラッシュROM上の「あるセクタ」に対して、外部からデータを書き込むルーチンを作成していますが書き込めません。
具体的な動作は、232Cより取り込んだデータをRAMに蓄えて、フラッシュ1セクタ(32kワード)を丸ごとRAMに展開し、232Cからのデータとマージし、もとのフラッシュ1セクタへ書きもどしてやる。
現在、アルファーボード上のCPU-SH4AをC言語で書いたプログラムから動かす設計をしています。
アルファーボードには8MBのフラッシュROMが搭載されており、そのフラッシュROM上の「あるセクタ」に対して、外部からデータを書き込むルーチンを作成していますが書き込めません。
具体的な動作は、232Cより取り込んだデータをRAMに蓄えて、フラッシュ1セクタ(32kワード)を丸ごとRAMに展開し、232Cからのデータとマージし、もとのフラッシュ1セクタへ書きもどしてやる。
「ROM化支援機能」を使って、実際の消去、書き込みルーチンはRAM上で動作させ、処理終了後、ROM領域のルーチンへ復帰する。
こんな事を行った経験のある方がいらっしゃったら、ヒントでもサンプルでも良いので御教え頂けないでしょうか?
お礼
御教えいただき、有難う御座います。過去解答の内容を拝見いたします。 OSレスです。マルチや、スレッドが動くプログラムでもありません。シリーズに上から下へ流れる、テストプログラムです。 (1)RAM上でのプログラム駆動が問題なくできているか ・マップがRAMアドレスになっている点と、RAM上プログラムの頭にブレークポイントを仕掛け、アドレスを確認するとRAMアドレスになっています。 (2)FlashRomへのコマンド発行がきちんとできているか ・セクタアドレス上に発行していると思うのですが、確認する手段がわかりません。プログラムを見て頂けませんでしょうか? ハード上フラッシュROMは16ビットアクセスになっていますので、コマンド書き込み、データ書き込みともにアドレスは偶数へセットしなければなりません。マニュアルにあるコマンド発行時のAAA、555番地指定ではアドレスが偶数にならないので1ビット左シフトして使用しています。 //以降RAMプログラム srcdata = (USHORT*)FLASHWORK; //RAM WORK:0xD010000 wrtadr = (USHORT*)sctadr; //セクタの先頭アドレス //Unlock Bypassを使って連続モードにする adr = (USHORT*)(sctadr); //セクタの先頭アドレス adr1 = (USHORT*)(sctadr | 0x00000AAA); //1STアドレス + 555 adr2 = (USHORT*)(sctadr | 0x00000554); //2NDアドレス + 2AA *adr1 = 0xAA; *adr2 = 0x55; *adr1 = 0x20; //連続書込み中、終了アドレスまで以下を繰り返す for( i=0; i<SECT32KWORD; i++ ) { *adr = 0xA0; //PROGRAM COMMAND save = *srcdata; *wrtadr = save; //データ書き込み //ポーリング if( FlashDataPolling( wrtadr, save ) ) { rtncd = 2; //Fail break; } else{ //ベリファイ if( *wrtadr != save ) { rtncd = 3; //Fail break; } } } /* 連続モード解除・リセット */ *adr = 0x90; *adr = 0xF0; //------------------------------------------------------- アルゴリズムが妥当だと言うことが判っただけでも助かります。 感謝いたします。