AVRフラッシュメモリの破損


11

この質問は、AVRのプログラミング解除自体に関連しています

プロジェクト情報:
ATMEGA644Pを使用したバッテリー駆動製品があります。アプリケーションはスリープモードで永続的に実行され、1秒間に1回(RTC)または2つの外部割り込みラインの1つがトリガーされたときにのみ起動します。

このデバイスは、UART(RS232インターフェースICを使用)で通信する非常にシンプルなブートローダーを備えています。これは、ハードウェアISPプログラマーが必要ないように、ファームウェアを更新する便利な方法としてのみ機能します。(ブートローダーは、チェックサムで保護された電報を期待しています)

消費電力が2倍になり、長いバッテリー寿命が必須であるため、デバイスは内部ブラウ​​ンアウトを無効にして設計されました(外部ブラウンアウト検出を使用する必要があったと思われます-再設計が進行中です)。

問題:
数か月ごとにデバイスが機能しなくなり、それらのデバイスでファームウェアの更新が実行されませんでした。ただし、さらに調査した結果、これらのデバイスのフラッシュコンテンツは破損しているようです。さらに、これらのデバイスの一部のバッテリーはまだ良好でしたが、何らかの低電圧状態を排除したくありません。

これは、元のフラッシュコンテンツ(左)と破損したコンテンツ(右)の比較です。

フラッシュ比較

いくつかの観察:

  • 破損したブロックは常に少なくとも1つのフラッシュページ(256バイト)で構成され、ページに揃えられます。つまり、影響を受けるのはページ全体であり、1バイトではありません。
  • 破損したコンテンツはほとんどの場合0xFFを読み取りますが、他の値が含まれているか、完全に「ランダム」である可能性もあります。
  • 画像の左側にある小さなバーは、影響を受けるすべての領域を示しています。このデバイスの場合、合計フラッシュコンテンツの約10分の1です。
  • 影響を受けるページが1つだけのデバイスが1つありました。

フラッシュメモリへの書き込み中に低電圧状態が発生すると、フラッシュの内容が破損する可能性があります。ただし、これは、一部のフラッシュに敏感な命令を実行する必要があることを意味します。

おそらく、コントローラーは低電圧のためにランダムに再起動しており、この間、ブートローダーコードはまったく予測不可能な動作をしている可能性があります。不足電圧に関する別のフォーラムの人を引用するには:

「実行されるのはフラッシュからのランダムな命令だけではなく、ランダムな命令期間です(フラッシュからのコードが正しく読み取られ、解釈されるという保証はありません)。メカニズム。」

質問:「不足電圧時のランダムな動作と、フラッシュページ内のデータを変更する命令の実行」
と思われますか?説明は正しいですか?その場合、ソフトウェアの問題(スタックオーバーフロー、無効なポインター)の原因として、この種のエラーを常に表示しないのはなぜですか。

この種の破損を引き起こす可能性のある他のアイデアはありますか?これはEMI / ESDが原因ですか?


あなたの例の2番目のブロックでは、1-> 0からのビットがありましたか、それともすべて0-> 1の遷移ですか?これを計算するスクリプトがありますが、スクリーンショットのすべての数字を入力するつもりはありません。
マークラージュ14年

@markrages:それを見ると、0-> 1のみ。また、1つの答えは、すべてのビットが1に反転されたわけではない部分的な消去のように見えることを指摘しました。
Rev1.0 14年

回答:


11

フラッシュは書き込まれず、消去されることに注意してください。消去されたフラッシュは0xFFでいっぱいです。最初の256バイトは完全に消去され、3番目の256バイト領域は部分的に消去されます(正しいデータから破損したビットフリップまでのビットフリップは0〜1のみです)。

データシートによると、このフラッシュはページ消去可能です(通常、ページよりも大きな消去ブロックで作業します)。282ページに見られるように、SPMによるページ消去の実行は非常に簡単です。

セクション23.8.1(フラッシュ破損の防止)に興味があるかもしれません:

フラッシュプログラムの破損は、電圧が低すぎる2つの状況によって発生する可能性があります。まず、フラッシュへの定期的な書き込みシーケンスは、正しく動作するために最小電圧を必要とします。第二に、命令を実行するための供給電圧が低すぎると、CPU自体が命令を誤って実行する可能性があります。フラッシュの破損は、次の設計上の推奨事項に従うことで簡単に回避できます(1つで十分です)。

  1. システムでブートローダーを更新する必要がない場合は、ブートローダーロックビットをプログラムして、ブートローダーソフトウェアが更新されないようにします。
  2. 電源電圧が不十分な間は、AVR RESETをアクティブ(低)にしてください。
    これは、動作電圧が検出レベルと一致する場合、内部ブラウ​​ンアウト検出器(BOD)を有効にすることで実行できます。そうでない場合は、外部の低VCCリセット保護回路を使用できます。書き込み操作の進行中にリセットが発生した場合、電源電圧が十分であれば書き込み操作は完了します。
  3. 低VCCの期間中は、AVRコアをパワーダウンスリープモードに保ちます。これにより、CPUが命令をデコードおよび実行しようとするのを防ぎ、SPMCSRレジスタとフラッシュを意図しない書き込みから効果的に保護します。

