日本語参考資料
最新版英語アプリケーション・ノートはこちら\

AN-1452
アプリケーション・ノート
ADUCM3027/ADUCM3029 のフラッシュ・メモリを利用した EEPROM エミュレーション
はじめに

背景

不揮発性のデータ・ストレージは、多くの組込みシステムに欠くことのできないものです。ブートアップ構成、補正係数、ネットワーク関連情報などのデータは、通常、EEPROM（Electronically Erasable Programmable Read Only Memory）デバ
イスに保存されます。これらのデータの保存に EEPROM を使用する利点は、EEPROM 上の他のロケーションの内容に影響を与えることなく、1 バイト単位でデータを書き換えたり更新した
りできることです。

通常、フラッシュ・メモリはページの配列として構成されます。ADuCM3027 の 1 ページには 2 kB の容量があります。ページの内容は、データを書き込む前に消去する必要があります。
消去動作はページ全体に対して行われますが、読出しや書込み
は、アドレス指定可能な 1 つのロケーション（バイトまたはワード）に対して行うことができます。

ADuCM3027/ADuCM3029 は、フラッシュ・メモリを内蔵した
超低消費電力のマイクロコントローラ・ユニット（MCU）です。内蔵フラッシュで EEPROM のエミュレーションを行え
ば、設計から EEPROM をなくすことができるので、BOM コストが削減できます。したがって、ソフトウェアもより単純化さ
れます。




アドレス指定可能な 1 つのロケーションを対象とする読出しと書込みには、次のような課題があります。
1 バイト幅のデータの読出しと書込み。
他のロケーションにあるデータを維持しながら、任意のロケーションにあるデータを消去または更新すること（フラッシュ・メモリの消去はページ全体に対して行われるため）。

このアプリケーション・ノートでは、図 1 に示すように、
ADuCM3027/ADuCM3029 デバイスと内蔵フラッシュ・メモリ
を使って EEPROM をエミュレートするソフトウェアについて説明します。

FLASH
INTERFACE
CORE

EEPROM
15618-001

ADuCM3027/
ADuCM3029

図 1. ADuCM3027/ADuCM3029 の内蔵フラッシュと EEPROM システムの概要

USER CODE

write_eeprom8(addr, data)

read_eeprom8(addr)

erase_eeprom8()

pack_lower_data()

find_current_sector()move2nextsector()

EEPROM DRIVER

pack_upper_data()

move2nextpage()

FLASH FUNCTIONS
read_flash(addr)

erase_flash(page_number)

15618-002

write_flash(addr, data)

図 2. ADuCM3027/ADuCM3029 フラッシュ EEPROM エミュレーション・ソフトウェアの構造

アナログ・デバイセズ社は、提供する情報が正確で信頼できるものであることを期していますが、その情報の利用に関して、あるいは利用によって生じる第三者の特許やその他の権利の侵害に関して一切の責任を負いません。また、アナログ・デバイセズ社の特許または特許の権利の使用を明示
的または暗示的に許諾するものでもありません。仕様は、予告なく変更される場合があります。本紙記載の商標および登録商標は、それぞれの所有者の財産です。※日本語版資料は REVISION が古い場合があります。最新の内容については、英語版をご参照ください。。

Rev. 0©2017 Analog Devices, Inc. All rights reserved.

本社／〒105-6891 東京都港区海岸 1-16-1 ニューピア竹芝サウスタワービル
電話 03（5402）8200
大阪営業所／〒532-0003 大阪府大阪市淀川区宮原 3-5-36 新大阪トラストタワー
電話 06（6350）6868

AN-1452

アプリケーション・ノート
目次
はじめに ..............................................................................................1

フラッシュ ..................................................................................... 5

背景 ......................................................................................................1

制約事項 ............................................................................................. 6

改訂履歴 ..............................................................................................2

まとめ ................................................................................................. 7

動作原理 ..............................................................................................3
EEPROM .........................................................................................3

改訂履歴
3/2017—Revision 0: Initial Version

Rev. 0－ 2/8 －

AN-1452

