gombeのブログ

マイコンの電子工作系PIC32/KiCad/C/C++/3D/

STM32 FLASHをEEPROM的に使う(1)

膨大なフラッシュを持つマイコンが今多くあります。そんなマイコンのフラッシュを使わないわけないですよね。

というわけでフラッシュの使い方を解説します。が、相変わらず雑ですので。まずマイコンアドレス空間上にRAMやFlashマッピングされています。それをきちんと確認しましょう。これらは実行ファイルを生成する際にリンカスクリプトが必要です(リンカスクリプトはメモリアドレスの定義などをします)がそれを作る際に必要になります。

Flashはプログラム空間と共用です。なので領域をしっかり分ける必要があります。その際にはどこからどこまでをプログラムに当ててEEPROM的に使うのはどの程度の大きさが必要かどうかも考えおく必要があります。今回使うのはちょっとした定数を保存したいだけなので1Kibくらいでいいでしょうか?用意したリンカスクリプトからサイズを引いておくと良いでしょう。

まずは読み取りの仕方です。例えばアドレス0x8000400に読み取りしたいとします。

[c]

define READ_ADD ((void*)0x8000400)

int a = ((int)READ_ADD); [/c]

このようにあらかじめアドレスを定義しておきましょう。こんな感じでとても簡単に読み出せます。

次に書き込み方です。手順は以下の通り。

  1. FlashのUnlockをする。
  2. Flashの任意のページを消去する
  3. FlashのBlankCheckをする。成功すると全部ビットが1になっているはずです。
  4. Flashの書き込みを実行する。
  5. FlashのVerifyを行う。
  6. FlashをLockする。

です。

早速コードを書く前にリンカスクリプトを変更し、コードを上書きしないことを保証しましょう。具体的には私の場合は1kibだけプログラムのサイズを減らしました。そしたらエラーを列挙しましょう。以下のエラーが考えられます。もっと細かくしたらきりがないので。。。

• Unlockエラー •Eraseのエラー •BlanckCheckのエラー •Writeのエラー •Verifyのエラー

これらを列挙するといいでしょう。 今日はここまで。