(57)【特許請求の範囲】
【請求項１】
データが格納されるデータ格納領域と、前記データ格納領域におけるデータの消去回数を示す消去回数データが格納される消去回数格納領域とを有する少なくとも１つのフラッシュメモリと、
プロセッサと、前記少なくとも１つのフラッシュメモリとの間に接続される制御回路と、を備え、
前記制御回路は、前記データ格納領域に格納されるデータの前記プロセッサによる変更を許容し、前記消去回数格納領域に格納される消去回数データの前記プロセッサによる変更を抑止し、
前記少なくとも１つのフラッシュメモリは、複数の前記データ格納領域を有し、
前記少なくとも１つのフラッシュメモリは、さらに、前記複数のデータ格納領域のそれぞれに対応するように、複数の前記消去回数格納領域と、前記消去回数データの更新の許可／禁止を示す許可情報が格納される複数の許可情報格納領域とを有し、
前記制御回路は、許可を示す許可情報が格納された許可情報格納領域に対応する消去回数格納領域については前記消去回数データを更新し、禁止を示す許可情報が格納された許可情報格納領域に対応する消去回数格納領域については前記消去回数データの更新を抑止する、
情報処理装置。
【請求項２】
前記制御回路は、前記消去回数格納領域に格納された消去回数データを更新した後に、前記データ格納領域に格納されたデータを消去する、
請求項１に記載の情報処理装置。
【請求項３】
前記消去回数格納領域は、前記消去回数データが格納される第１の消去回数格納領域及び第２の消去回数格納領域を含み、
前記少なくとも１つのフラッシュメモリは、前記第１の消去回数格納領域と、前記第２の消去回数格納領域のいずれが有効か示す領域情報が格納される領域情報格納領域とを含み、
前記制御回路は、前記データ格納領域におけるデータを消去する場合、前記第１の消去回数格納領域及び前記第２の消去回数格納領域のうち、前記領域情報が有効と示す消去回数格納領域から前記消去回数データを取得し、取得した消去回数データを更新して他方の消去回数格納領域に格納し、当該他方の消去回数格納領域を有効と示すように前記領域情報を更新する、
請求項１に記載の情報処理装置。
【請求項４】
前記少なくとも１つのフラッシュメモリは、複数の前記データ格納領域と、複数の前記第１の消去回数格納領域と、複数の前記第２の消去回数格納領域とを有し、
前記制御回路は、前記データを消去するデータ格納領域に対応する消去回数格納領域については、前記領域情報が有効と示す消去回数格納領域から前記消去回数データを取得し、取得した消去回数データを更新して他方の消去回数格納領域に格納し、それ以外の消去回数格納領域については、前記領域情報が有効と示す消去回数格納領域から取得した消去回数データをそのまま他方の消去回数格納領域に格納する、
請求項３に記載の情報処理装置。
【請求項５】
前記プロセッサは、前記許可情報の変更を要求する変更要求データを前記制御回路に送信し、
前記制御回路は、前記プロセッサから受信した変更要求データによって、前記許可情報の禁止から許可への変更が要求された場合には前記許可情報の変更を許容し、前記許可情報の許可から禁止への変更が要求された場合には前記許可情報の変更を抑止する、
請求項１に記載の情報処理装置。
【請求項６】
前記許可情報格納領域は、前記許可情報が格納される第１の許可情報格納領域及び第２の許可情報格納領域を含み、
前記少なくとも１つのフラッシュメモリは、さらに、前記第１の許可情報格納領域と、前記第２の許可情報格納領域のいずれが有効か示す領域情報が格納される領域情報格納領域とを含み、
前記制御回路は、前記許可情報を変更する場合、前記第１の許可情報格納領域及び前記第２の許可情報格納領域のうち、前記領域情報が有効と示さない許可情報格納領域に対して変更後の許可情報を格納し、当該許可情報格納領域を有効と示すように前記領域情報を更新する、
請求項５に記載の情報処理装置。
【請求項７】
前記少なくとも１つのフラッシュメモリは、前記データ格納領域を含む第１のブロックを有する第１のフラッシュメモリと、前記消去回数格納領域を含む第２のブロックを有する第２のフラッシュメモリとを有し、
前記第２のブロックは、前記第１のブロックよりもサイズの小さいデータ消去単位である、
請求項１に記載の情報処理装置。
【請求項８】
前記制御回路は、前記データ格納領域に格納される前記データの前記プロセッサによる変更を許容し、前記消去回数格納領域に格納される前記消去回数データの前記プロセッサによる変更を常時抑止する、
請求項１に記載の情報処理装置。
【請求項９】
前記制御回路は、前記データ格納領域に格納される前記データの前記プロセッサによる変更を許可し、前記消去回数格納領域に格納される前記消去回数データの前記プロセッサによる直接の変更を常に禁止する、
請求項１に記載の情報処理装置。
【請求項１０】
前記少なくとも１つのフラッシュメモリは、前記データ格納領域と、前記消去回数格納領域とを有し、
前記制御回路は、前記データ格納領域及び前記消去回数格納領域を含む前記フラッシュメモリを制御する、
請求項１に記載の情報処理装置。
【請求項１１】
前記制御回路は、
データ変更要求において変更対象として前記データ格納領域が指定された場合に、前記データ格納領域に格納される前記データの前記プロセッサによる変更を許可し、
前記データ変更要求において前記変更対象として前記消去回数格納領域が指定された場合に、前記消去回数格納領域に格納される前記消去回数データの前記プロセッサによる変更を常時禁止する、
請求項１に記載の情報処理装置。
【請求項１２】
前記制御回路は、前記少なくとも１つのフラッシュメモリに対する許可を制御し、前記少なくとも１つのフラッシュメモリの前記消去回数格納領域は、前記制御回路によって前記プロセッサによる直接の制御が禁止される、
請求項１に記載の情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置及びフラッシュメモリ制御方法に関し、例えばフラッシュメモリにおけるデータの消去回数を記録する技術に関する。
【背景技術】
【０００２】
特許文献１には、複数のメモリブロックによって構成されるブロック消去型フラッシュメモリを有する半導体メモリ装置が開示されている。メモリブロックは、最小消去単位である。メモリブロックは、消去カウンタ書込みエリアを含む書き込みステータス書込みエリアを有する。消去カウンタ書込みエリアには、そのメモリブロックが消去された回数が書き込まれる。この半導体メモリ装置は、各メモリブロックの消去カウンタ書込みエリアに書き込まれた消去回数を比較することで、消去された回数が最も少ないメモリブロックにデータを書き込む。
【０００３】
また、特許文献２には、フラッシュメモリを有するデータ記録システムが開示されている。フラッシュメモリには、そのフラッシュメモリへのデータ書込み回数を示す書込み回数データが格納される。このデータ記録システムのＣＰＵは、書込み回数データの値が閾値を超えると、アラームを出力する。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００１−３１２８９１号公報
【特許文献２】特開２００８−１８６２９５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、特許文献１及び特許文献２に開示の技術は、消去カウンタ書込みエリアのデータ（書込み回数データ）が保護されていないため、悪意のある第三者が消去カウンタ書込みエリアのデータ（書込み回数データ）を容易に改ざんできてしまうという問題がある。
【０００６】
その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【０００７】
一実施の形態によれば、情報処理装置は、データ格納領域に格納されるデータのプロセッサによる変更は許容し、データ格納領域におけるデータの消去回数を示す消去回数データのプロセッサによる変更は抑止するものである。
【発明の効果】
【０００８】
前記一実施の形態によれば、フラッシュメモリにおけるデータの消去回数を記録したデータの改ざんを防止することができる。
【図面の簡単な説明】
【０００９】
【図１】実施の形態１に係るマイクロコントローラの構成を示す図である。
【図２】実施の形態１に係るフラッシュシーケンサの構成を示す図である。
【図３】実施の形態１に係るデータ格納用フラッシュメモリと管理ステータス用フラッシュメモリの構成を示す図である。
【図４】実施の形態１に係るフラッシュシーケンサのコマンドを示す図である。
【図５】実施の形態１に係るフラッシュシーケンサのデータ消去処理のフローチャートである。
【図６】実施の形態１に係る管理ステータス用フラッシュメモリの状態遷移図である。
【図７】実施の形態２に係る管理ステータス用フラッシュメモリの構成を示す図である。
【図８】実施の形態２に係るフラッシュシーケンサのデータ消去処理のフローチャートである。
【図９】実施の形態３に係るデータ格納用フラッシュメモリと管理ステータス用フラッシュメモリの構成を示す図である。
【図１０】実施の形態３に係るフラッシュシーケンサのデータ消去処理のフローチャートである。
【図１１】実施の形態３に係るフラッシュシーケンサのコマンドを示す図である。
【図１２】実施の形態３に係るフラッシュシーケンサのカウント許可設定処理のフローチャートである。
【図１３】実施の形態３の変形例に係るフラッシュシーケンサのカウント許可設定処理のフローチャートである。
【図１４】実施の形態４に係るデータ格納用フラッシュメモリと管理ステータス用フラッシュメモリの構成を示す図である。
【図１５】実施の形態４に係るフラッシュシーケンサのデータ消去処理（前半）のフローチャートである。
【図１６】実施の形態４に係るフラッシュシーケンサのデータ消去処理（後半）のフローチャートである。
【図１７】実施の形態４に係るフラッシュシーケンサのコマンドを示す図である。
【図１８】実施の形態４に係るフラッシュシーケンサのカウント上限値設定処理のフローチャートである。
【発明を実施するための形態】
【００１０】
以下、図面を参照しながら、好適な実施の形態について説明する。以下の実施の形態に示す具体的な数値などは、実施の形態の理解を容易とするための例示にすぎず、特に断る場合を除き、それに限定されるものではない。また、以下の記載及び図面では、説明の明確化のため、当業者にとって自明な事項などについては、適宜、省略及び簡略化がなされている。
【００１１】
＜実施の形態１＞
（実施の形態１の構成）
まず、実施の形態１について説明する。図１を参照して、本実施の形態１に係るマイクロコントローラ１の構成について説明する。図１に示すように、マイクロコントローラ１は、ＣＰＵ（Central Processing Unit）２と、ＲＡＭ（Random Access Memory）３と、データ格納用フラッシュメモリ４と、管理ステータス用フラッシュメモリ５と、フラッシュシーケンサ６と、周辺回路７とを有する。
【００１２】
ＣＰＵ２は、データ格納用フラッシュメモリ４に格納されたデータに基づいて処理を実行する。より具体的には、ＣＰＵ２は、データ格納用フラッシュメモリ４に格納されたデータに基づいて処理を実行する。すなわち、データ格納用フラッシュメモリ４に格納されるデータには、マイクロコントローラ１としての機能を実現する処理をＣＰＵ２に実行させるプログラム（ソフトウェア）が含まれる。なお、ＣＰＵ２は、データ格納用フラッシュメモリ４に格納されたプログラムをＲＡＭ３にロードしてから実行するようにしてもよい。
【００１３】
ＲＡＭ３は、ＣＰＵ２によって利用されるデータが格納される揮発性メモリである。このＲＡＭ３に格納されるデータには、ＣＰＵ２がプログラムを実行する際における演算処理中のデータや、データ格納用フラッシュメモリ４に格納されたデータを更新する際に一時的に退避する更新前のデータ等が含まれる。また、上述したように、データ格納用フラッシュメモリ４からロードしたプログラムを格納するようにしてもよい。
【００１４】
データ格納用フラッシュメモリ４は、ＣＰＵ２によって利用されるデータが格納される不揮発性メモリである。管理ステータス用フラッシュメモリ５は、データ格納用フラッシュメモリ４の状態を示すデータが格納される不揮発性メモリである。
【００１５】
フラッシュシーケンサ６は、データ格納用フラッシュメモリ４と管理ステータス用フラッシュメモリ５を制御する回路である。フラッシュシーケンサ６は、ＣＰＵ２と、データ格納用フラッシュメモリ４及び管理ステータス用フラッシュメモリ５との間に接続される。言い換えると、フラッシュシーケンサ６は、ＣＰＵ２、データ格納用フラッシュメモリ４及び管理ステータス用フラッシュメモリ５らと相互にリードライト可能に構成されている。
【００１６】
これにより、ＣＰＵ２がフラッシュシーケンサ６を介さなければデータ格納用フラッシュメモリ４及び管理ステータス用フラッシュメモリ５に対してデータの書き込み及びデータの消去を実施できないようにしている。なお、ＣＰＵ２によるデータ格納用フラッシュメモリ４及び管理ステータス用フラッシュメモリ５からのデータの読み出しは、上記の書き込み及び消去と同様にフラッシュシーケンサ６を介さなければ実施できないようにしてもよく、フラッシュシーケンサ６を介することなく直接実施できるようにしてもよい。
【００１７】
周辺回路７は、タイマ及びシリアルＩ／Ｏ等の回路のうち、少なくとも１つの回路を含む。ＣＰＵ２は、周辺回路７を任意に利用して処理を実行する。周辺バス８は、ＣＰＵ２、フラッシュシーケンサ６、及び、周辺回路７が接続される。
【００１８】
続いて、図２を参照して、本実施の形態１に係るフラッシュシーケンサ６の構成について説明する。フラッシュシーケンサ６は、制御部１０と、アドレス受信部１１と、コマンド受信部１２と、ステータス送信部１３とを有する。
【００１９】
制御部１０は、データ格納用フラッシュメモリ４及び管理ステータス用フラッシュメモリ５の制御を実行する。
【００２０】
アドレス受信部１１は、ＣＰＵ２から送信されたアドレスデータを受信する。アドレスデータは、データ格納用フラッシュメモリ４及び管理ステータス用フラッシュメモリ５におけるアドレスを示すデータである。
【００２１】
コマンド受信部１２は、ＣＰＵ２から送信されたライトデータを受信する。ライトデータは、フラッシュシーケンサ６が実施する制御内容を指定するために、ＣＰＵ２からフラッシュシーケンサ６に対して書き込まれるデータである。ライトデータで指定される制御内容として、データ格納用フラッシュメモリ４へのデータの書込み、及び、データ格納用フラッシュメモリ４に格納されたデータの消去などがある。より具体的には、ＣＰＵ２は、予め定められた順序でライトデータをフラッシュシーケンサ６に対して書き込むことで、フラッシュシーケンサ６が実施する制御内容を指定する。この一連のライトデータは、フラッシュシーケンサ６の制御内容を指定するコマンドに相当する。
【００２２】
ステータス送信部１３は、ＣＰＵ２に対してステータスデータを送信する。ステータスデータは、フラッシュシーケンサ６によるデータ格納用フラッシュメモリ４及び管理ステータス用フラッシュメモリ５の制御状態を示すデータである。ステータスデータは、例えば、制御状態として、書き込みエラー及び消去エラー等が示される。
【００２３】
アドレス受信部１１は、アドレス指定レジスタ２１を有する。アドレス指定レジスタ２１は、ＣＰＵ２からアドレスデータが書き込まれるレジスタである。このアドレス指定レジスタ２１へのＣＰＵ２からのアドレスデータの書き込みは、上述のアドレスデータの受信に相当する。
【００２４】
コマンド受信部１２は、コマンド指定レジスタ２２を有する。コマンド指定レジスタ２２は、ＣＰＵ２からライトデータが書き込まれるレジスタである。このコマンド指定レジスタ２２へのＣＰＵ２からのライトデータの書き込みは、上述のライトデータの受信に相当する。
【００２５】
ステータス送信部１３は、ステータスレジスタ２３を有する。ステータスレジスタ２３は、制御部１０からステータスデータが書き込まれるレジスタである。このステータスレジスタ２３への制御部１０からのデータの書き込みは、上述のステータスデータの送信に相当する。すなわち、ＣＰＵ２は、周辺バス８を介して、ステータスレジスタ２３に書き込まれたステータスデータを読み出すことができる。
【００２６】
制御部１０は、コマンド指定レジスタ２２に書き込まれた一連のライトデータ（コマンド）に対応する制御を、データ格納用フラッシュメモリ４のうち、アドレス指定レジスタ２１に書き込まれたアドレスデータが示すアドレスに対して実施する。
【００２７】
なお、図２では、アドレス指定レジスタ２１とコマンド指定レジスタ２２が別々に設けられている例を用いて説明したが、これに限られない。例えば、アドレス指定レジスタ２１とコマンド指定レジスタ２２は、物理的に１つのレジスタとしてもよい。この場合、例えば、このレジスタに対して、アドレスデータの後に、ライトデータを書き込む等すればよい。また、アドレスデータ及びライドデータは、フラッシュシーケンサ６に対してパラレルに（複数ビットが同時に）入力されることに限られず、シリアルに（１ビットずつ）入力されるようにしてもよい。
【００２８】
続いて、図３を参照して、本実施の形態１に係るデータ格納用フラッシュメモリ４と管理ステータス用フラッシュメモリ５の構成について説明する。
【００２９】
まず、データ格納用フラッシュメモリ４の構成について説明する。データ格納用フラッシュメモリ４は、複数のブロックＢ０〜ＢＮを有する（Ｎは、所定の正整数。以降も同様。）。以下、ブロックＢ０〜ＢＮは、特にいずれかに限定せずに言及する場合には、「ブロックＢ」と言う。
【００３０】
ブロックＢ０〜ＢＮのそれぞれは、データ格納用フラッシュメモリ４において、データが消去される最小単位となる。ブロックＢ０〜ＢＮのそれぞれは、典型的には、同一サイズである。ブロックＢ０〜ＢＮのそれぞれは、ブロックＢ０〜ＢＮのそれぞれのサイズよりも小さいサイズでデータを書き込むことが可能である。
【００３１】
続いて、管理ステータス用フラッシュメモリ５の構成について説明する。管理ステータス用フラッシュメモリ５は、複数のブロックＢ０〜ＢＮのそれぞれに対応する複数の管理ステータス領域Ｍ０〜ＭＮを有する。言い換えると、管理ステータス格納領域Ｍｉは、ブロックＢｉに対応する（ｉは、０〜Ｎのいずれの整数でも該当。以降も同様。）。複数の管理ステータス領域Ｍ０〜ＭＮは、それぞれ対応するカウンタＣ０〜ＣＮを有する。すなわち、管理ステータス格納領域Ｍｉは、カウンタＣｉを有する。管理ステータス領域Ｍ０〜ＭＮのそれぞれは、典型的には、同一サイズである。
【００３２】
複数のカウンタＣ０〜ＣＮのそれぞれは、複数のブロックＢ０〜ＢＮのそれぞれに対応し、ブロックＢ０〜ＢＮのそれぞれにおけるデータの消去回数を示すカウント値が格納される。すなわち、管理ステータス領域ＭｉのカウンタＣｉは、ブロックＢｉのカウント値が格納される。カウンタＣ１〜ＣＮのそれぞれは、典型的には、同一サイズである。
【００３３】
以下、管理ステータス領域Ｍ０〜ＭＮは、特にいずれかに限定せずに言及する場合には、「管理ステータス領域Ｍ」と言う。また、カウンタＣ０〜ＣＮも、特にいずれかに限定せずに言及する場合には、「カウンタＣ」と言う。
【００３４】
ここで、管理ステータス領域Ｍ０〜ＭＮのそれぞれは、フラグ領域と、Ａ領域と、Ｂ領域とを有する。図３では、管理ステータス領域Ｍ０の構成のみを代表的に図示して説明するが、管理ステータス領域Ｍ１〜ＭＮの構成も管理ステータス領域Ｍ０と同様である。
【００３５】
フラグ領域Ｆ０は、Ａ領域Ｍ０＿ＡとＢ領域Ｍ０＿Ｂのいずれの領域が有効かを示す値が格納される。以下、Ａ領域Ｍ０＿ＡとＢ領域Ｍ０＿Ｂのうち、有効な領域を「有効領域」とも言い、有効でない領域を「無効領域」とも言う。例えば、フラグ領域Ｆ０の値が所定値である場合には、Ａ領域Ｍ０＿Ａが有効領域となり、Ｂ領域Ｍ０＿Ｂが無効領域となる。フラグ領域Ｆの値が上記所定値以外の場合には、Ａ領域Ｍ０＿Ａが無効領域となり、かつＢ領域Ｍ０＿Ｂが有効領域となる。
【００３６】
Ａ領域Ｍ０＿Ａ及びＢ領域Ｍ０＿Ｂのそれぞれは、カウンタＣ０＿Ａ及びカウンタＣ０＿Ｂのそれぞれを有する。すなわち、カウンタＣ０は、カウンタＣ０＿Ａ及びカウンタＣ０＿Ｂを有する。したがって、フラグ領域Ｆに格納される値は、カウンタＣ０＿ＡとカウンタＣ０＿Ｂのいずれのカウント値が有効かを示す値とも言える。Ａ領域Ｍ０＿ＡとＢ領域Ｍ０＿Ｂは、交互にカウント値が更新される。
【００３７】
より具体的には、Ａ領域Ｍ０＿Ａが有効である場合には、Ａ領域Ｍ０＿ＡのカウンタＣ０＿Ａに現在のカウント値が格納されている。この場合、カウント値を更新するときには、カウンタＣ０＿Ａのカウント値は更新されず、そのカウント値の更新後の値が新たな現在のカウント値としてカウンタＣ０＿Ｂに格納される。その後、Ｂ領域Ｍ０＿Ｂが有効にされる。一方、Ｂ領域Ｍ０＿Ｂが有効である場合には、Ｂ領域Ｍ０＿ＢのカウンタＣ０＿Ｂに現在のカウント値が格納されている。この場合、カウント値を更新するときには、カウンタＣ０＿Ｂのカウント値は更新されず、そのカウント値の更新後の値が新たな現在のカウント値としてカウンタＣ０＿Ａに格納される。その後、Ａ領域Ｍ０＿Ａが有効にされる。
【００３８】
フラグ領域Ｆ０、Ａ領域Ｍ０＿Ａ、及びＢ領域Ｍ０＿Ｂのそれぞれは、管理ステータス用フラッシュメモリ５において、データが消去される最小単位（ブロック）以上のサイズとなる。より具体的には、フラグ領域Ｆ０、Ａ領域Ｍ０＿Ａ、及びＢ領域Ｍ０＿Ｂのそれぞれは、典型的には、異なる１つのブロックで構成される。すなわち、フラグ領域Ｆ、Ａ領域Ｍ０＿Ａ、及びＢ領域Ｍ０＿Ｂのそれぞれは、典型的には、同一サイズである。しかしながら、例えば、カウント値の最大値が１つのブロックのデータ量で表現できない場合には、Ａ領域Ｍ０＿Ａ、及びＢ領域Ｍ０＿Ｂのそれぞれは、複数のブロックで構成されていてもよい。フラグ領域Ｆ０も、現実的にはそれに格納される値は１つのブロックのデータ量で表現可能であるが、複数のブロックで構成されていてもよい。また、フラグ領域Ｆ０、Ａ領域Ｍ０＿Ａ、及びＢ領域Ｍ０＿Ｂのそれぞれに格納される値は、必ずしも、それぞれの領域を構成するブロックにおける全てのビットを使用して表現する必要はない。よって、フラグ領域Ｆ０、Ａ領域Ｍ０＿Ａ、及びＢ領域Ｍ０＿Ｂのそれぞれに格納される値は、サイズの異なるデータで表現されていてもよい。
【００３９】
以下、特に管理ステータス領域Ｍ０〜ＭＮのいずれかのものに限定せずに言及する場合には、フラグ領域は「フラグ領域Ｆ」と言い、Ａ領域は「Ａ領域Ｍ＿Ａ」と言い、Ｂ領域は「Ｂ領域Ｍ＿Ｂ」と言い、Ａ領域のカウンタは「カウンタＣ＿Ａ」と言い、Ｂ領域のカウンタは「カウンタＣ＿Ｂ」と言う。
【００４０】
本実施の形態１では、このように、データ格納用フラッシュメモリ４におけるデータの消去回数を、管理ステータス用フラッシュメモリ５においてカウント値として管理することで、悪意のある第三者によるデータ格納用フラッシュメモリ４のデータ（例えばソフトウェア）の改ざんを検出可能としている。悪意のある第三者によってソフトウェアが不正に改ざんされた場合には、データ格納用フラッシュメモリ４におけるソフトウェアを正規に更新した回数よりも、管理ステータス用フラッシュメモリ５によって管理される消去回数が多くなる。フラッシュメモリでは、データを書き換える場合に一度データを消去する必要があるからである。そのため、例えば、正規な業者がデータ格納用フラッシュメモリ４のソフトウェアを更新する場合に、これまでの更新回数と、管理ステータス用フラッシュメモリ５によって管理される消去回数とを比較することで、悪意のある第三者によるデータ格納用フラッシュメモリ４のソフトウェアの不正改ざんを検出することが可能となる。
【００４１】
（実施の形態１の動作）
続いて、図４を参照して、実施の形態１に係るフラッシュシーケンサ６のコマンドについて説明する。図４に示すように、フラッシュシーケンサ６を制御するコマンドとして、データ書込みコマンドと、データ消去コマンドとが用意されている。
【００４２】
データ格納用フラッシュメモリ４に対してデータを書き込む場合、ＣＰＵ２は、周辺バス８を介して、アドレス指定レジスタ２１にアドレスデータを書き込むことにより、データ格納用フラッシュメモリ４のうち、データを書き込むアドレスを指定する。そして、ＣＰＵ２は、書き込みコマンドを示すライトデータをコマンド指定レジスタ２２に順次書き込む。より具体的には、ＣＰＵ２は、データ格納用フラッシュメモリ４に対して４バイトのデータを書き込む場合には、図４に示すように、Ｈ’Ｅ８、Ｈ’０２、４バイトのデータ（２バイトのデータを２回）、Ｈ’Ｄ０の順番でライトデータをコマンド指定レジスタ２２に順次書き込む。また、ＣＰＵ２は、データ格納用フラッシュメモリ４に対して１６バイトのデータを書き込む場合には、図４に示すように、Ｈ’Ｅ８、Ｈ’０８、１６バイトのデータ（２バイトのデータを８回）、Ｈ’Ｄ０の順番でライトデータをコマンド指定レジスタ２２に順次書き込む。なお、「Ｈ’」は、それに続く数値が１６進数表記であることを意味する。
【００４３】
これに応じて、フラッシュシーケンサ６の制御部１０は、データ格納用フラッシュメモリ４のうち、アドレス指定レジスタ２１に書き込まれたアドレスデータが示すアドレスに対して、コマンド指定レジスタ２２に対して書き込まれたデータを書き込む。すなわち、制御部１０は、２回目の書き込みでＨ’０２が書き込まれた場合には、３〜４回目に書き込まれた４バイトのデータを、アドレスデータで指定されたアドレスから４バイト分の領域に書き込む。また、制御部１０は、２回目の書き込みでＨ‘０８が書き込まれた場合には、３〜１０回目に書き込まれた１６バイトのデータを、アドレスデータで指定されたアドレスから１６バイト分の領域に書き込む。
【００４４】
データ格納用フラッシュメモリ４のデータを消去する場合、ＣＰＵ２は、周辺バス８を介して、アドレス指定レジスタ２１にアドレスデータを書き込むことにより、データ格納用フラッシュメモリ４のうち、データを消去するブロックＢのアドレスを指定する。そして、ＣＰＵ２は、データ消去コマンドを示すライトデータをコマンド指定レジスタ２２に順次書き込む。より具体的には、ＣＰＵ２は、Ｈ’２０、Ｈ’Ｄ０の順番でライトデータをコマンド指定レジスタ２２に順次書き込む。
【００４５】
これに応じて、フラッシュシーケンサ６の制御部１０は、データ格納用フラッシュメモリ４のうち、アドレス指定レジスタ２１に書き込まれたアドレスデータが示すアドレスのブロックＢのデータを消去する。このデータの消去時に、制御部１０は、データを消去するブロックＢに対応する管理ステータス領域ＭのカウンタＣのカウント値をインクリメントして更新する。
【００４６】
なお、制御部１０は、管理ステータス用フラッシュメモリ５においてカウント値を更新するカウンタＣが含まれる管理ステータス領域Ｍのアドレスを、アドレス指定レジスタで指定されたデータ格納用フラッシュメモリ４のブロックＢのアドレスから自動的に算出する。このアドレスを算出する方法として、次に説明する第１の方法又は第２の方法を採用してもよく、他の任意の方法を採用してもよい。
【００４７】
例えば、第１の方法では、全てのブロックＢ０〜ＢＮ及び管理ステータス領域Ｍ０〜ＭＮについて、ブロックＢのアドレスと、そのブロックＢに対応する管理ステータス領域Ｍのアドレスとを対応付けて示すテーブルを、フラッシュシーケンサ６が有する記憶部に予め格納しておく。記憶部は、例えば、テーブルを記憶可能なメモリを含む。そして、制御部１０は、そのテーブルに基づいて、データを消去するブロックＢのアドレスから、カウント値を更新する管理ステータス領域Ｍのアドレスを導出してもよい。
【００４８】
例えば、第２の方法では、データを消去するブロックＢのアドレスの所定の下位アドレスを削除する（アドレスを所定のビット数だけ右にシフトする）ことで得られたアドレスを、管理ステータス領域Ｍのアドレスとする。すなわち、第２の方法は、ブロックＢ０〜ＢＮのサイズよりも、管理ステータス領域Ｍ０〜ＭＮのサイズの方が小さい場合に使用することができる。例えば、ブロックＢ０〜ＢＮのサイズが管理ステータス領域Ｍ０〜ＭＮのサイズの６５５３６倍である場合、ブロックＢのアドレスの下位１６ビットを削除する（アドレスを１６ビットだけ右にシフトする）ことで、管理ステータス領域Ｍ０〜ＭＮのアドレスが得られる。なお、ブロックＢのアドレスの所定の下位アドレスを削除したアドレスが、管理ステータス領域Ｍ０〜ＭＮのアドレスと所定サイズだけずれる場合には、そのずれ量のオフセットを加算又は減算することで管理ステータス領域Ｍ０〜ＭＮのアドレスを算出すればよい。
【００４９】
ここで、制御部１０は、ＣＰＵ２から管理ステータス用フラッシュメモリ５のアドレスを指定して書き込みコマンド及びデータ消去コマンドが発行された場合、ＣＰＵ２に対してエラーを返す。より具体的には、制御部１０は、アドレス指定レジスタ２１に書き込まれたアドレスデータが示すアドレスが、管理ステータス用フラッシュメモリ５のアドレスを示している場合、データ書き込み及びデータ消去は実施しない。この場合、さらに、制御部１０は、ステータス送信部１３によってエラーを通知するステータスデータをＣＰＵ２に対して送信するようにしてもよい。
【００５０】
より具体的には、制御部１０は、エラーを示すステータスデータをステータスレジスタ２３に格納する。例えば、ステータスレジスタ２３の特定のビットがエラーフラグとして定義されており、このエラーフラグに１を格納する。なお、書き込みエラーと消去エラーを示すエラーフラグを、まとめて同一ビットに定義してもよく、異なるビットに定義してもよい。このステータスデータは、周辺バス８を介してＣＰＵ２に送信される。これによって、ＣＰＵ２は、フラッシュシーケンサ６のステータス送信部１３から送信されたステータスデータがエラーを示している場合に、データ書き込み又はデータ消去がエラーして実行されなかったことを認識することができる。
【００５１】
このように、管理ステータス用フラッシュメモリ５のアドレスを指定しての書き込みコマンド及びデータ消去コマンドを抑止することで、悪意のある第三者による消去回数（カウント値）の改ざんを防止することを可能としている。ここで、管理ステータス用フラッシュメモリ５の全ての領域に対するデータ書き込み及びデータ消去をエラーとして扱わないようにしてもよい。例えば、管理ステータス用フラッシュメモリ５のうち、フラグ領域Ｆ、カウンタＣ（Ａ領域Ｍ＿Ａ、Ｂ領域Ｍ＿Ａ）のアドレスが指定された場合にエラーとして扱い、他の領域が指定された場合にはデータ書き込み及びデータ消去を可能としてもよい。このようにしても、消去回数（カウント値）の改ざんを防止することができるからである。
【００５２】
続いて、図５を参照して、本実施の形態１に係るフラッシュシーケンサ６のデータ消去処理について説明する。
【００５３】
フラッシュシーケンサ６の制御部１０は、コマンド受信部１２によってデータ消去コマンドを示すライトデータが受信された場合、データを消去するブロックＢに対応する管理ステータス領域Ｍのフラグ領域Ｆの値を読み出す。このブロックＢは、アドレス受信部１１によって受信されたアドレスデータが示すアドレスに位置するブロックＢとなる。制御部１０は、読み出した値に基づいてＡ領域Ｍ＿ＡとＢ領域Ｍ＿Ｂのうち、いずれの領域が有効領域であり、いずれが無効領域であるかを判定する（Ｓ１）。
【００５４】
制御部１０は、無効領域のデータを消去して、新たなカウント値を書き込み可能な状態にする（Ｓ２）。制御部１０は、データを消去するブロックＢに対応する管理ステータス領域Ｍ内の有効領域に格納された現在のカウント値を読み出す（Ｓ３）。制御部１０は、読み出した現在のカウント値に１を加算した値を、新たなカウント値として無効領域に書き込む（Ｓ４）。制御部１０は、書き込みが完了すると、フラグ領域Ｆの値を更新して、有効領域を無効化し、無効領域を有効化する。すなわち、制御部１０は、新たなカウント値が格納された領域を有効領域として示し、他方の領域を無効領域として示すようにフラグ領域Ｆの値を更新する（Ｓ５）。これらの管理ステータス用フラッシュメモリ５の制御の完了後に、制御部１０は、データ格納用フラッシュメモリ４のうち、アドレス指定レジスタ２１に書き込まれたアドレスデータが示すアドレスのブロックＢのデータを消去し、データ消去処理を終了する（Ｓ６）。
【００５５】
（実施の形態１の特徴および効果）
以上に説明したように、本実施の形態１では、フラッシュシーケンサ６（制御回路）は、ブロックＢ（データ格納領域）に格納されるデータのＣＰＵ２（プロセッサ）による変更を許容し、カウンタＣ（消去回数格納領域）に格納されるカウント値（消去回数データ）のＣＰＵ２による変更を抑止するようにしている。
【００５６】
これによれば、管理ステータス用フラッシュメモリ５のカウンタＣを直接指定してデータの変更（書き込み及び消去）をすることができないため、悪意のある第三者が任意のカウント値を変更することができない。すなわち、本実施の形態１によれば、フラッシュメモリにおける消去回数（カウント値）の改ざんを防止することができる。
【００５７】
また、本実施の形態１では、フラッシュシーケンサ６は、データ格納用フラッシュメモリ４におけるデータの消去に先行してカウント値を更新するようにしている。言い換えると、フラッシュシーケンサ６は、カウンタＣに格納されたカウント値を更新した後に、ブロックＢに格納されたデータを消去するようにしている。
【００５８】
これによれば、悪意のある第三者が、マイクロコントローラ１のリセット又は電源切断・投入等の手段によって、フラッシュシーケンサ６のデータ消去処理を中断させたとしても、実際のデータ消去よりも先にカウント値が更新されるため、実際の消去回数よりも少ない不当なカウント値に改ざんすることができない。よって、悪意のある第三者がデータ格納用フラッシュメモリ４におけるデータの不正改ざんを隠蔽するためにカウント値を少ない値に改ざんすることを防止できる。
【００５９】
また、本実施の形態１では、図５に示すように、ブロックＢのデータを消去する場合、Ａ領域Ｍ＿Ａ及びＢ領域Ｍ＿Ｂのうち、フラグ領域Ｆの値（領域情報）が有効と示す領域からカウント値を取得し、取得したカウント値を更新して他方の領域に格納し、その他方の領域を有効と示すようにフラグ領域Ｆの値を更新するようにしている。これによれば、悪意のある第三者が、マイクロコントローラ１のリセット又は電源切断・投入等の手段によって、フラッシュシーケンサ６のデータ消去処理を中断させたとしても、実際の消去回数よりも少ない不当なカウント値に改ざんすることができない。
【００６０】
例えば、上述の処理によれば、フラグ領域Ｆの値、Ａ領域Ｍ＿Ａのカウント値、及び、Ｂ領域Ｍ＿Ｂのカウント値は、図６に示す（１）〜（３）の状態を遷移することになる。なお、図６では、Ａ領域Ｍ＿Ａが有効な状態から処理が開始された例を示している。
【００６１】
（１）の状態は、無効領域のカウント値が消去された状態を示している（図５のＳ２）。（２）の状態は、現在のカウント値に１を加算した値が新たなカウント値として無効領域に書き込まれた状態を示している（図５のＳ４）。（３）の状態は、新たなカウント値が格納された領域を有効領域として示すようにフラグ領域Ｆの値が更新された状態を示している（図５のＳ５）。なお、上述したように、（３）の状態にされた後に、実際にデータの消去が実施される（図５のＳ６）。
【００６２】
まず、（１）の状態で処理が中断された場合、カウント値は更新前の値が有効になっており、データの消去が実施される前であるため、カウント値と実際の消去回数は一致する。（２）の状態で処理が中断された場合も、カウント値は更新前の値が有効になっており、データの消去が実施される前であるため、カウント値と実際の消去回数は一致する。（３）の状態で処理が中断された場合、カウント値は更新後の値が有効となるが、データの消去が実施される前であるため、カウント値は実際の消去回数よりも多くなる。
【００６３】
したがって、本実施の形態１によれば、カウント値が実際の消去回数よりも少なくなることはない。これによれば、悪意のある第三者によってデータ格納用フラッシュメモリ４におけるデータが不正に改ざんされた場合には、必ず正規にデータを更新した回数よりもカウント値が多くなる。そのため、悪意のある第三者がデータ格納用フラッシュメモリ４のソフトウェアなどを不正に書き換えたことを確実に検出できる。
【００６４】
＜実施の形態２＞ 
続いて、実施の形態２について説明する。実施の形態１と同様の内容については、適宜説明を省略する。例えば、実施の形態２では、マイクロコントローラ１の構成、フラッシュシーケンサ６の構成、及びデータ格納用フラッシュメモリ４の構成は、図１〜３を参照して説明した実施の形態１における構成と同様であるため、説明を省略する。
【００６５】
（実施の形態２の構成）
続いて、図７を参照して、本実施の形態１に係る管理ステータス用フラッシュメモリ５の構成について説明する。
【００６６】
実施の形態２では、管理ステータス用フラッシュメモリ５は、管理ステータス格納用領域Ｍを１つだけ有する。すなわち、図７に示すように、フラグ領域Ｆ、Ａ領域Ｍ＿Ａ、及び、Ｂ領域Ｍ＿Ｂのそれぞれを、１つだけ有する。Ａ領域Ｍ＿Ａは、複数のブロックＢ０〜ＢＮのそれぞれに対応する複数のカウンタＣ０＿Ａ〜ＣＮ＿Ａを有する。Ｂ領域Ｍ＿Ｂは、複数のブロックＢ０〜ＢＮのそれぞれに対応する複数のカウンタＣ０＿Ｂ〜ＣＮ＿Ｂを有する。
【００６７】
このように、本実施の形態２では、複数のカウンタＣ０＿Ａ〜ＣＮ＿Ａは１つのＡ領域Ｍ＿Ａにまとめられており、複数のカウンタＣ０＿Ｂ〜ＣＮ＿Ｂは１つのＢ領域Ｍ＿Ｂにまとめられている。よって、データ格納用フラッシュメモリ４の全てのブロックＢ０〜ＢＮに対して、フラグ領域Ｆ、Ａ領域Ｍ＿Ａ、及び、Ｂ領域Ｍ＿Ｂ（３つのブロック）を１つだけ用意すればよい。カウンタＣ０＿Ａ〜ＣＮ＿Ａ及びカウンタＣ０＿Ｂ〜ＣＮ＿Ｂのそれぞれは、典型的には、同一サイズである。すなわち、Ａ領域Ｍ＿ＡとＢ領域Ｍ＿Ｂは、典型的には、同一構成とされる。
【００６８】
Ａ領域Ｍ＿ＡとＢ領域Ｍ＿Ｂは、実施の形態１と同様に、交互にカウント値が更新される。しかしながら、フラッシュメモリでは、データの書き込みを行う前にデータを消去する必要があり、ブロック単位（Ａ領域Ｍ＿Ａ単位、Ｂ領域Ｍ＿Ｂ単位）でデータが消去されてしまうため、更新対象でないカウンタのカウント値も初期化されてしまう。そのため、カウンタのカウント値を更新する場合には、更新対象のカウンタについては、有効領域からカウント値を取得し、取得したカウント値をインクリメントしたカウント値を無効領域に格納し、更新対象でないカウンタについては、有効領域から取得したカウント値をそのまま無効領域に格納する。
【００６９】
（実施の形態２の動作）
続いて、図８を参照して、実施の形態２に係るフラッシュシーケンサ６のデータ消去処理について説明する。なお、ここで、データ消去処理を開始するときにＡ領域Ｍ＿Ａが有効である場合について説明するが、データ消去処理を開始するときにＢ領域Ｍ＿Ｂが有効である場合も同様に実施することが可能である。Ｂ領域Ｍ＿Ｂが有効である場合には、以降の説明におけるカウンタＣ０＿Ａ〜ＣＮ＿ＡとカウンタＣ０＿Ｂ〜ＣＮ＿Ｂとが逆に読み替えられること等は自明であるため、説明は省略する。
【００７０】
制御部１０は、実施の形態１におけるステップＳ１、２と同様に、Ａ領域Ｍ＿ＡとＢ領域Ｍ＿Ｂが有効か無効かを判定し、無効領域のデータを消去する（Ｓ１１、Ｓ１２）。すなわち、制御部１０は、Ａ領域Ｍ＿Ａが有効である（Ｂ領域Ｍ＿Ｂが無効である）と判定し、無効領域であるＢ領域Ｍ＿Ｂのデータを消去する。
【００７１】
実施の形態２では、制御部１０は、カウンタＣ０＿Ａ〜ＣＮ＿Ａのカウント値の設定を順番に実行可能とするために、処理中のカウンタＣ＿Ａ、Ｃ＿Ｂのアドレスを示すポインタを管理する。処理中のカウンタＣ＿Ａ、Ｃ＿Ｂのアドレスを示すポインタは、例えば、フラッシュシーケンサ６が有する記憶部に格納される。ポインタは、初期値として、有効領域における先頭のカウンタＣ０＿Ａ、Ｃ０＿Ｂのアドレスが設定される。なお、ポインタは、Ａ領域Ｍ＿ＡのカウンタＣ＿Ａと、Ｂ領域Ｍ＿ＢのカウンタＣ＿Ｂのいずれか１つのアドレスのみを示すものであってもよい。この場合であっても、他方のカウンタのアドレスは、ポインタが示すアドレスに対して、所定のオフセット（例えばＡ領域Ｍ＿Ａのサイズ）を加算もしくは減算することで算出することができる。
【００７２】
制御部１０は、ポインタが、データを消去するブロックＢに対応するカウンタＣ＿Ａ、Ｃ＿Ｂを示すか否かを判定する（Ｓ１３）。言い換えると、制御部１０は、処理中のカウンタＣ＿Ａ、Ｃ＿Ｂが、データを消去するブロックＢに対応するカウンタＣ＿Ａ、Ｃ＿Ｂであるか否かを判定する。なお、この判定には、任意の方法を採用してもよい。
【００７３】
例えば、上述した第１の方法と同様に判定する場合には、全てのブロックＢ０〜ＢＮ、カウンタＣ０＿Ａ〜ＣＮ＿Ａ、Ｃ０＿Ｂ〜ＣＮ＿Ｂについて、ブロックＢのアドレスと、そのブロックＢに対応するカウンタＣ＿Ａ及びカウンタＣ＿Ｂのアドレスとを対応付けて示すテーブルを、フラッシュシーケンサ６が有する記憶部に予め格納しておく。そして、制御部１０は、そのテーブルに基づいて、データを消去するブロックＢのアドレスから、そのデータを消去するブロックＢに対応するカウンタＣ＿Ａ及びカウンタＣ＿Ｂのアドレスを導出してもよい。
【００７４】
また、例えば、上述した第２の方法と同様に判定する場合には、データを消去するブロックＢのアドレスの所定の下位アドレスを削除することで得られたアドレスが、ポインタが示すアドレス（カウンタＣ＿Ａ、Ｃ＿Ｂのいずれかのアドレス）と一致する場合に、ポインタが、そのブロックＢに対応するカウンタＣ＿Ａ、Ｃ＿Ｂを示すと判定する。そうでない場合には、ポインタが、そのブロックＢに対応するカウンタＣ＿Ａ、Ｃ＿Ｂを示さないと判定する。なお、この場合も、ブロックＢのアドレスの下位アドレスを削除したアドレスが、そのブロックＢに対応するカウンタＣ＿Ａ又はカウンタＣ＿Ｂのアドレスと所定サイズだけずれる場合には、そのずれ量のオフセットを加算又は減算して得られたアドレスを、ポインタが示すアドレスと比較すればよい。
【００７５】
ポインタが、データを消去するブロックＢに対応するカウンタＣ＿Ａ、Ｃ＿Ｂを示すと判定した場合（Ｓ１３：消去対象ブロック用）、制御部１０は、有効領域であるＡ領域Ｍ＿Ａにおいてポインタが示すカウンタＣ＿Ａのカウント値を読み出す（Ｓ１４）。制御部１０は、読み出したカウント値に１を加算した値を、新たなカウント値として、無効領域であるＢ領域Ｍ＿Ｂにおいてポインタが示すカウンタＣ＿Ｂに書き込む（Ｓ１５）。
【００７６】
ポインタが、データを消去するブロックＢに対応するカウンタＣ＿Ａ、Ｃ＿Ｂを示さないと判定した場合（Ｓ１３：消去対象外ブロック用）、制御部１０は、有効領域であるＡ領域Ｍ＿Ａにおいてポインタが示すカウンタＣ＿Ａのカウント値を読み出す（Ｓ１６）。制御部１０は、読み出したカウント値を、そのまま新たなカウント値として、無効領域であるＢ領域Ｍ＿Ｂにおいてポインタが示すカウンタＣ＿Ｂに書き込む（Ｓ１７）。
【００７７】
無効領域へのカウント値の書き込みの完了後（Ｓ１５、Ｓ１７）、制御部１０は、ポインタが、最終ブロックＢＮに対応するカウンタＣＮ＿Ａ、Ｃ＿ＢＮを示すか否かを判定する（Ｓ１８）。言い換えると、制御部１０は、処理中のカウンタＣ＿Ａ、Ｃ＿Ｂが、最終ブロックＢＮに対応するカウンタＣＮ＿Ａ、Ｃ＿ＢＮであるか否かを判定する。
【００７８】
ポインタが、最終ブロックＢＮに対応するカウンタＣＮ＿Ａ、ＣＮ＿Ｂを示さない場合（Ｓ１８：最終ブロック以外）、制御部１０は、ポインタが示すアドレスを次のブロックＢに対応するカウンタＣＮ＿Ａ、ＣＮ＿Ｂのアドレスに更新し（Ｓ１９）、再度、Ｓ１３からのカウンタの更新処理を繰り返す。これにより、カウンタＣ０＿Ａ、Ｃ０＿Ｂ〜カウンタＣＮ＿Ａ、ＣＮ＿Ｂの順に処理が進められる。なお、ポインタの更新は、例えば、カウンタＣ０＿Ａ〜ＣＮ＿Ａ及びカウンタＣ０＿Ｂ〜ＣＮ＿Ｂが、同一サイズであり、隙間なく並べられている場合には、ポインタが示すアドレスをカウンタＣ＿Ａ、Ｃ＿Ｂのサイズだけ進めるようにすればよい。また、例えば、ポインタが、カウンタＣ０＿Ａ、Ｃ０＿Ｂのサイズ分の下位ビットを省略した形式でカウンタＣ０＿Ａ、Ｃ０＿Ｂのアドレスを示している場合には、ポインタの更新は、ポインタが示すアドレスを１ずつインクリメントするようにすればよい。
【００７９】
ポインタが、最終ブロックＢＮに対応するカウンタＣＮ＿Ａ、Ｃ＿ＢＮを示す場合（Ｓ１８：最終ブロック）、制御部１０は、実施の形態１におけるステップＳ５、Ｓ６と同様に、フラグ領域Ｆの値を更新し、ブロックＢのデータを消去してデータ消去処理を終了する（Ｓ２０）。
【００８０】
（実施の形態２の特徴および効果）
以上に説明したように、本実施の形態２では、制御部１０は、データを消去するブロックＢに対応するカウンタＣ＿Ａ、Ｃ＿Ｂについては、フラグ領域Ｆの値が有効と示す領域（実施の形態２の例では、Ａ領域Ｍ＿Ａ）からカウント値を取得し、取得したカウント値を更新して他方の領域（実施の形態２の例では、Ｂ領域Ｍ＿Ｂ）に格納し、それ以外のカウンタＣ＿Ａ、Ｃ＿Ｂについては、フラグ領域Ｆの値が有効と示す領域から取得したカウント値をそのまま他方の領域に格納している。
【００８１】
これによれば、複数のカウント値Ｃ０＿Ａ〜ＣＮ＿Ａ及び複数のカウント値Ｃ０＿Ｂ〜ＣＮ＿Ｂのそれぞれを、Ａ領域Ｍ＿Ａ及びＢ領域Ｍ＿Ｂのそれぞれにまとめて管理することが可能となる。そのため、管理ステータス用フラッシュメモリ５において、フラグ領域Ｆを１つだけ有するだけでよい。よって、管理ステータス用フラッシュメモリ５の容量を削減することができ、低コストでデータの不正改ざんを検出する機構を構築できる。
【００８２】
一方で、本実施の形態２では、実施の形態１と比較して、データ消去処理において、全てのカウンタＣ０＿Ａ〜ＣＮ＿Ａ又はＣ０＿Ｂ〜ＣＮ＿Ｂのカウント値の更新を必要とするため、データ消去処理における処理時間が長期化する。そのため、管理ステータス用フラッシュメモリ５の容量よりも処理時間を優先する場合には、実施の形態１の構成が好適である。
【００８３】
＜実施の形態３＞ 
続いて、実施の形態３について説明する。実施の形態１と同様の内容については、適宜説明を省略する。例えば、実施の形態３では、マイクロコントローラ１の構成、フラッシュシーケンサ６の構成、及びデータ格納用フラッシュメモリ４の構成は、図１〜３を参照して説明した実施の形態１における構成と同様であるため、説明を省略する。
【００８４】
（実施の形態３の構成）
続いて、図９を参照して、本実施の形態１に係る管理ステータス用フラッシュメモリ５の構成について説明する。
【００８５】
実施の形態３では、実施の形態１と比較して、管理ステータス領域Ｍ０〜ＭＮのそれぞれは、さらに、複数のカウント許可フラグ領域Ａ０〜ＡＮのそれぞれを有する。すなわち、管理ステータス領域Ｍｉは、カウント許可フラグ領域Ａｉを有する。以下、カウント許可フラグＡ０〜ＡＮは、特にいずれかに限定せずに言及する場合には、「カウント許可フラグＡ」と言う。
【００８６】
カウント許可フラグ領域Ａ０〜ＡＮのそれぞれは、カウンタＣ０〜ＣＮのそれぞれによる消去回数のカウントの可否を示すカウント許可フラグが格納される。よって、制御部１０は、カウント許可フラグ領域Ａｉのカウント許可フラグがカウント禁止を示す場合には、カウンタＣｉのカウント値を更新しない。一方、制御部１０は、カウント許可フラグ領域Ａｉのカウント許可フラグがカウント許可を示す場合には、カウンタＣｉのカウント値を更新する。ここで、カウント許可フラグは、例えば、”１”でカウント禁止を示し、”０”でカウント許可を示すフラグである。
【００８７】
Ａ領域Ｍ０＿Ａ及びＢ領域Ｍ０＿Ｂのそれぞれは、カウント許可フラグ領域Ａ０＿Ａ及びカウント許可フラグ領域Ａ０＿Ｂのそれぞれを有する。すなわち、カウント許可フラグ領域Ａ０は、カウント許可フラグ領域Ａ０＿Ａ及びカウント許可フラグ領域Ａ０＿Ｂを有する。したがって、フラグ領域Ｆに格納される値は、カウント許可フラグ領域Ａ０＿Ａとカウント許可フラグ領域Ａ０＿Ｂのいずれのカウント許可フラグが有効かを示す値とも言える。
【００８８】
より具体的には、Ａ領域Ｍ０＿Ａが有効である場合には、Ａ領域Ｍ０＿Ａのカウント許可フラグ領域Ａ０＿Ａに現在のカウント許可フラグが格納されている。この場合、カウント許可フラグを更新するときには、カウント許可フラグ領域Ａ０＿Ａのカウント許可フラグは更新されず、そのカウント許可フラグの更新後の値が新たな現在のカウント許可フラグとしてカウント許可フラグ領域Ａ０＿Ｂに格納される。その後、Ｂ領域Ｍ０＿Ｂが有効にされる。一方、Ｂ領域Ｍ０＿Ｂが有効である場合には、Ｂ領域Ｍ０＿Ｂのカウント許可フラグ領域Ａ０＿Ｂに現在のカウント許可フラグが格納されている。この場合、カウント許可フラグを更新するときには、カウント許可フラグ領域Ａ０＿Ｂのカウント許可フラグは更新されず、そのカウント許可フラグの更新後の値が新たな現在のカウント許可フラグとしてカウント許可フラグ領域Ａ０＿Ａに格納される。その後、Ａ領域Ｍ０＿Ａが有効にされる。
【００８９】
以下、特に管理ステータス領域Ｍ０〜ＭＮのいずれかのものに限定せずに言及する場合には、Ａ領域のカウント許可フラグ領域は「カウント許可フラグ領域Ａ＿Ａ」と言い、Ｂ領域のカウント許可フラグ領域は「カウント許可フラグ領域Ａ＿Ｂ」と言う。
【００９０】
（実施の形態３の動作）
続いて、図１０を参照して、実施の形態３に係るフラッシュシーケンサ６のデータ消去処理について説明する。
【００９１】
制御部１０は、実施の形態１におけるステップＳ１と同様に、Ａ領域Ｍ＿ＡとＢ領域Ｍ＿Ｂが有効か無効かを判定する（Ｓ３１）。制御部１０は、データを消去するブロックＢに対応する管理ステータス領域Ｍ内の有効領域のカウント許可フラグ領域Ａからカウント許可フラグを読み出す（Ｓ３２）。制御部１０は、読み出したカウント許可フラグがカウント許可を示しているかカウント禁止を示しているかを判定する（Ｓ３３）。
【００９２】
読み出したカウント許可フラグがカウント許可を示している場合（Ｓ３３：Ｙｅｓ）、制御部１０は、実施の形態１におけるステップＳ２〜４と同様に、無効領域のデータを消去し、有効領域から現在のカウント値を読み出し、読み出した現在のカウント値に１を加算した値を無効領域に書き込む（Ｓ３４〜Ｓ３６）。制御部１０は、ステップＳ３２で読み出したカウント許可フラグを、データを消去するブロックＢに対応する管理ステータス領域Ｍ内の無効領域のカウント許可フラグ領域Ａにそのまま書き込む（Ｓ３７）。そして、制御部１０は、実施の形態１におけるステップＳ５、Ｓ６と同様に、フラグ領域Ｆの値を更新し、ブロックＢのデータを消去してデータ消去処理を終了する（Ｓ３８、Ｓ３９）。
【００９３】
読み出したカウント許可フラグがカウント禁止を示している場合（Ｓ３３：Ｎｏ）、制御部１０は、ステップＳ３４〜Ｓ３８のいずれの処理も実施することなく、ブロックＢのデータを消去してデータ消去処理を終了する（Ｓ３９）。
【００９４】
続いて、図１１を参照して、実施の形態３に係るフラッシュシーケンサ６のコマンドについて説明する。実施の形態３では、図１１に示すように、実施の形態１と比較して、さらに、カウント許可設定コマンドが用意されている。
【００９５】
データの消去回数のカウントの許可を設定する場合、ＣＰＵ２は、周辺バス８を介して、アドレス指定レジスタ２１にアドレスデータを書き込むことにより、データ格納用フラッシュメモリ４のうち、データの消去回数のカウントを許可するブロックＢのアドレスを指定する。そして、ＣＰＵ２は、カウント許可設定コマンドを示すライトデータをコマンド指定レジスタ２２に順次書き込む。より具体的には、ＣＰＵ２は、Ｈ’４０、Ｈ’０２、カウント許可フラグへの設定値、Ｈ’Ｄ０の順番でライトデータをコマンド指定レジスタ２２に順次書き込む。
【００９６】
これに応じて、フラッシュシーケンサ６の制御部１０は、アドレス指定レジスタで指定されたデータ格納用フラッシュメモリ４のブロックＢに対応する管理ステータス領域Ｍのカウント許可フラグ領域Ａのカウント許可フラグを、ライトデータとして書き込まれた設定値に基づいて変更する。
【００９７】
なお、制御部１０は、管理ステータス用フラッシュメモリ５においてカウント許可フラグを更新するカウント許可フラグ領域Ａが含まれる管理ステータス領域Ｍのアドレスを、アドレス指定レジスタで指定されたデータ格納用フラッシュメモリ４のブロックＢのアドレスから自動的に算出する。このアドレスを算出する方法として、上述した第１の方法又は第２の方法を採用してもよく、他の任意の方法を採用するようにしてもよい。
【００９８】
ここで、制御部１０は、ＣＰＵ２から管理ステータス用フラッシュメモリ５のアドレスを指定してカウント許可設定コマンドが発行された場合、ＣＰＵ２に対してエラーを返す。より具体的には、制御部１０は、アドレス指定レジスタ２１に書き込まれたアドレスデータが示すアドレスが、管理ステータス用フラッシュメモリ５のアドレスを示している場合、カウント許可フラグの変更は実施しない。また、この場合、制御部１０は、ステータス送信部１３によってエラーを通知するステータスデータをＣＰＵ２に対して送信する。なお、カウント許可設定エラーを示すエラーフラグは、書き込みエラーと消去エラーを示すエラーフラグと、をまとめて同一ビットに定義してもよく、異なるビットに定義してもよい。
【００９９】
なお、以上の説明では、データ格納用フラッシュメモリ４のブロックＢのアドレスを指定することで、カウント許可設定コマンドを発行する例について説明したが、これに限られない。例えば、管理ステータス用フラッシュメモリ５のうち、カウント許可フラグ領域Ａ＿Ａ、Ａ＿Ｂのアドレスを指定してカウント許可設定コマンドが発行された場合には、エラーとして扱わず、カウント許可フラグの変更を可能としてもよい。このようにしても、フラグ領域Ｆ、カウンタＣのアドレスが指定された場合にエラーとして扱いさえすれば、消去回数（カウント値）の改ざんを防止することができるからである。
【０１００】
続いて、図１２を参照して、本実施の形態３に係るフラッシュシーケンサ６のカウント許可設定処理について説明する。
【０１０１】
フラッシュシーケンサ６の制御部１０は、コマンド受信部１２によってカウント許可設定コマンドを示すライトデータが受信された場合、データの消去回数のカウントの許可を設定するブロックＢに対応する管理ステータス領域Ｍのフラグ領域Ｆの値を読み出す。このブロックＢは、アドレス受信部１１によって受信されたアドレスデータが示すアドレスに位置するブロックＢとなる。制御部１０は、読み出した値に基づいてＡ領域Ｍ＿ＡとＢ領域Ｍ＿Ｂのうち、いずれの領域が有効領域であり、いずれが無効領域であるかを判定する（Ｓ４１）。
【０１０２】
制御部１０は、無効領域のデータを消去して、新たなカウント許可フラグを書き込み可能な状態にする（Ｓ４２）。制御部１０は、データの消去回数のカウントの許可を設定するブロックＢに対応する管理ステータス領域Ｍ内の有効領域に格納された現在のカウント値を読み出す（Ｓ４３）。制御部１０は、読み出したカウント値を、そのまま無効領域に書き込む（Ｓ４４）。制御部１０は、データの消去回数のカウントの許可を設定するブロックＢに対応する管理ステータス領域Ｍ内の有効領域に格納された現在のカウント許可フラグを読み出す（Ｓ４５）。制御部１０は、読み出した現在のカウント許可フラグと、カウント許可設定コマンドにおいてコマンド指定レジスタ２２に格納された設定値との論理積演算（ＡＮＤ演算）の結果となる値を、新たなカウント許可フラグとして無効領域に書き込む（Ｓ４６）。制御部１０は、新たなカウント許可フラグが格納された領域を有効領域として示し、他方の領域を無効領域として示すようにフラグ領域Ｆの値を更新する（Ｓ４７）。
【０１０３】
（実施の形態３の特徴および効果）
以上に説明したように、本実施の形態３では、カウント許可を示すカウント許可フラグ（許可情報）が格納されたカウント許可フラグ領域Ａに対応するカウンタＣについてはカウント値を更新し、禁止を示すカウント許可フラグが格納されたカウント許可フラグ領域Ａに対応するカウンタＣについてはカウント値の更新を抑止するようにしている。
【０１０４】
これによれば、カウントが禁止されたカウンタＣではカウント値を更新しないため、データ消去処理の時間を短縮することができる。例えば、セキュリティを確保する上で重要なデータが格納された領域についてのみ、データの改ざんを検出すればよい場合に、データ格納用フラッシュメモリ４におけるデータの消去時間を短縮でき、データを更新する際のスループットを改善できる。例えば、データ格納用フラッシュメモリ４に格納されるソフトウェアのうち、ブートローダのように重要なソフトウェアが格納されたブロックＢに対応するカウンタＣによるカウントのみを許可することができる。
【０１０５】
また、本実施の形態３では、カウント許可フラグを変更する場合、カウント値については、Ａ領域Ｍ＿ＡとＢ領域Ｍ＿Ｂのうち、フラグ領域Ｆの値が有効と示す領域から取得したカウント値をそのまま他方の領域に格納するようにしている。これによれば、あるブロックＢに対応するカウンタＣによるカウントの許可状態を変更する場合であっても、カウント値は変更されないため、実施の形態１と同様にカウント値を保護することができる。
【０１０６】
また、本実施の形態３では、Ａ領域Ｍ＿Ａ及びＢ領域Ｍ＿Ｂのうち、フラグ領域Ｆの値が有効と示さない領域に対して変更後のカウント許可フラグを格納し、その領域を有効と示すようにフラグ領域Ｆの値を更新するようにしている。すなわち、カウント許可設定コマンドに応じた処理フローは、データ消去における管理ステータス用フラッシュメモリ５の処理フローと同様となる。よって、図６を参照して説明したように、悪意のある第三者が、マイクロコントローラ１のリセット又は電源切断・投入等の手段によって、フラッシュシーケンサ６のカウント許可設定処理を中断させたとしても、カウント許可フラグを改ざんすることができない。
【０１０７】
また、本実施の形態３では、ＣＰＵ２から受信したカウント許可設定コマンドによって、カウント許可フラグの禁止から許可への変更が要求された場合にはカウント許可フラグの変更を許容し、カウント許可フラグの許可から禁止への変更が要求された場合にはカウント許可フラグの変更を抑止するようにしている。より具体的には、有効領域から読み出したカウント許可フラグと、カウント許可設定コマンドにおいて指定された新たな設定値との論理積演算の結果を、新たなカウント許可フラグとして無効領域に書き込むようにしている。
【０１０８】
これによれば、消去回数（カウント値）のカウントを禁止するように変更することを防止できる。このため、悪意のある第三者が消去回数のカウントを禁止して、データ格納用フラッシュメモリ４におけるデータの不正改ざんを隠蔽することを防止できる。
【０１０９】
なお、上述の説明では、カウンタＣとカウント許可フラグ領域Ａの両方を１つの管理ステータス領域Ｍに有する例について説明したが、カウンタＣとカウント許可フラグ領域Ａとを異なる管理ステータス領域Ｍに有するようにしてもよい。
【０１１０】
また、上述の説明では、実施の形態１に対してカウント許可設定機能を追加した形態について説明したが、実施の形態２に対してもカウント許可設定機能を追加した形態についても当然に実施可能である。この場合、管理ステータス用フラッシュメモリ５において１つの管理ステータス領域Ｍを有するようにし、そのＡ領域Ｍ＿ＡにおいてカウンタＣ０＿Ａ〜ＣＮ＿Ａとカウント許可フラグＡ０＿Ａ〜ＡＮ＿Ａを有し、そのＢ領域Ｍ＿ＢにおいてカウンタＣ０＿Ｂ〜ＣＮ＿Ｂとカウント許可フラグＡ０＿Ｂ〜ＡＮ＿Ｂを有するようにしてもよい。また、管理ステータス用フラッシュメモリ５において２つの管理ステータス領域Ｍを有するようにし、一方の管理ステータス領域Ｍは、図７に示す構成とし、他方の管理ステータス領域Ｍは、Ａ領域Ｍ＿Ａにおいてカウント許可フラグＡ０＿Ａ〜ＡＮ＿Ａを有し、Ｂ領域Ｍ＿Ｂにおいてカウント許可フラグＡ０＿Ｂ〜ＡＮ＿Ｂを有するようにしてもよい。すなわち、実施の形態２に対してカウント許可設定機能を追加した場合においても、カウンタＣとカウント許可フラグ領域Ａとを異なる管理ステータス領域Ｍに有するようにしてもよい。
【０１１１】
また、上述の説明では、カウント許可フラグが、”１”でカウント禁止を示し、”０”でカウント許可を示すフラグである例について説明したが、これに限られない。例えば、カウント許可フラグは、”０”でカウント禁止を示し、”１”でカウント許可を示すフラグであってもよい。この場合、上述のステップＳ４６では、読み出したカウント許可フラグと、設定値との論理和演算（ＯＲ演算）の結果となる値を、新たなカウント許可フラグとすればよい。
【０１１２】
（実施の形態３の変形例）
フラッシュメモリでは、一般的にデータを消去した場合には、全てのビットが”１”に初期化され、データの書き込みによって任意のビットが”１”から”０”に変更される。そして、本実施の形態３では、カウント許可フラグがカウント禁止からカウント許可を示すようにする変更を許容している。そのため、カウント許可フラグを上述の”１”でカウント禁止を示し、”０”でカウント許可を示すフラグとし、カウンタＣとカウント許可フラグ領域Ａとを異なる管理ステータス領域Ｍ（すなわち、異なるブロック）に有するようにした場合には、データを消去することなく、カウント許可フラグを変更することができる。すなわち、この場合には、次に図１３を参照して説明するように、カウント許可設定処理を実施してもよい。
【０１１３】
フラッシュシーケンサ６の制御部１０は、ステップＳ４１、Ｓ４５と同様に、Ａ領域Ｍ＿ＡとＢ領域Ｍ＿Ｂが有効か無効かを判定し、有効領域に格納された現在のカウント許可フラグを読み出す（Ｓ５１、Ｓ５５）。制御部１０は、読み出したカウント許可フラグがカウント許可を示すか否かを判定する（Ｓ５３）。
【０１１４】
カウント許可フラグがカウント禁止を示す場合（Ｓ５３：Ｎｏ）、制御部１０は、カウント許可設定コマンドにおいてコマンド指定レジスタ２２に格納された設定値を、新たなカウント許可フラグとして無効領域に書き込む（Ｓ５４）。制御部１０は、ステップＳ４７と同様に、フラグ領域Ｆの値を更新する（Ｓ５５）。カウント許可フラグがカウント許可を示す場合（Ｓ５３：Ｙｅｓ）、制御部１０は、ステップＳ５４、Ｓ５５の処理は実行しない。
【０１１５】
このような処理によれば、カウント許可設定処理においてデータを消去する必要が無くなるため、カウント許可設定処理の時間を短縮することができる。
【０１１６】
＜実施の形態４＞
続いて、実施の形態４について説明する。実施の形態３と同様の内容については、適宜説明を省略する。例えば、実施の形態４では、マイクロコントローラ１の構成、フラッシュシーケンサ６の構成、及びデータ格納用フラッシュメモリ４の構成は、図１〜３を参照して説明した実施の形態３における構成と同様であるため、説明を省略する。
【０１１７】
（実施の形態４の構成）
続いて、図１４を参照して、本実施の形態４に係る管理ステータス用フラッシュメモリ５の構成について説明する。
【０１１８】
図１４に示すように、実施の形態４では、管理ステータス用フラッシュメモリ５は、実施の形態３と比較して、さらに、拡張管理ステータス領域ＥＭを有する。拡張管理ステータス領域ＥＭは、カウント上限値領域ＵＬを有する。カウント上限値領域ＵＬは、ブロックＢ０〜ＢＮにおけるデータの消去回数の上限値であるカウント上限値が格納される。
【０１１９】
より具体的には、拡張管理ステータス領域ＥＭは、フラグ領域ＥＦと、Ａ領域ＥＭ＿Ａと、Ｂ領域ＥＭ＿Ｂとを有する。フラグ領域ＥＦは、上述のフラグ領域Ｆと同様に、Ａ領域ＥＭ＿ＡとＢ領域ＥＭ＿Ｂのいずれの領域が有効かを示す値が格納される。なお、フラグ領域ＥＦの詳細な内容については、フラグ領域Ｆと同様であるため、説明を省略する。
【０１２０】
Ａ領域ＥＭ＿Ａ及びＢ領域ＥＭ＿Ｂのそれぞれは、カウント上限値領域ＵＬ＿Ａ及びカウント上限値領域ＵＬ＿Ｂのそれぞれが格納される。すなわち、カウント上限値領域ＵＬは、カウント上限値領域ＵＬ＿Ａ及びカウント上限値領域ＵＬ＿Ｂを有する。したがって、フラグ領域ＥＦに格納される値は、カウント上限値領域ＵＬ＿Ａとカウント上限値領域ＵＬ＿Ｂのいずれのカウント上限値が有効であるかを示す値とも言える。Ａ領域ＥＭ＿Ａ及びＢ領域ＥＭ＿Ｂは、上述のＡ領域Ｍ＿ＡとＢ領域Ｍ＿Ｂと同様に、交互に上限値が更新される。
【０１２１】
より具体的には、Ａ領域ＥＭ＿Ａが有効である場合には、Ａ領域ＥＭ＿Ａのカウント上限値領域ＵＬ＿Ａに現在のカウント上限値が格納されている。この場合、カウント上限値を更新するときには、カウント上限値領域ＵＬ＿Ａのカウント値は更新されず、そのカウント上限値の更新後の値が新たな現在のカウント上限値としてカウント上限値領域ＵＬ＿Ｂに格納される。その後、Ｂ領域ＥＭ＿Ｂが有効にされる。一方、Ｂ領域ＥＭ＿Ｂが有効である場合には、Ｂ領域ＥＭ＿Ｂのカウント上限値領域ＵＬ＿Ｂに現在のカウント上限値が格納されている。この場合、カウント上限値を更新するときには、カウント上限値領域ＵＬ＿Ｂのカウント上限値は更新されず、そのカウント上限値の更新後の値が新たな現在のカウント上限値としてカウント上限値領域ＵＬ＿Ａに格納される。その後、Ａ領域ＥＭ＿Ａが有効にされる。
【０１２２】
フラグ領域ＥＦ、Ａ領域ＥＭ＿Ａ、及びＢ領域ＥＭ＿Ｂは、管理ステータス用フラッシュメモリ５において、データが消去される最小単位（ブロック）以上のサイズとなる。より具体的には、フラグ領域ＥＦ、Ａ領域ＥＭ＿Ａ、及びＢ領域ＥＭ＿Ｂのそれぞれは、典型的には、異なる１つのブロックで構成される。すなわち、フラグ領域ＥＦ、Ａ領域ＥＭ＿Ａ、及びＢ領域ＥＭ＿Ｂのそれぞれは、典型的には、同一サイズである。しかしながら、例えば、カウント上限値が１つのブロックのデータ量で表現できない場合には、Ａ領域ＥＭ＿Ａ、及びＢ領域ＥＭ＿Ｂのそれぞれは、複数のブロックで構成されていてもよい。フラグ領域ＥＦも、現実的にはそれに格納される値は１つのブロックのデータ量で表現可能であるが、複数のブロックで構成されていてもよい。また、フラグ領域ＥＦ、Ａ領域ＥＭ＿Ａ、及びＢ領域ＥＭ＿Ｂのそれぞれに格納される値は、必ずしも、それぞれの領域を構成するブロックにおける全てのビットを使用して表現する必要はない。よって、フラグ領域ＥＭ、Ａ領域ＥＭ＿Ａ、及びＢ領域ＥＭ＿Ｂのそれぞれに格納される値は、サイズの異なるデータで表現されていてもよい。
【０１２３】
（実施の形態４の動作）
続いて、図１５及び図１６を参照して、実施の形態３に係るフラッシュシーケンサ６のデータ消去処理について説明する。ステップＳ３１の処理は、実施の形態１におけるステップＳ１の処理と同様であるため、説明を省略する。
【０１２４】
制御部１０は、実施の形態３におけるステップＳ３１〜Ｓ３３と同様に、Ａ領域ＥＭ＿ＡとＢ領域ＥＭ＿Ｂが有効か無効かを判定し、カウント許可フラグを読み出し、読み出したカウント許可フラグがカウント許可を示しているか否かを判定する（Ｓ６１〜Ｓ６３）。
【０１２５】
読み出したカウント許可フラグがカウント許可を示している場合（Ｓ６３：Ｙｅｓ）、制御部１０は、拡張管理ステータス領域ＥＭのフラグ領域ＥＦの値を読み出し、読み出した値に基づいてＡ領域ＥＭ＿ＡとＢ領域ＥＭ＿Ｂのうち、いずれの領域が有効領域であり、いずれが無効領域であるかを判定する（Ｓ６４）。制御部１０は、拡張管理ステータス領域ＥＭ内の有効領域に格納されたカウント上限値を読み出す（Ｓ６５）。制御部１０は、実施の形態３におけるステップＳ３５と同様に、現在のカウント値を読み出す（Ｓ６６）。
【０１２６】
制御部１０は、読み出した現在のカウント値に１を加算した値が、読み出したカウント上限値以下であるか否かを判定する（Ｓ６７）。現在のカウント値に１を加算した値がカウント上限値よりも大きい場合（Ｓ６７：Ｎｏ）、ステータスレジスタ２３のエラーフラグに１を格納することで、エラーを通知するステータスデータをエラー割り込み信号としてＣＰＵ２に出力してデータ消去処理を終了する（Ｓ６８）。なお、このエラー（消去回数エラー）を示すエラーフラグは、カウント許可設定エラー、書き込みエラー、及び消去エラーを示すエラーフラグと同一ビットにまとめて定義してもよく、異なるビットに定義してもよい。
【０１２７】
現在のカウント値に１を加算した値がカウント上限値以下である場合（Ｓ６７：Ｙｅｓ）、制御部１０は、実施の形態３におけるステップＳ３４、Ｓ３６〜Ｓ３９と同様に、無効領域のデータを消去し、現在のカウント値に１を加算した値を無効領域に書き込み、カウント許可フラグを無効領域に書き込み、フラグ領域Ｆの値を更新し、ブロックＢのデータを消去する（Ｓ６９〜Ｓ７３）。そして、データ消去処理を終了する。
【０１２８】
読み出したカウント許可フラグがカウント禁止を示している場合（Ｓ６３：Ｎｏ）、制御部１０は、ステップＳ６４〜７２のいずれの処理も実施することなく、ブロックＢのデータを消去してデータ消去処理を終了する（Ｓ７３）。
【０１２９】
続いて、図１７を参照して、実施の形態４に係るフラッシュシーケンサ６のコマンドについて説明する。実施の形態４では、図１７に示すように、実施の形態３と比較して、さらに、カウント上限値設定コマンドが用意されている。
【０１３０】
カウント上限値を設定する場合、ＣＰＵ２は、周辺バス８を介して、カウント上限値設定コマンドを示すライトデータをコマンド指定レジスタ２２に順次書き込む。より具体的には、ＣＰＵ２は、Ｈ’４３、Ｈ’０２、カウント上限値への設定値、Ｈ’Ｄ０の順番でライトデータをコマンド指定レジスタ２２に順次書き込む。
【０１３１】
これに応じて、フラッシュシーケンサ６の制御部１０は、拡張管理ステータス領域ＥＭのカウント上限値領域ＵＬのカウント上限値を、ライトデータとして書き込まれた設定値に基づいて変更する。
【０１３２】
なお、カウント上限値は、拡張管理ステータス領域ＥＭのみに格納されているため、アドレス指定レジスタ２１に書き込まれたアドレスデータは考慮されない。しかしながら、これに限られない。例えば、管理ステータス用フラッシュメモリ５のうち、カウント上限値領域ＵＬのアドレスを指定してカウント上限値設定コマンドが発行された場合には、エラーとして扱わず、カウント上限値の変更を可能としてもよい。このようにしても、フラグ領域Ｆ、カウンタＣ（Ａ領域Ｍ＿Ａ、Ｂ領域Ｍ＿Ａ）のアドレスが指定された場合にエラーとして扱いさえすれば、消去回数（カウント値）の改ざんを防止することができるからである。
【０１３３】
続いて、図１８を参照して、本実施の形態４に係るフラッシュシーケンサ６のカウント上限値設定処理について説明する。
【０１３４】
フラッシュシーケンサ６の制御部１０は、コマンド受信部１２によってカウント上限値設定コマンドを示すライトデータが受信された場合、拡張管理ステータス領域ＥＭのフラグ領域ＥＦの値を読み出す。制御部１０は、読み出した値に基づいてＡ領域ＥＭ＿ＡとＢ領域ＥＭ＿Ｂのいずれの領域が有効領域であり、いずれが無効領域であるかを判定する（Ｓ７１）。制御部１０は、拡張管理ステータス領域ＥＭ内の有効領域に格納された現在のカウント上限値を読み出す（Ｓ７２）。制御部１０は、カウント上限値設定コマンドにおいてコマンド指定レジスタ２２に格納された設定値が、読み出した現在のカウント上限値未満であるか否かを判定する（Ｓ７３）。
【０１３５】
設定値がカウント上限値未満であると判定した場合（Ｓ７３：Ｙｅｓ）、制御部１０は、拡張管理ステータス領域ＥＭ内の無効領域のデータを消去して、新たなカウント上限値を書き込み可能な状態にする（Ｓ７４）。制御部１０は、設定値を新たなカウント上限値として無効領域に書き込む（Ｓ７５）。制御部１０は、新たなカウント上限値が格納された領域を有効領域として示し、他方の領域を無効領域として示すようにフラグ領域Ｆの値を更新する（Ｓ７６）。
【０１３６】
設定値がカウント上限値以上であると判定した場合（Ｓ７３：Ｎｏ）、ステータスレジスタ２３のエラーフラグに１を格納することで、エラーを通知するステータスデータをエラー割り込み信号をＣＰＵ２に出力してカウント上限値設定処理を終了する（Ｓ７７）。なお、このエラー（カウント上限値設定エラー）を示すエラーフラグは、消去回数エラー、カウント許可設定エラー、書き込みエラー、及び消去エラーを示すエラーフラグと同一ビットにまとめて定義してもよく、異なるビットに定義してもよい。
【０１３７】
（実施の形態４の特徴および効果）
以上に説明したように、本実施の形態４では、カウンタＣが示すカウント値が、カウント上限値（上限値格納領域）に格納されたカウント上限値を超える場合には、ブロックＢにおけるデータの消去を抑止するようにしている。これによれば、悪意のある第三者がデータ格納用フラッシュメモリ４におけるデータの改ざんを繰り返し、ソフトウェアのデバッグ等を実施すること防止できる。
【０１３８】
また、本実施の形態４では、カウント上限値を変更する場合、カウント値は変更されないため、実施の形態１や実施の形態３と同様にカウント値を保護することができる。
【０１３９】
また、本実施の形態４では、Ａ領域ＥＭ＿Ａ及びＢ領域ＥＭ＿Ｂのうち、フラグ領域Ｆの値が有効と示さない領域に対して変更後のカウント上限値を格納し、その領域を有効と示すようにフラグ領域Ｆの値を更新するようにしている。すなわち、カウント上限値設定コマンドに応じた処理フローは、データ消去における管理ステータス用フラッシュメモリの処理フローと同様となる。よって、図６を参照して説明したように、悪意のある第三者が、マイクロコントローラ１のリセット又は電源切断・投入等の手段によって、フラッシュシーケンサ６のカウント上限値設定処理を中断させたとしても、カウント上限値を改ざんすることができない。
【０１４０】
また、本実施の形態４では、ＣＰＵ２から受信したカウント上限値設定コマンドによって、カウント上限値を低くする変更が要求された場合にはカウント上限値の変更を許容し、カウント上限値を高くする変更が要求された場合にはカウント上限値の変更を抑止するようにしている。これによれば、悪意のある第三者がカウント上限値を増加させて、データ格納用フラッシュメモリ４の改ざんを継続することを防止できる。
【０１４１】
また、上述の説明では、実施の形態３に対してカウント上限値によるデータ消去抑止機能及びカウント上限値設定機能を追加した形態について説明したが、実施の形態１又は実施の形態２に対してもデータ消去抑止機能及びカウント上限値設定機能を追加した形態についても当然に実施可能である。
【０１４２】
また、カウント上限値領域ＵＬを、カウンタＣ及びカウント許可フラグ領域Ａと同様に、管理ステータス領域Ｍ０〜ＭＮのそれぞれに有するようにしてもよい。この場合、制御部１０は、ブロックＢにおけるデータ消去を許容するか抑止するかを、そのブロックＢに対応する管理ステータス領域ＭにおいてカウンタＣのカウント値がカウント上限値領域ＵＬのカウント上限値を超えるか否かによって判定する。
【０１４３】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は既に述べた実施の形態に限定されるものではなく、その要旨を逸脱しない範囲において種々の変更が可能であることはいうまでもない。
【０１４４】
上記実施の形態１〜４では、マイクロコントローラ１の例について説明したが、これに限られない。上述のフラッシュメモリ４、５及びフラッシュシーケンサ６等の適用対象となる情報処理装置は、マイクロコントローラに限られず、パーソナルコンピュータ等であってもよい。ただし、パーソナルコンピュータ等に適用する場合には、好ましくは、フラッシュメモリ４、５とフラッシュシーケンサ６が１つのチップに含まれているとよい。そのようにすることで、フラッシュメモリ４、５をフラッシュシーケンサ６を介さずに他の装置に接続することで、不正にフラッシュメモリ４、５のデータを改ざん可能とすることを防止することができる。
【０１４５】
上記実施の形態１〜４では、データが格納される領域（ブロックＢ）と、そのデータの消去回数を示すカウント値が格納される領域（カウンタＣ）とを異なるフラッシュメモリ４、５に有する例について説明したが、これに限られない。すなわち、ブロックＢと管理ステータス領域Ｍ（カウンタＣ）とを同一のフラッシュメモリに有するようにしてもよい。このようにしても、管理ステータス領域Ｍ（カウンタＣ）のアドレスを指定したデータ書込み及びデータ消去を抑止すれば、消去回数（カウント値）の改ざんを防止することができるからである。
【０１４６】
しかしながら、上述したように、フラッシュメモリは、その全て又は殆どのブロック（データの最小消去単位）が同一サイズとされることが多い。一方で、管理ステータス領域Ｍにおけるデータ（フラグ領域Ｆの値、カウント値）は、ブロックＢにおけるデータ（例えばソフトウェア）よりもサイズが小さい。そのため、それらのデータを同一のフラッシュメモリに格納するようにすることで、管理ステータス領域Ｍにおけるデータを、ブロックＢと同一サイズのブロックに格納してしまうとフラッシュメモリにおいて実質的に利用されない無駄な領域が生じてしまう。したがって、好ましくは、実施の形態１〜４において説明したように、ブロックＢと管理ステータス領域Ｍ（カウンタＣ）とを異なるフラッシュメモリに有するようにするとよい。そのようにすることで、管理ステータス用フラッシュメモリ５として、データ格納用フラッシュメモリ４よりもブロックサイズの小さいフラッシュメモリを採用することで、上述の無駄を無くし、全体的なフラッシュメモリの容量を削減することができる。また、ブロックサイズを小さくすることができるため、カウント値等の更新時におけるデータ消去及びデータ書き込み時間を短縮することができる。
【０１４７】
例えば、マイクロコントローラでは、ブロックサイズが大きいコードフラッシュメモリ（プログラム格納用フラッシュメモリ）と、それよりもブロックサイズの小さいデータフラッシュメモリ（データ格納用フラッシュメモリ）とを混載する場合がある。このような場合、管理ステータス用フラッシュメモリ４として、データフラッシュメモリを利用すると有効である。
【０１４８】
また、上記実施の形態１〜４では、管理ステータス領域ＭがＡ領域Ｍ＿ＡとＢ領域Ｍ＿Ｂとを有するようにし、カウンタＣ＿Ａ、Ｃ＿Ｂ及びカウント許可フラグ領域Ａ＿Ａ、Ａ＿Ｂを、Ａ領域Ｍ＿ＡとＢ領域Ｍ＿Ｂのそれぞれに有する例について説明したが、これに限られない。管理ステータス領域Ｍは、カウンタと、カウント許可フラグ領域を１つだけ有するようにしてもよい。しかしながら、好ましくは、上述したように、Ａ領域Ｍ＿ＡとＢ領域Ｍ＿Ｂのデータを交互に更新するようにすることで、図６を参照して説明したように、データが不正に改ざんされないようにすることができる。
【０１４９】
また、上記実施の形態３では、カウント許可フラグを変更可能としているが、カウント許可フラグとして、予め定められた固定値を有するようにしてもよい。上述の実施の形態４でも、カウント上限値を変更可能としているが、カウント上限値として、予め定められた固定値を有するようにしてもよい。
【０１５０】
また、上記実施の形態１〜４では、カウンタＣがカウント値として消去回数そのものを示す例について説明したが、これに限られない。例えば、カウンタＣがカウント値として、消去回数に所定の値を乗じた値を示すようにしてもよい。すなわち、この場合には、制御部１０は、カウント値に所定の値を加算することで、カウントＣのカウント値を更新する。
【符号の説明】
【０１５１】
１  マイクロコントローラ
２  ＣＰＵ
３  ＲＡＭ
４  データ格納用フラッシュメモリ
５  管理ステータス用フラッシュメモリ
６  フラッシュシーケンサ
７  周辺回路
８  周辺バス
１０  制御部
１１  アドレス受信部
１２  コマンド受信部
１３  ステータス送信部
２１  アドレス指定レジスタ
２２  コマンド指定レジスタ
２３  ステータスレジスタ
Ｂ、Ｂ０〜ＢＮ  ブロック
Ｍ、Ｍ０〜ＭＮ  管理ステータス領域
Ｃ、Ｃ０〜ＣＮ、Ｃ＿Ａ、Ｃ＿Ｂ、Ｃ０＿Ａ〜ＣＮ＿Ａ、Ｃ０＿Ｂ〜ＣＮ＿Ｂ  カウンタ
Ｆ、Ｆ０〜ＦＮ、ＥＦ  フラグ領域
Ｍ＿Ａ、Ｍ０＿Ａ〜ＭＮ＿Ａ、ＥＭ＿Ａ  Ａ領域
Ｍ＿Ｂ、Ｍ０＿Ｂ〜ＭＮ＿Ｂ、ＥＭ＿Ｂ  Ｂ領域
Ａ、Ａ０〜ＡＮ、Ａ＿Ａ、Ａ＿Ｂ、Ａ０＿Ａ〜ＡＮ＿Ａ、Ａ０＿Ｂ〜ＡＮ＿Ｂ  カウント許可フラグ領域
ＥＭ  拡張管理ステータス領域
ＵＬ、ＵＬ＿Ａ、ＵＬ＿Ｂ  カウント上限値領域
【図１】
0006421042.tif 000002
【図２】
0006421042.tif 000003
【図３】
0006421042.tif 000004
【図４】
0006421042.tif 000005
【図５】
0006421042.tif 000006
【図６】
0006421042.tif 000007
【図７】
0006421042.tif 000008
【図８】
0006421042.tif 000009
【図９】
0006421042.tif 000010
【図１０】
0006421042.tif 000011
【図１１】
0006421042.tif 000012
【図１２】
0006421042.tif 000013
【図１３】
0006421042.tif 000014
【図１４】
0006421042.tif 000015
【図１５】
0006421042.tif 000016
【図１６】
0006421042.tif 000017
【図１７】
0006421042.tif 000018
【図１８】
0006421042.tif 000019