アプリケーション・ノート
動作原理
EEPROM をエミュレートするには、フラッシュ・メモリの一部をエミュレーション専用に割り当てる必要があります。ほとん
どの EEPROM では、1 回の書込みコマンドで更新できるデータ
は 1 バイトだけです。ただし、フラッシュ・メモリ・デバイス
では、2 回の書込み動作の間に消去シーケンスを設定した場合に限り、複数のバイトを書き込み、それに応じてデータを更新することができます。1 バイトの書込みと読出しが可能な
EEPROM をフラッシュ・メモリでエミュレートするには、
EEPROM 動作と同様の読出し、変更、書込みシーケンスを設定する必要があります。
このセクションに示す手順では 2 つのフラッシュ・ページを使用しますが、これらのページを 3 ページ以上に拡張して、セク
ター・タグで構成される複数のセクターに分割することができます。このセクター・タグは、現在処理中のセクターと、そのセクターに書き込まれるデータのバイト数に関する情報を提供します。どのセクターも最後のロケーションがセクター・タグ
用に予約されており、そのサイズは、フラッシュ・メモリのデータ・バスに等しいサイズです。フラッシュ・ページ内のセク
ター・サイズとセクター数は、エミュレートされる EEPROM のサイズに依存します。

EEPROM
EEPROM の書込みおよび読出し機能には、EEPROM のデータやアドレス情報など、アプリケーション・コード入力の処理が含まれます。EEPROM の API（Application Programming
Interface）は、フラッシュ・インターフェースの要求に従ってデータやアドレス情報を処理し、提供します。

EEPROM への書込み
EEPROM の書込み動作のフローチャートを図 3 に示します。
EEPROM の書込み動作手順は以下のとおりです。
1.

2.

3.

find_current_sector（）関数を呼び出して、現在のセクターを検索します。この検索は、セクター・タグと、それに対応するセクター・タグ値に基づいて行われます。返される値は、現在のセクター開始アドレス（フラッシュ・メモリ
上の物理ロケーション）です。
現在のセクター開始アドレスに基づいて、EEPROM アドレ
スをフラッシュ・アドレスに変換します。
ADuCM3027/ADuCM3029 のフラッシュ・メモリのデー
タ・バスは 64 ビット幅で、エミュレートする EEPROM の
データ・バスは 8 ビット幅なので、ソフトウェアが
EEPROM アドレスから必要シフト数を決定します。
得られたフラッシュ・アドレスのデータを読み出します。このデータが 0xFF に等しい場合、フラッシュ・メモリに書き込む 64 ビット幅のデータを作成するために、ビットをマスクして EEPROM データを左シフトすることにより、32ビットの LSB（最下位ビット）および MSB（最上位ビット）データ・パケットを生成します。

Rev. 0

4.

5.

write_flash（）関数を呼び出し、フラッシュ・コントロー
ラに対して書込みコマンドを実行します。この関数の入力
パラメータは、フラッシュ・メモリ・アドレスと、LSB データ・パケットおよび MSB データ・パケットです。
フラッシュ・メモリへの書込み動作が正常に終了した後、update_tag（）関数を呼び出して、現在のセクターのセクタ
ー・タグを更新します。

得られたフラッシュ・アドレスにデータがすでに存在する場
合、データ読取り関数は 0xFF を返しません。この場合は、得られたフラッシュ・アドレスの前後にあるデータは、
move2nextsector（）関数を呼び出すと、次のセクター、つまり隣接セクターに移動します。LSB および MSB データ・パケッ
トに変換された EEPROM データは、次のセクターの新しいフラッシュ・アドレスに書き込まれます。したがって、すでに書き込み済みの EEPROM のロケーションに書込みが行われると、データはその都度、変更されたデータを格納するロケーション含
む次のセクターに移されます。
新しいセクターが次ページにある場合は、データ移動後に前ページ上で erase_flash（page_number）を呼び出すとフラッシュ・
ページ消去コマンドが実行されます。すべてのアドレス・レジ
スタを更新するには、move2nextpage（）関数を使用します。
write_eeprom（uint16_t addr_eeprom, uint8_t data_eeprom）関数の詳細については、表 1 を参照してください。