3ページ目の部分消去に関するあなたの観察はもっともらしいようです。Atmelのテキストについて:BODは必須であると思われることに全員が同意します。しかし、腐敗の正確な原因についてはまだわかりません。コントローラーがフラッシュページを消去するこの特定の命令を(低電圧のために)実行するだけではないでしょうか?つまり、フラッシュはそこからしか書き込みできないため、これはブートローダーコードの実行中にも発生する必要があります。また、特定のシーケンスが必要です。
Rev1.0 14年

3
破損の正確な原因を説明することはできません。Vccが低下すると、1つのトランジスタを他のトランジスタで完全に飽和させるには低すぎます。MCUは基本的に非常に大きな論理式です。トランジスタが論理スイッチとして動作しなくなった場合、この式を変更します。誤動作する最初のトランジスタはASICウェーハドーピングと外部電磁摂動に依存するため、何が起こるかを予測することはできません。この問題に対処するために、ASICを設計するときに、誤動作する前にデジタルパーツをオフにするアナログパーツを追加できます。ただし、ASIC全体のコストが増加します。
ジェイセン14年

アプリケーションノートAVR180 External Brown-out Protectionの状態が「AVR®内部フラッシュプログラムメモリの内容が不十分な電源電圧の影響を受けないことに注意してください」と混同する。さらに:「AVR CPUは独自のプログラムメモリに書き込むことができないため、内部フラッシュプログラムメモリの内容が電源障害の影響を受けることはありません。」-IMO Atmelは、フラッシュメモリを変更する必要があるブートローダーのようなものがあることを無視しています。
Rev1.0 14年

@ Rev1.0ええ、それはかなりありそうにないことです...だから、すべてのデバイスではなく、数か月ごとに1つのデバイスでしか表示されません。
user253751

「つまり、フラッシュはそこからしか書き込みできないため、ブートローダーのコード実行中にこれを行う必要さえあります。」-これは、ブートロックビット(BLB01およびフレンド)が適切に設定されている場合にのみ当てはまります!彼らは?「混乱...アプリケーションノート...」 -アプリケーションノートは信頼性が低いことで有名です。インスピレーションのみに使用してください。保証のために、データシートに頼ってください(これも間違いではありませんが、ちょっと)。
-marcelm

4

これはよく知られた問題であり、多くのマイクロコントローラー(Atmelだけでなく)に影響します。フラッシュメモリ制御ハードウェアは、低電圧状態でメモリの一部を破損または消去します。簡単な修正は、ブラウンアウト保護を有効にすることです。

もちろん、マイクロコントローラーの電圧低下保護は常に有効にしてください。


3
HOWおよびWHY「メモリ制御ハードウェアが低電圧状態でメモリの一部を破損または消去する」という確固たる参考資料はありますか?フラッシュの破損に関するフォーラムでの議論はたくさんありますが、それが堅実なものになることはほとんどないので、私はここで尋ねました。
Rev1.0 14年

チップ内の低電圧の問題ですか、それとも、ブートローダーセクションのプログラムの間違った/ランダムな実行に関連していますか?2番目の問題が問題の場合、FUSEを介したブートローダーの実行を無効にすると問題が解決します。
TMa 14年

少なくとも1つのMEGAマイクロの正誤表でそれについて読んだことを覚えています。
ユーザー14年

3

低電圧が原因である可能性が非常に高いです。たとえば、かつて1.8 Vの電圧低下レベルが頻繁に破損を引き起こすプロジェクトがあり、これらの破損は3.5 Vの電圧低下レベルでは再現できませんでした。

プロセッサの実行速度が速いほど、低電圧の問題に敏感になることに注意してください。CPU周波数を下げることが利用可能なオプションである場合、試してみる価値があります。


1
ご回答ありがとうございます。最終的に、外部の超低電力ブラウンアウト検出器を使用することになり、それ以来破損の問題はありませんでした。
-Rev1.0

0

PCB設計の主なルールに従わない場合、EMCは最大の敵になります。ここに私自身の経験から最も重要なものがあります:-製造元がデータシートで地獄の回路図について何と言っているかに関係なく、ICのブロッキングコンデンサは、各ICの電力線に100pF-1nFの間に少なくとも1つを入れます-各PCBの層を可能な限り。これらの領域は、可能な限り頻繁にビアを介してすべての層を介して接続する必要があり、50milのグリッドが適切な値です。それらのエリアを接地信号に接続します。-PCBに未接続(フローティング、信号接続なし)の銅を決して残さないでください。アンテナのように機能し、デバイスに電磁放射を明確に当てます-クロック信号を運ぶトレースをできるだけ短くします

「EMCプルーフPCB設計のガイド」などの検索エンジンリクエストで詳細を検索

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.