フラッシュへの書き込みについて

プログラムROMへの書き込みを行うプログラムをしています。
サンプルを見ると、
 ①ブロック消去
 ②ループで書き込み
という方式になっています。
初心者の質問で恐縮ですが、以下について教えてください。
・消去バイト数
  消去開始位置はどうなるのでしょうか?
   データフラッシュのブロック1は、E000~EFFFまでなので
   この方式の場合、E000~EFFEまで消去されるのでしょうか
  任意の場所から消去する事は可能でしょうか?
   E100~EFFEまで消去というのは可能でしょうか?
・最大書き込みバイト数
  サンプルでは、*addr = *(data + 1);を指定し、2バイトを
  書き込みしているように見えます。
  1回で書き込みが可能バイト数はいくつでしょうか?

すみませんが、ご教授ください。
よろしくお願いします。

  • ターゲットとなるマイコンは何でしょうか。ブロック消去や書き込む単位はハードウェアマニュアルに説明があると思いますが。

  • わわいです

    ターゲットがわからないんで一般的なflashROMとして回答しますと、、

    消去ブロックはそのすべての領域が消去されます。途中からとか一部だけの消去はできません

    ブロック書き込みの一回あたりの書き込み量はデバイスごとに違いますんで、そいつのハードウエアマニュアルを参照ください。

  • わわいです

    んで、FlashROMは消去中、データ書き込み中はデータ読み出しができません。

    これがどういうことかというと、プログラムROM上のプログラムから消去、書き込みを行おうとすると、プログラムが暴走する、ってことになります。

    これをど~するかというと、ROM以外の場所から消去、書き込みをすればいいという話になります。

    具体的には、RAMにプログラムを転送してそこから実行する、ってことをやります。

    これまたセクション割当てが楽しくなりそーですが、がんばってください

  • fujita nozomu 様、わわい 様

    返信、遅れまして申し訳ありません。

    ターゲットCPUは、M16C/5Mになります。

    調べる限りは64k単位でしたので、64kとして考えています。

  • わわい 様

    そのセクションについて教えてください。

    セクション指定前が、以下でしたので、F0000以降は未使用になっていました。

    # (2) SECTION INFORMATION                #

    program     REL CODE    0E0100 000005 2     fvector

               (割愛)

    interrupt   REL CODE    0E0478 0000D1 2     initsct

               (割愛)

    fvector     ABS ROMDATA 0FFFDC 000024       fvector

    # (3) GLOBAL LABEL INFORMATION           #

    _start          0e054a

    _sub_main       0e0418

    _write_record   000480

    sub_mainにセクションを設定し、リンカのセクション配置で0xf0000を指定しました。

    ----- Cの編集 -----

    #pragma SECTION program submain

    void sub_main()

    {

    }

    結果、以下になってしまいました。

    # (2) SECTION INFORMATION                #

    program     REL CODE    0E0100 000005 2     fvector

               (割愛)

    interrupt   REL CODE    0E0476 0000D1 2     initsct

               (割愛)

    fvector     ABS ROMDATA 0FFFDC 000024       fvector

    submain     REL CODE    100000 000001 2     r01an0395_src

    # (3) GLOBAL LABEL INFORMATION           #

    _start          0e0548

    _sub_main       100000

    _write_record   000480

    指定位置にならないのですが、設定方法がわかあればご教授ください。

  • > データフラッシュのブロック1は、E000~EFFFまでなので

    >    この方式の場合、E000~EFFEまで消去されるのでしょうか

    > ターゲットCPUは、M16C/5Mになります。

    > 調べる限りは64k単位でしたので、64kとして考えています。

    『M16C/5M、M16C/57グループ ユーザーズマニュアル ハードウェア編』の「29. フラッシュメモリ」を確認すると 0E000 以降に配置されるデータフラッシュの説明として「表 29.1 フラッシュメモリの仕様概要」に

    > データフラッシュ 2分割(各4Kバイト)

    とあります。

    セクション云々でまた別の話をされてるようですが、上記マニュアルをよく読まれることをお勧めします。

  • わわいです

    SECTIONの記述がおかしいようなので見直してください。

    んで、これを合わせても思うようには動作はしないとおもわれます。

    プログラムをRAMのアドレスにするだけでは動作しません。

    実際にどう配置され、どう実行されるのかをよく考えましょう

  • fujita nozomuさんのアドバイスの繰り返しになりますが、BltInBgnさんの質問に回答すると、

    ・ハードウエアマニュアルの29.フラッシュメモリの29.1概要にある通りイレーズ方式はブロック消去なのでブロックの一部だけを消去することはできないです。

    ・29.8.6.4プログラムを見る限りでは2ワード(4バイト)単位書き込みのみしかコマンドは無いように思えます。

    です。

    「調べる限りは64k単位でしたので、64kとして考えています。」に関してfujita nozomuさんの回答に補足すると「図 29.1フラッシュメモリのブロック図」が分かりやすいかも?ブロックA(4Kバイト)+ブロックB(4Kバイト)です。

    「プログラムROMへの書き込みを行うプログラムをしています」は、CPU書き換えモードのEW1モードでプログラムROM1のアプリケーションプログラムを書き換えるプログラムROM2のユーザブートプログラムを作成しているということですよね?その後にデータフラッシュの質問になってしまうので少し混乱します。まさかとは思いますが、標準シリアル入出力モードパラレル入出力モードの専用シリアルライタを作成しているとかではないですよね?少し前のリプロに関するスレッドと同じですが、誰が、いつ、何のために、どのようなツールを使ってアプリケーションプログラムを書き換えるのかでユーザブートプログラムは異なってきます。

  • >プログラムROMへの書き込みを行うプログラム

    面倒ですよね、私も以前作成しようとしたことがありますが、調整が大変で、そのうちFDTなるものを探して、これを手放せません、少し書き込むのに苦労することないです、人の作ったものを使いましょう。

  • 皆様のお手を煩わせて申し訳ありません。

    マイコンのプログラムをはじめから作成するのは初めてなので、いろいろパニックになっています。

    皆様に意見を参考に考え直してみます。

    IKUZO様

    FDTというのは何でしょうか?

    可能ならご教授ください。