EEPROM の読出し
EEPROM の読出し動作のフローチャートを図 4 に示します。
EEPROM の読出し動作手順は以下のとおりです。
1.
2.

3.
4.

read_eerprom（addr）関数を呼び出して、アドレス・ロケー
ションに保存された EEPROM 値を読み出します。
アプリケーション・コードからの EEPROM 読出し要求において、ソフトウェアは、最新のデータで構成される現在のセクターを最初に決めます。フラッシュ・アドレスは、
EEPROM アドレスと現在のセクター開始アドレスでわかります。
得られたフラッシュ・アドレスを使って read_flash（）関数を呼び出し、読出しコマンドを実行します。
フラッシュ・アドレスから受け取った 64 ビット幅データを処理します。次に、このアドレスのビットをマスクして右シフトし、アプリケーション・コードに提供します。

read_eeprom（uint16_t addr_eeprom）関数の詳細については、表2 を参照してください。

－ 3/8 －

AN-1452

アプリケーション・ノート
POWER-ON RESET

POWER-ON RESETINITIALISE SYSTEMINITIALISE SYSTEMINITIALISE FLASH FOR
EEPROM EMULATIONAPPLICATION CODE

INITIALISE FLASHFOR EEPROM EMULATION

write_eeprom(addr, data)
APPLICATION CODE
find_current_sector()

read_eeprom(addr)
CONVERT EERPOMADDRESS TO
FLASH ADDRESS

find_current_sector()

READ THE CURRENT DATAAT FLASH ADDRESSCONVERT EEPROM ADDRESSTO FLASH ADDRESSIS DATA =
0xFF?

YES

MOVE TO NEXT SECTOR
IN THE FLASH

pack_lower_data()

pack_upper_data()

NO

READ THE CURRENT DATAAT FLASH ADDRESSMOVE THE DATA FROM STARTADDRESS OF THE CURRENTSECTOR TILL FLASH ADDRESSTO THE NEXT SECTOR

write_flash()update_tag()

update_tag()

RETURN VALUE

図 4. EEPROM 読出し動作

MOVE THE REMAINING DATAAFTER FLASH ADDRESS FROMCURRENT SECTOR TO THE
NEXT SECTORYESIS NEW
SECTORON NEXTPAGE?

NO

move2nextpage()

15618-003

ERASE PREVIOUS PAGE

図 3. EEPROM 書込み動作

Rev. 0－ 4/8 －

15618-004

PROCESS 64-BIT DATA TO GETTHE REQUIRED 8-BIT EEPROM DATAUPDATE THE DATA AT FLASHADDRESS IN THE NEXT SECTOR

AN-1452

アプリケーション・ノート
EEPROM の消去

フラッシュへの書込み

EEPROM の消去動作のフローチャートを図 5 に示します。
EEPROM の消去動作の手順は以下のとおりです。

フラッシュ・メモリは、消去時には各ビットを 1 に設定し、データ書込み（プログラム）時には該当ビットを選択的に 0 にク
リアすることで動作します。書込み動作でビットを 0 から 1 に設定することはできません。このため、一般的な書込みアクセスの際は、前もって消去動作を行う必要があります。

1.

erase_eeprom（）関数を呼び出して、フラッシュ・メモリ
に割り当てられた EEPROM スペース全体を消去します。

キーホール書込みは、ユーザー・コードがターゲット・アドレ
スとデータ値を使ってメモリ・マップ・レジスタをプログラム
し、その後にバックグラウンドで書込み動作を行うよう、フラッシュ・コントローラにコマンドを送る間接的な書込み動作です。
フラッシュ・コントローラは、キーホール書込みによるフラッシュ・メモリへの書込みアクセスだけをサポートしています。書込
みアクセスに関するこの制約により、フラッシュ・コントロー
ラによる書込みは、アトミックなダブル・ワード（64 ビット）動作として正しく行われることが保証されています。

