Internal ROM (STM32)

(2016.3.26 Created) 

 STM32の内蔵Flashへの読み書きを行うクラスです。ここでダウンロードできます。

 The class (download here) provide reading/writing functions to STM 32 internal Flash ROM.

Flashなので

  • 書き込みはバイト単位。Writing unit is byte.
  • 1を0にすることはできるが、0を1にする場合は消去する必要があります。言い換えると元が0xFFならそのまま書き込めます。You can change value only '1' to '0', but can not do '0' to '1'. In other words you can write any value when previous value is 0xff.
  • 消去はページ/セクタ単位で行う。Erasing unit is page/sector.

となっています。

Flash Address

 デバイスごとにFlashのアドレス、Page/Sectorのサイズが異なります。F3Dicovery (F303VC)とNucleoF401REの場合は以下の通りです。

Command reference

 Base classに存在するread関数はそのまま使用可能です。一方write関数は元の値が0xffかどうかを判断し、0xffであればそのまま記入し、違う場合は以下のように動作します。

  1. ページ/セクタ全体を一旦RAMへ退避
  2. ページ/セクタ消去
  3. RAM内で値を記入
  4. ページ/セクタ全体を書き込み。

残りRAMサイズが小さく、セクタ全体を退避できなかった場合はエラーとなり動作停止します。

You can of course use read functions in the base class. Meanwhile, write functions check the previous value, and if the value is 0xff, write directory, if different do followings.

  1. Copy whole sector to RAM.
  2. Erase the sector.
  3. Change value in RAM.
  4. Write back to the sector.

If free RAM space is less than sector size, it will occurs error, and stop the program.

セクタ消去 Delete sector / page

Declaration

DKS_RESULT BlockErase(const uint32_t &Address) const;

Return

RESULT

Parameter

消去するセクタに含まれているアドレス。同じセクタ内であればどのアドレスでも同じ動作になります。

Address that is included the sector to erase. It become same action if the address is in the same sector.

Note

 前のデータは消えて0xFFで埋められます。

Previous data will vanish. And filled by 0xFF.

消去せずに書き込み / write without erase

Declaration

DKS_RESULT WriteWithoutErase(

        const uint32_t &Address,

        uint8_t *Data,

        const uint32_t &Length) const

Return

RESULT

Parameter Address

Start address to write

Data

Data to write

Length

Length of the data

備考

アドレスは2や4で割り切れなければエラーになる可能性があります。そのうち修正するかも。。。

It might be occur error if the address is not align to 2 or 4.

Sample code

下記コードはF3Discovery用です。NucleoF401REも同じような感じで動作します。

The following code is for F3Discovery. NucleoF401RE board also will be same manner.

#include "DKS_Common_F303xC.h"
#include "DKS_InterRom_F303xC.h"

int main(void)
{
        DKS::InitSystem();

        DKS::InterRom rom;

        uint8_t val8 = 0x08;
        uint16_t val16 = 0x0106;
        uint32_t val32 = 0x04030201;
        uint64_t val64 = 0x0F0E0D0C0B0A0908;

        rom.Write(0x0801B000 + 0x03, val8);
        rom.Write(0x0801B000 + 0x15, val16);
        rom.Write(0x0801B000 + 0x27, val32);
        rom.Write(0x0801B000 + 0x38, val64);
        rom.Write(0x0801B000 + 0x2e, val32);

        uint8_t check[0xff];
        rom.Read(0x0801B000, check, 0xff);

        const int length = 64;
        uint8_t data[length] = { 0 };
        for (int i = 0; i < length; i++)
                data[i] = i + 1;
        rom.Write(0x0801B800 + 0x2, data, length);
}