EEPROM
名称
仮想EEPROMクラスライブラリ
/icons/hr.icon
概要
仮想EEPROMクラスライブラリは、チップ内フラッシュメモリを利用してEEPROMをエミュレート(仮想EEPROM)するライブラリです。チップ内フラッシュメモリの一部をソフトウェアにてEEPROMのように利用します。仮想EEPROMに書き込んだデータは、マイコンボードの電源を落としても保持されます。
仮想EEPROMはチップ内フラッシュメモリの2ページ(1024バイト×2または2048バイト×2)を利用しています。
(マイコンチップのフラッシュメモリ容量が128kバイトを超える製品では1ページのサイズは2048バイトとなります)
フラッシュメモリの書込み回数の制約を考慮し、同じアドレスへの繰り返し書き込みに対して書き込み位置を分散しています。
仮想EEPROMへのデータ保存は2バイト単位(変数のバイト数と同じ)です。
保存可能なデータ量はページサイズ ÷ 4 - 1 ワードとなります。ページサイズが1024の場合、255ワード(510バイト)です。
データの読書き時に指定するアドレスは実際にはアドレスではなく、検索キーです。0~65535の間に任意で利用出来ます。
1データに付き、検索キー2バイト+データ2バイトの計4バイトを利用します。
補足
STM32の内部フラシュメモリは2バイト単位で書き込むことが出来ます。一度書き込んだ値を変更する場合は、ページ単位で消去してからの書込みとなります。書込み時に頻繁に消去が行わないように本仮想EEPROMは2ページを領域を効率良く利用しています。同じアドレス(検索キー)の値を頻繁に更新するような書き込みを行った場合、更新値は物理的にはフラッシュメモリー上の別アドレスに「検索キー2バイト+データ2バイト」の計4バイトが書き込まれます。指定したアドレス(検索キー)で値を参照する場合、フラッシュメモリ上の末尾から検索し、最後に書き込んだ値を返します。
頻繁に書き込みを行い、ページ内の未使用領域を使い果たした場合は、もう一つのページを消去後、現在ページの重複キーデータを除去した内容をコピーして、利用するページを切り替えます(ガベージコレクション処理)。
頻繁にデータ更新を行った場合、上記のガベージコレクション処理が頻繁に発生し、書込み処理に時間がかかる場合があります。またデータ数(検索キー数)が保存可能上限数に近い場合、頻繁にガベージコレクションが発生します。フラッシュメモリの書込み回数の制約を考慮して利用する場合は、データの頻繁な更新は避け、保存データ件数も抑えることを推奨します。
ライブラリ リファレンス
/icons/hr.icon
仮想EEPROMの利用には定義済インスタンスEEPROMオブジェクトを利用します。
EEPROMオブジェクトはclass EPROMClassのインスタンスです。
メンバー変数(プロパティ)
■ uint32 PageBase0 :仮想EEPROMで利用するフラッシュメモリのページ番号0の先頭バイトアドレス
■ uint32 PageBase1 :仮想EEPROMで利用するフラッシュメモリのページ番号1の先頭バイトアドレス
■ uint32 PageSize :フラッシュメモリのページ内バイトサイズ(1024 または 2048)
仮想EEPROMを利用において、利用前にPageBase0、PageBase1、PageSizeに適切な値を設定する必要があります。
PageSizeは利用するマイコンチップのフラッシュメモリ容量が128kバイト以下の場合は1024となります。
128kバイトを超える場合は、2048となります。
Blue Pillボード(STM32F103C8、STM32F103CB)では1024となります。
PageBase0、PageBase1はフラッシュメモリ上の任意のページ番号の先頭バイトアドレスを指定することが出来ます。ただし、ブートローダ及びスケッチで利用するページを避けるため、最終ページ、最終ページ-1を利用することを推奨します。
STM32マイコンではフラッシュメモリの先頭アドレスは0x8000000です。先頭の8kバイトはブートローダが占有します。
STM32F103C8T6でフラッシュメモリサイズ 64kバイトの場合、
ページサイズ :1024バイト
総ページ数 :64
ページ番号範囲 :0 ~ 63
最終ページ、最終ページ-1の62、63を利用する場合、
最終ページ-1の先頭バイトアドレス =0x8000000 + 1024 x 62 = 0x800F800
最終ページの先頭バイトアドレス =0x8000000 + 1024 x 63 = 0x800FC00
となります。
よって、EEPROMの各プロパティの設定は
EEPROM.PageSize = 1024;
EEPROM.PageBase0 = 0x800F800;
EEPROM.PageBase0 = 0x800FC00;
EEPROM.PageSize = 1024;
とします。
STM32F103C8T6:フラッシュメモリサイズ 128kバイトの場合(隠れ領域が利用出来る場合)
ページサイズ :1024バイト
総ページ数 :128
ページ番号範囲 :0 ~ 127
最終ページ、最終ページ-1の126、127を利用する場合、
最終ページ-1の先頭バイトアドレス =0x8000000 + 1024 x 62 = 0x801F800
最終ページの先頭バイトアドレス =0x8000000 + 1024 x 63 = 0x801FC00
となります。
よって、EEPROMの各プロパティの設定は
EEPROM.PageSize = 1024;
EEPROM.PageBase0 = 0x801F800;
EEPROM.PageBase0 = 0x801FC00;
EEPROM.PageSize = 1024;
とします。
この設定は、setup()で行います。
code:sample1.ino
void setup(){
EEPROM.PageBase0 = 0x801F000;
EEPROM.PageBase1 = 0x801F800;
EEPROM.PageSize = 0x400;
}
利用しているマイコンボードの搭載STM32マイコン及びSTM32マイコンのフラッシュメモリの容量についてはデータシート等にで確認の上、EEPROMのプロパティを設定して下さい。
■ uint16 Status :関数実行後のステータス
列挙型の整数値がセットされます。
EEPROM_OK ((uint16)0x0000) :正常終了
EEPROM_OUT_SIZE ((uint16)0x0081) :pageSizeのページサイズが正しくない
EEPROM_BAD_ADDRESS ((uint16)0x0082) :pageBase0、pageBase1のアドレスが正しくない
EEPROM_BAD_FLASH ((uint16)0x0083) :フラッシュメモリ異常
EEPROM_NOT_INIT ((uint16)0x0084) :初期化されていない
EEPROM_SAME_VALUE ((uint16)0x0085) :指定したアドレスに同じ値を書き込んでいる
EEPROM_NO_VALID_PAGE ((uint16)0x00AB) :ページが保存領域として有効でない
メンバー関数(メソッド)
コンストラクタ
■ EEPROMClass(void)
EEPROMインスタンスを生成します。
定義済みEEPROMオブジェクトとは別に仮想EEPROMを利用したい場合に利用します。
コンストラクタで生成したインスタンスを利用する場合、別途プロパティの設定が必要となります。
初期化関数
■ uint16 init(void)
■ uint16 init(int32 pageBase0, uint32 pageBase1, uint32 pageSize)
仮想EEPROMの初期化を行います。保存領域の初期化(フォーマット)も行われます。
write()、read()等の関数を利用する際、仮想EEPROMの初期化が行われていない場合は内部でinit()が呼び出され、必要に応じて初期化を行います。通常の利用ではinit()利用する必要はありません。
引数
pageBase0、pageBase1、 pageSizeはプロパティpageBase0、pageBase1、 pageSizeにセットされます。
戻り値
処理結果をプロパティStatusにセットします。
関数値としてプロパティStatusの値をそのまま返します。
Statusの値の詳細については、プロパティStatusの参照して下さい。
保存領域の初期化(フォーマット)
■ uint16 format(void)
保存領域の初期化を行います。
pagaBase0、pageBase1の領域データの消去を行い、管理テーブルの初期設定を行います。
保存しているデータは消去されます。
戻り値
処理結果をプロパティStatusにセットします。
関数値としてプロパティStatusの値をそのまま返します。
Statusの値の詳細については、プロパティStatusの参照して下さい。
データの読み込み
■ uint16 read (uint16 address)
指定したaddress(実際には検索キー)に対応する(最後に格納された)データを返します。
引数
address :格納時に指定したアドレス(実際には検索キー)
戻り値
処理結果をプロパティStatusにセットします。
該当するデータがあった場合、StatusにはEEPROM_OKを返します。
Statusの値の詳細については、プロパティStatusの参照して下さい。
該当するデータがあった場合、その値を戻り値として返します。
該当するデータが無い場合はEEPROM_DEFAULT_DATA(0xFFFF)を返します。
補足
混乱を避けるため、格納する値はEEPROM_DEFAULT_DATA(0xFFFF)以外の値の利用を推奨します。
■ uint16 read (uint16 address, uint16 *data)
指定したaddress(実際には検索キー)に対応する(最後に格納された)データをdataに返します。
引数
address :格納時に指定したアドレス(実際には検索キー)
data :指定したアドレスの格納データ(OUT)
戻り値
処理結果をプロパティStatusにセットします。戻り値はStatusの値を返します。
該当するデータがあった場合、StatusにはEEPROM_OKを返します。
Statusの値の詳細については、プロパティStatusの参照して下さい。
該当するデータがあった場合、その値をdataに返します。
該当するデータが無い場合はdataにEEPROM_DEFAULT_DATA(0xFFFF)を返します。
補足
混乱を避けるため、格納する値はEEPROM_DEFAULT_DATA(0xFFFF)以外の値の利用を推奨します。
■ uint16 write(uint16 address, uint16 data)
EEPROMに可変データを書込み/更新します。
引数
address :格納先アドレス(実際には検索キー)
data :書き込むデータ
戻り値
FLASH_COMPLETE(0) : 書込み成功
EEPROM_BAD_ADDRESS : アドレスが正しくない
EEPROM_PAGE_FULL :ページ内の書込み可能領域が満杯
EEPROM_NO_VALID_PAGE :ページが保存領域として有効でない
EEPROM_OUT_SIZE: :空のEEPROM変数がない場合
■ uint16 update(uint16 address, uint16 data)
EEPROMに可変データを書込み/更新します。
この関数はwrite()と異なり、同じアドレスにすでに保存されている値と異なる場合にのみ書き込まれます。
引数
address :格納先アドレス(実際には検索キー)
data :書き込むデータ
戻り値
FLASH_COMPLETE(0) : 書込み成功
EEPROM_SAME_VALUE :同じデータが既に書き込まれている
EEPROM_BAD_ADDRESS :アドレスが正しくない
EEPROM_PAGE_FULL :ページ内の書込み可能領域が満杯
EEPROM_NO_VALID_PAGE :ページが保存領域として有効でない
EEPROM_OUT_SIZE: :空のEEPROM変数がない場合
状態参照
■ uint16 erases(uint16 *Erases)
現在のページの消去処理を行った回数(カウンタ)を引数Erasesの指すアドレスに返します。
引数
Erases :現在のページの消去カウンタの値を格納するアドレス(OUT)
戻り値
処理結果をプロパティStatusにセットします。
関数値としてプロパティStatusの値をそのまま返します。
Statusの値の詳細については、プロパティStatusの参照して下さい。
■ uint16 count(uint16 *Count)
領域に保存しているデータ数を引数Countの指すアドレスに返します。
引数
Count :領域に保存しているデータ数を格納するアドレス(OUT)
戻り値
処理結果をプロパティStatusにセットします。
関数値としてプロパティStatusの値をそのまま返します。
Statusの値の詳細については、プロパティStatusの参照して下さい。
■ uint16 maxcount(void)
保存可能な最大テータ数を返します。
戻り値
保存可能な最大テータ数:ページサイズ ÷ 4 - 1 の値
関連項目
/icons/hr.icon
このドキュメントは、たま吉がEEPROMライブラリのソースを解析し執筆ししています。