POWER-ON RESETINITIALISE SYSTEMINITIALISE FLASH FOR
EEPROM EMULATIONEEPROM のデータを使って生成される LSB および MSB デー
タ・パケットは、キーホール・データ・レジスタに送られます。書込みコマンドがアサートされると、フラッシュ・コント
ローラは、所定のフラッシュ・アドレスへの 64 ビットのデュア
ル・ワード書込みを開始します。

APPLICATION CODE

erase_eeprom()

ERASE ALL THE PAGES IN THE
ALLOTED FLASH MEMORY

15618-005

ワード（32 ビット）、ハーフ・ワード（16 ビット）、およびバ
イト（8 ビット）書込みはサポートされていません。

図 5. EEPROM 消去動作

フラッシュ・メモリ内の、EEPROM エミュレーション専用に割り当てられたすべてのページが消去されます。このため、アプ
リケーション・コード内でこの操作を使用するときは注意が必要です。
erase_eeprom（）関数の詳細については、表 3 を参照してくださ
い。

フラッシュ
ADuCM3027/ADuCM3029 プロセッサは 128 kB と 256 kB の組込
みフラッシュ・メモリを内蔵しており、フラッシュ・コントローラを介してアクセスすることができます。 組込みフラッシュ・メモリは 72 ビット幅のデータ・バスを備えており、1 回のアクセスで、2 個の 32 ビット・ワードのデータと、それに対応
する 8 ビットのエラー訂正コード（ECC）を送ることができます。メモリはそれぞれ 2 kB ずつのページで構成され、さらに256 バイトが ECC 用に予約されています。

Rev. 0

write_flash（uint32_t addr, uint32_t lower_data, uint32_t
upper_data）関数の詳細については、表 4 を参照してください。

フラッシュの読出し
フラッシュ・メモリは、自動初期化プロセス後にのみ読み出すことができます。フラッシュ・メモリを読み出すと、64 ビットのダブル・ワードが返されます。
フラッシュ・アドレス情報はフラッシュ・コントローラに提供され、それによって読出しデータが返されます。このデータがさらに EEPROM インターフェースで処理され、EEPROM 値が得られます。
read_flash（uint32_t addr）関数の詳細については、表 6 を参照してください。

フラッシュの消去
EEPROM への書き込み中にページが変更されると、erase_flash（page）関数を呼び出すことによって、前ページ上でページ消去コマンドがアサートされます。ページを消去する場合は、前述のように消去前にデータの移動が行われます。
erase_flash（uint8_t PAGE）関数の詳細については、表 5 を参照
してください。

－ 5/8 －

AN-1452

アプリケーション・ノート
制約事項
実際の EEPROM では、1 つのロケーションが更新されると、消去サイクルを 1 サイクルだけカウントした後、そのアドレスに書込みを行いますが、他のロケーションは変更しません。
このエミュレートされた EEPROM では、1 つのロケーションを更新すると現在のセクターから隣のセクターへデータが移動されて、書込みサイクルの数だけ EEPROM サイズが消費されます。したがって、ロケーションの更新の都度、データが次のセクターに移動し、そのセクターが次ページにある場合はページ消去が実行されることになります。この動作によって、フラッ
シュ・メモリの有効書換え回数は減少します。

Rev. 0

これらの制約に対処するには、以下の点に留意します。


エミュレートする EEPROM のサイズを選択する際は注意が必要です。EEPROM サイズを小さくするとデータ移動時の書込みサイクルが短くなり、そのため、フラッシュ・メ
モリの書換え回数が間接的に増加します。
EEPROM への不要な書込みは避けるようにします。不要な書込みをなくすことによって、有効書換え回数が増加します。例えば、システムが書込み命令を出す必要があるのは、
電源異常シーケンス時のみです。通常動作時のデータ保存には、RAM バッファを使用することができます。エミュ
レートされた EEPROM への不要な書込みには、ソフトウ
ェアによって処理できるものもあります。例えば、書き込
みデータが 0xFF で、書き込み先ロケーションの現常デー
タが 0xFF の場合、フラッシュ・メモリへの書込みは行われません。

－ 6/8 －

AN-1452

