(2016.3.26 Created)
STM32の内蔵Flashへの読み書きを行うクラスです。ここでダウンロードできます。
The class (download here) provide reading/writing functions to STM 32 internal Flash ROM.
Flashなので
となっています。
デバイスごとにFlashのアドレス、Page/Sectorのサイズが異なります。F3Dicovery (F303VC)とNucleoF401REの場合は以下の通りです。
Base classに存在するread関数はそのまま使用可能です。一方write関数は元の値が0xffかどうかを判断し、0xffであればそのまま記入し、違う場合は以下のように動作します。
残り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.
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. |
下記コードは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); }