AN-1471: ADuCM4050 のフラッシュ・メモリを利用したEEPROM エミュレーション
はじめに
不揮発性のデータ・ストレージは、多くの組み込みシステムに欠くことのできないものです。ブートアップ構成、キャリブレーション定数、ネットワーク関連情報などのデータは、通常、EEPROM(Electronically Erasable Programmable Read Only Memory)デバイスに保存されます。これらのデータの保存にEEPROMを使用する利点は、EEPROM 上の他のロケーションの内容に影響を与えることなく、1 バイト単位でデータの書き換えや更新を行えることです。
ADuCM4050 は、フラッシュ・メモリを内蔵した超低消費電力のマイクロコントローラ・ユニット(MCU)です。ADuCM4050には、72 ビット幅のデータ・バスを備えた512kB の組み込みフラッシュ・メモリがあり、このデータ・バスにより1 回のアクセスで、2 個の32 ビット・ワードのデータと、それに対応する8 ビットのエラー訂正コード(ECC)バイトを送ることができます。このECC はDuCM4050 のユーザ・スペース上でデフォルトで有効化されており、これによってフラッシュの初期化機能が期待どおりに動作します。ECC チェックは、ADuCM4050 のフラッシュ・メモリの全ユーザ・スペースに対して有効化されています。ECC エラーが読出し動作でレポートされると、ECC エンジンは自動的に1 ビット・エラーの場合は訂正し、2 ビット・エラーの場合は検出レポートのみを行います。フラッシュで読出しが行われると、適切なフラグがADuCM4050のステータス・レジスタにセットされます。割込みが生成されると、割込みの原因となったECC エラーのソース・アドレスがFLCC0_ECC_ADDR レジスタで読出し可能となり、割込みサービス・ルーチン(ISR)によって読出しが行われます。
内蔵フラッシュ・メモリでEEPROM をエミュレートすれば、設計からEEPROMを除外できるので、部品表(BOM)コストを削減でき、ユーザが書き込む必要のあるコードの複雑さが軽減されます。
背景
通常、フラッシュ・メモリはページの配列として構成されます。ADuCM4050 の1 ページには2kB の容量があります。ページの内容は、データを書き込む前に消去する必要があります。消去動作はページ全体に対して行われますが、読出しや書込みは、アドレス指定可能な1 つのロケーション(バイトまたはワード)に対して行うことができます。
アドレス指定可能な1 つのロケーションを対象とする読出しと書込みには、次のような課題があります。
- 通常、フラッシュ・メモリは書込み動作や消去動作をブロックレベルで行うため、1 バイト幅での読出し動作や書込み動作は困難である。
- フラッシュ・メモリの消去はページ全体に対して行われるため、任意のロケーションにあるデータを消去または更新する一方で、他のロケーションにあるデータを維持することが困難である。
このアプリケーション・ノートでは、図1 に示すように、ADuCM4050 デバイスと内蔵フラッシュ・メモリを使ってEEPROM をエミュレートするソフトウェアについて説明します。
EEPROM のエミュレーション・コードのブロック図を図2 に示します。上位レベルの機能でEEPROM エミュレーションを実行し、下位レベルの機能ではフラッシュの管理とアドレス変換を行います。
動作原理
EEPROMをエミュレートするには、フラッシュ・メモリの一部をエミュレーション専用に割り当てる必要があります。ほとんどのEEPROMでは、1回の書込みコマンドで更新できるデータは1バイトだけです。フラッシュ・メモリ・デバイスには複数バイトを書き込む機能が備わっており、それに応じてデータを更新できますが、それは2回の書込み動作の間に消去シーケンスを設定した場合に限られます。1バイトの書込みと読出しが可能なEEPROMをフラッシュ・メモリでエミュレートするには、EEPROM動作と同様の読出し、変更、書込みシーケンスを設定する必要があります。
このアプリケーション・ノートに示す手順では、フラッシュ・ページを2ページ使用しますが、これらのページを3ページ以上に拡張して、セクタ・タグで構成される複数のセクタに分割することができます。このセクタ・タグは、現在処理中のセクタと、そのセクタに書き込まれるデータのバイト数に関する情報を提供します。どのセクタも最後のロケーションがセクタ・タグ用に予約されており、そのサイズは、フラッシュ・メモリのデータ・バスのサイズと同じです。フラッシュ・ページ内のセクタ・サイズとセクタ数は、エミュレートされるEEPROMのサイズに依存します。
EEPROM
EEPROMの書込みおよび読出し機能には、EEPROMのデータやアドレス情報など、アプリケーション・コード入力の処理が含まれます。EEPROMのAPI(Application Programming Interface)は、フラッシュ・インターフェースの条件に従ってデータやアドレス情報を処理し、提供します。
EEPROMの初期化
EEPRROM動作を初期化することで、EEPROMのサイズとエミュレートするEEPROMのデータのワード長が設定されます。このアプリケーション・ソフトウェアでは、EEPROMエミュレーションがデータの完全性を維持できるように2ページ分のフラッシュ・ページが予約されているため、エミュレートするEEPROMの最大サイズは2kB(1フラッシュ・ページ)です。同じアプリケーション・ソフトウェアでフラッシュ・ページの予約が2ページから4ページに拡張されている場合は、この制限も拡張できます。ユーザが設定できるワード長は、8ビットから最大64ビットまでです。init_eeprom(uint16_t eeprom_size, uint8_t word_length)関数の詳細については、表1を参照してください。
Parameter | Description | Return Value |
eeprom_size | エミュレートするEEPROMのサイズ。 | エラーなし。書込みは正常に実行されました。 |
word_length | エミュレートするEEPROMに書き込まれるデータ・ワード長の有効な値は、8、16、32、64です。 | エラー。指定したアドレスは使用可能なEEPROMメモリ空間の外にあります。 |
1 この関数は、EEPROMにデータを書き込みます。
EEPROMへの書込み
EEPROMの書込み動作のフローチャートを図3に示します。EEPROMの書込み動作手順は以下のとおりです。
- find_current_sector()関数を呼び出して、現在のセクタを検索します。この検索は、セクタ・タグとこれに対応するセクタ・タグ値に基づきます。戻り値は現在のセクタ開始アドレスで、これはフラッシュ・メモリの物理的な場所です。
- 現在のセクタ開始アドレスに基づいて、 EEPROM アドレスをフラッシュ・アドレスに変換 します。 ADuCM4050 のフラッシュ・メモリのデータ・バスは 64 ビット幅で、エミュレートする EEPROM のデータ・バスは 8 ビット幅なので、ソフトウェアが EEPROM アドレスから必要シフト数を決定します。
- 取得したフラッシュ・アドレスのデータを読み出します。データが 0xFF に等しい場合、書き込むデータはまず 2 つの32 ビット・データ( pack_lower_data()と pack_upper_data())にまとめられ、 64 ビット幅のデータがフラッシュ・メモリに書き込むため に用意されます。
- write_flash()関数を呼び出し、フラッシュ・コントローラに対して書込みコマンドを実行します。この関数の入力パラメータは、フラッシュ・メモリ・アドレスとパッケージ化された 64 ビット幅のデータです。
- フラッシュ・メモリへの書込み動作が正常に終了した後、update_tag()関数を呼び出して、現在のセクタのセクタ・タグを更新します。
得られたフラッシュ・アドレスにデータが既に存在する場合、データ読取り関数は0xFFを返しません。この場合、得られたフラッシュ・アドレスの前後にあるデータは、move2nextsector()関数を呼び出すことによって、次のセクタ、つまり隣接セクタに移動します。EEPROMデータは、LSBおよびMSBデータ・パケットに変換され、次のセクタの新しいフラッシュ・アドレスに書き込まれます。既に書込み済みのEEPROMのロケーションに書込み命令が送出されるたびに、データは、変更されたデータを格納するロケーションを含む次のセクタに移されます。
新しいセクタが次ページにある場合は、データ移動後に前ページ上でerase_flash(page_number)を呼び出すことによって、フラッシュ・ページ消去コマンドが送出されます。全てのアドレス・レジスタが、move2nextpage()関数によって更新されます。
write_eeprom(uint16_t addr_eeprom, uint8_t data_eeprom)関数の詳細については、表2を参照してください。
Parameter | Description | Return Value |
addr_eeprom | データが書き込まれるEEPROM空間内の論理アドレス。 | エラーなし。書込みは正常に実行されました。 |
data_eeprom | addr_eepromによってポイントされるEEPROM空間に書き込まれるデータ。 | エラー。指定したアドレスは使用可能なEEPROMメモリ空間の外にあります。 |
1 この関数は、EEPROMにデータを書き込みます。
EEPROMの読出し
EEPROMの読出し動作のフローチャートを図4に示します。EEPROMの読出し動作手順は以下のとおりです。
- read_eerprom(addr)関数を呼び出して、アドレス・ロケーションに保存された EEPROM 値を読み出します。
- アプリケーション・コードからの EEPROM 読出し要求において、ソフトウェアは、最新のデータで構成される現在のセクタを最初に決めます。フラッシュ・アドレスは、EEPROM アドレスと現在のセクタ開始アドレスでわかります。
- 得られたフラッシュ・アドレスを使って read_flash()関数を呼び出し、読出しコマンドを実行します。
- そのフラッシュ・アドレスから取得した 64 ビット幅のデータを処理します。その後、このアドレスのビットはマスクされ右シフトされて、アプリケーション・コードに返されます。
read_eeprom(uint16_t addr_eeprom)関数の詳細については、表3を参照してください。
Parameter | Description | Return Value |
addr_eeprom | データが読み出されるEEPROM空間内の論理アドレス。 | 値。アプリケーション・コードに8ビット・データが返されます。エラー。指定したアドレスは使用可能なEEPROMメモリ空間の外にあります。 |
1 この関数は、EEPROMにデータを書き込みます。
EEPROMの消去
EEPROMの消去動作のフローチャートを図5に示します。EEPROMの消去動作の手順は以下のとおりです。
- erase_eeprom()関数を呼び出して、フラッシュ・メモリに割り当てられた EEPROM 空間全体を消去します。
フラッシュ・メモリ内の、EEPROMエミュレーション専用に割り当てられた全てのページが消去されます。アプリケーション・コード内でこの操作を使用する場合は、注意が必要です。
erase_eeprom()関数の詳細については、表4を参照してください。
Parameter | Description | Return Value |
Not applicable | この関数はEEPROMに割り当てられた全てのフラッシュ・ページを消去します。 | エラーなし。消去は正常に実行されました。 エラー。フラッシュ・コントローラがビジー状態で消去を実行できません。 |
1 この関数はEEPROMメモリ空間を消去します。この関数を呼び出すと、全てのデータが失われます。
Flash
ADuCM4050プロセッサは512kBの組み込みフラッシュ・メモリを内蔵しており、フラッシュ・コントローラを介してアクセスすることができます。組み込みフラッシュ・メモリは72ビット幅のデータ・バスを備えており、1回のアクセスで、2個の32ビット・ワードのデータと、それに対応する8ビットのECCバイトを送ることができます。メモリはそれぞれ2kBずつのページで構成され、更に256バイトがECC用に予約されています。デフォルトでは、ECCはADuCM4050のフラッシュの全ユーザ空間で有効化されています。フラッシュのロケーションへの書込みによって、そのロケーションのデータとECCバイトが更新されます。フラッシュ・メモリは、消去手順を経て初めてビット値をロジック0からロジック1に変更できるので、1回の書込み動作しか許可されません。そのため、ECCバイトが更新されるのは1回のみです。消去手順を経ずに同じロケーションへの書込みを再度実行すると、ECCエラーが発生します。
フラッシュへの書込みフラッシュ・メモリは、消去時には各ビットを1に設定し、データの書込みやプログラム時には該当ビットを選択的に0にクリアすることで動作します。書込み動作でビットを0から1に設定することはできません。このため、一般的な書込みアクセスの際は、予め消去動作を行う必要があります。
キーホール書込みは間接的な書込み動作で、通常はユーザがプログラムするコードによって、ターゲット・アドレスとデータ値を使ってメモリ・マップ・レジスタがプログラムされ、その後にバックグラウンドで書込み動作を行うよう、フラッシュ・コントローラにコマンドが送られます。フラッシュ・コントローラは、キーホール書込みによるフラッシュ・メモリへの書込みアクセスだけをサポートしています。書込みアクセスに関するこの制約により、フラッシュ・コントローラによる書込みは、アトミックなダブル・ワード(64ビット)動作として正しく行われます。
EEPROMのデータを使って生成されるLSBおよびMSBデータ・パケットは、キーホール・データ・レジスタに送られます。書込みコマンドがアサートされると、フラッシュ・コントローラは、所定のフラッシュ・アドレスへの64ビットのデュアル・ワード書込みを開始します。フラッシュ・メモリへのワード(32ビット)、ハーフ・ワード(16ビット)、バイト(8ビット)の書込みは、ADuCM4050フラッシュ・メモリではサポートされていません。
write_flash(uint32_t addr, uint32_t lower_data, uint32_t upper_data)関数の詳細については、表5を参照してください。
Parameter | Description | Return Value |
addr | EEPROMエミュレーション用に割り当てられたフラッシュ・メモリ空間内のアドレス。 | エラーなし。書込みは正常に実行されました。 |
lower_data | ダブル・ワードの下位32ビット。 | エラー。指定したアドレスは使用可能なEEPROMメモリ空間の外にあります。 |
upper_data | ダブル・ワードの上位32ビット。 |
1 この関数は、変換されたEEPROMアドレスとデータをwrite_eeprom()関数から受信して、フラッシュ・コントローラへ書込みコマンドを送出します。
フラッシュの読出し
フラッシュ・メモリは、自動初期化プロセス後にのみ読み出すことができます。フラッシュ・メモリを読み出すと、64ビットのダブル・ワードが返されます。
フラッシュ・アドレス情報はフラッシュ・コントローラに提供され、それによって読出しデータが返されます。このデータが更にEEPROMインターフェースで処理され、EEPROM値が得られます。
read_flash(uint32_t addr)関数の詳細については、表6を参照してください。
Parameter | Description | Return Value |
addr | EEPROMエミュレーション用に割り当てられたフラッシュ・メモリ空間内のアドレス。 | データの読出し。マスキング用に64ビット・データが返され、戻り値としてread_eeprom()関数へ送信されます。 エラー。変換したアドレスは、割り当てられたフラッシュ・メモリ空間の外にあります。 |
1 この関数は、変換されたEEPROMアドレスをread_eeprom()関数から受信して、フラッシュ・コントローラへ読出しコマンドを送出します。
フラッシュの消去
EEPROMへの書き込み中にページが変更されると、erase_flash(page)関数を呼び出すことによって、前ページ上でページ消去コマンドがアサートされます。ページ消去の前には、EEPROMへの書込みのセクションで説明したように、データの移動が行われます。
erase_flash(uint8_t PAGE)関数の詳細については、表7を参照してください。
Parameter | Description | Return Value |
PAGE | 割り当てられたフラッシュ・メモリ空間のページ番号。 | エラーなし。ページ消去は正常に終了しました。 エラー。指定したページ値は、割り当てられたフラッシュ・メモリ空間の外にあります。 |
1 この関数は、割り当てられたフラッシュ・メモリ空間内にあるページの内容を全て消去します。
制約事項
一般的なEEPROMでは、1つのロケーションが更新されると、消去サイクルを1サイクルだけカウントした後、そのアドレスに書込みを行いますが、他のロケーションは変更しません。
本アプリケーション・ノートで説明したエミュレートされたEEPROMでは、1つのロケーションを更新すると現在のセクタから隣のセクタへデータが移動されて、書込みサイクルの数だけEEPROMサイズが消費されます。ロケーション更新の都度、データが次のセクタに移動し、そのセクタが次ページにある場合はページ消去が実行されます。複数回の書込みを含むデータ移動によって、フラッシュ・メモリの実効的な書き換え回数は減少します。
これらの制約に対処するには、2通りの方法があります。1つ目は、エミュレートするEEPROMのサイズを選択する際に注意を払うことです。EEPROMサイズを小さくするとデータ移動時の書込みサイクルが短くなり、そのため、フラッシュ・メモリの書き換え回数が間接的に増加します。2つ目は、EEPROMへの不要な書込みを避けることです。不要な書込みをなくすことによって、有効書き換え回数が増加します。例えば、システムが書込み命令を出す必要があるのは、電源異常シーケンス時のみです。通常動作時のデータ保存には、RAM(ランダム・アクセス・メモリ)バッファを使用することができます。
エミュレートされたEEPROMへの不要な書込みには、ソフトウェアによって処理できるものもあります。例えば、書込みデータが0xFFで、書込み先ロケーションの現状データが0xFFの場合、フラッシュ・メモリへの書込み命令は送出されません。
まとめ
本アプリケーション・ノートは、ADuCM4050を使ってEEPROMとフラッシュ・メモリの物理的な差を埋めるものです。このエミュレートされたEEPROMは一般的なEEPROMと同様に機能し、シリコン面積、入出力バス・リソース、製造コスト、部品表(BOM)などに関する課題を解決します。
このアプリケーション・ソフトウェアでは、EEPROMエミュレーション用に2ページ分のフラッシュ・ページが予約されているため、8B~2kB(1ページ)の大きなEEPROMサイズがユーザに提供されます。ソフトウェアが4フラッシュ・ページ分に拡張されている場合、最大EEPROMサイズは、8~64ビットに設定可能なワード長を含め、4kBとなります。
エミュレートするEEPROMのサイズとフラッシュ・メモリの書き換え回数はトレードオフの関係にあるので、ハードウェアの効率を向上させるには、適切なサイズを選択する必要があります。ソフトウェアはADuCM4050のフラッシュ・デバイスへの不要な書込みの一部を処理し、これによって書き換え回数が実効的に増加します。