アプリケーション・ノート
まとめ
このアプリケーション・ノートの目的は、
ADuCM3027/ADuCM3029 を使って、EEPROM とフラッシュ・
メモリの物理的な差を埋めることです。このエミュレートされた EEPROM は実際の EEPROM 同様に機能し、シリコン面積、入出力バス・リソース、製造コストなどに関する課題を解決します。

このアプリケーション・ノートでは、エミュレーション用に大きい EEPROM サイズ（64 バイト ～ 1024 バイト）を設定しています。エミュレートされた EEPROM とフラッシュ・メモリの書換え回数はトレードオフの関係にあるので、ハードウェアの効率を向上させるには、適切なサイズを選択する必要があります。この他、ADuCM3027/ADuCM3029 のフラッシュ・デバイスへの不要な書込みの一部をソフトウェアで処理することで、有効書換え回数は増加します。

表 1. EEPROM 書込み関数の説明
write_eeprom(uint16_t addr_eeprom, uint8_t data_eeprom)1
Return Value

Parameter
addr_eeprom

Description

データが書き込まれる EEPROM 空間内の論理アドレス。

エラーなし。書込みは正常に終了しました。

data_eeprom

addr_eeprom によってポイントされる EEPROM 空間に書き込まれるデータ。

エラー。 指定したアドレスは使用可能な EEPROM メモリ空間の外にあります。

1 この関数は、EEPROM にデータを書き込みます。

表 2. EEPROM 読出し関数の説明
Parameter
addr_eeprom

read_eeprom(uint16_t addr_eeprom)1
Return Value

Description

値。アプリケーション・コードに 8 ビット・データが返されます。

データが読み出される EEPROM 空間内の論理アドレス。

エラー。指定したアドレスは使用可能な EEPROM メモリ空間の外にあります。

1

この関数は、EEPROM からデータを読み出します。

表 3. EEPROM 消去関数の説明
erase_eeprom()1Parameter
Not applicable

Return Value
エラーなし。消去が正常に終了しました。
エラー。フラッシュ・コントローラがビジー状態で消去を実行できません。

1 この関数は EEPROM メモリ空間を消去します。この関数を呼び出すと、すべてのデータが失われます。

表 4. フラッシュ書込み関数の説明
write_flash(uint32_t addr, uint32_t lower_data, uint32_t upper_data)1
Return Value

Parameter
addr

Description

EEPROM エミュレーション用に割り当てられたフラッシュ・メ
モリ空間内のアドレス。

エラーなし。書込みは正常に終了しました。

lower_data

ダブル・ワードの下位 32 ビット。

エラー。指定したアドレスは使用可能な EEPROM メモリ空間の外にあります。

upper_data

ダブル・ワードの上位 32 ビット。

1 この関数は、変換された EEPROM アドレスとデータを write_eeprom（）関数から受信して、フラッシュ・コントローラへ書込みコマンドを送出します。

Rev. 0－ 7/8 －

AN-1452

アプリケーション・ノート
表 5. フラッシュ消去関数の説明
erase_flash(uint8_t PAGE)1
Return Value

Parameterページ。割り当てられたフラッシュ・メモリ空間のページ番号。

エラーなし。ページ消去は正常に終了しました。
エラー。指定したページ値は、割り当てられたフラッシュ・メモリ空間の外にあります。

1 この関数は、割り当てられたフラッシュ・メモリ空間内にあるページの内容をすべて消去します。

表 6. フラッシュ読出し関数の説明
Parameter
addr

Description

read_flash(uint32_t addr)1
Return ValueEEPROM エミュレーション用に割り当てられたフラッシュ・メモリ空間内のアドレス。

データ読出し。マスキング用に 64 ビット・データが返され、戻り値として
read_eeprom（）関数へ送信されます。
エラー。変換したアドレスは、割り当てられたフラッシュ・メモリ空間の外にあります。

1 この関数は、変換された EEPROM アドレスを read_eeprom（）関数から受信して、フラッシュ・コントローラへ読出しコマンドを送出します。

Rev. 0－ 8/8 －