AVRフラッシュメモリ破損

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

Project info:
We have a battery powered product using an ATMEGA644P. The application permanently runs in sleep mode and only wakes up once a second (RTC) or when one of the two external interrupt lines is triggered.

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

消費電力が2倍になり、長いバッテリ寿命が必須であるため、これらのデバイスは内部の電圧低下検出を無効にして設計されています(外部電圧低下検出を使用する必要があります。

Problem:
Every few month a device just stops working, there were NO firmware updates performed on those devices. However, after further examination, the flash contents of those devices seem to be corrupted. Furthermore, the batteries of some of those devices were still good, but I don't want to rule out some kind of under-voltage situation.

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

Flash comparison

いくつかの観察:

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

フラッシュメモリの書き込み中に低電圧状態になると、フラッシュの内容が破損する可能性があります。しかしながら、これはフラッシュに敏感な命令が実行されなければならないことを意味するでしょう。

たぶんコントローラが低電圧のためにランダムに再起動していて、ブートローダーコードがこの間全く予測不可能に動作しているのでしょう。不足電圧に関して他のフォーラムの何人かの男を引用するには:

"It is not only random instructions from flash being executed, but random instructions period (there is no guarantee that the code from flash will be read & interpreted correctly). Along with this other parts of the mcu may not behave as designed, including protection mechanisms."

Question(s):
Do you think the "random behavior during under-voltage and executing some instructions changing data in flash pages" - explanation is sound? If that is the case, why don't we see this kind of errors all the time just as a cause of some software issues (stack overflow, invalid pointers).

このような腐敗の原因となり得る他の考えはありますか。これはEMI/ESDによるものでしょうか。

11
あなたの例の2番目のブロックでは、1から0へのビット移動、または0から1への遷移ビットのすべてがありましたか。これを計算するスクリプトがありますが、スクリーンショットの数字をすべて入力するつもりはありません。
追加された 著者 Calvin Allen,
@markrages:見てから、0 - > 1だけ。ある回答では、すべてのビットが1に反転していない部分消去のように見えることも指摘されています。観察していただきありがとうございます。
追加された 著者 Rev1.0,

4 答え

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

データシートによると、このフラッシュはページ消去可能(私は通常、ページよりも大きい消去ブロックを処理します)。 282ページにあるように、SPMによるページ消去の実行はとても簡単です。

あなたは、23.8.1節(フラッシュの破損防止)に興味があるかも ):

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

     
      
  1. システムでブートローダの更新が不要な場合は、ブートローダソフトウェアの更新を防ぐためにブートローダロックビットを設定します。
  2.   
  3. 電源電圧が不十分な間はAVR RESETをアクティブ(ロー)にしてください。
      動作電圧が検出レベルと一致する場合、これは内部の低電圧検出器(BOD)を許可することによって行うことができます。そうでない場合は、外部低VCCリセット保護回路を使用することができます。書き込み中にリセットが発生した場合、電源電圧が十分であれば書き込みは完了します。
  4.   
  5. VCCが低い間はAVRコアをパワーダウンスリープモードにしてください。これにより、CPUが命令をデコードして実行しようとするのを防ぎ、意図しない書き込みからSPMCSRレジスタとフラッシュを効果的に保護します。
  6.   
11
追加された
3ページ目の部分消去についてのあなたの観察はもっともらしいようです。 Atmelのテキストについて:BODは必須であると思われることに私たち全員が同意します。しかし、私はまだ腐敗の正確な原因についてはよくわかりません。フラッシュページを消去するためにコントローラが(低電圧のために)この特定の命令を実行するだけのことはほとんどありませんか。フラッシュはそこからのみ書き込み可能であるため、これはブートローダコードの実行中にも発生しなければならないことを意味します。そしてそれは特定のシーケンスを必要とします。
追加された 著者 Rev1.0,
アプリケーションノート AVR180外部電圧低下保護には、「AVR®に注意してください。内部フラッシュプログラムメモリの内容は不十分な電源電圧の影響を受けません "#:。さらに: "AVR CPUはそれ自身のプログラム メモリに書くことができないので、内蔵フラッシュ プログラム メモリの内容は決して停電状況の影響を受けません。" - IMO Atmelはブートローダのようにフラッシュメモリを変更しなければならないものがあることを単に無視しています。
追加された 著者 Rev1.0,
「フラッシュはそこからのみ書き込み可能であるため、これはブートローダコードの実行中にも発生しなければならないことを意味します。」 - ブートロックビット( BLB01 )の場合と友達)が適切に設定されている!彼らは? "混乱しています...アプリケーションノート..." - アプリケーションノートは信頼できないことで有名です。インスピレーションのためだけにそれらを使用してください。保証のために、データシートに頼ってください(それもまた絶対確実ではありませんがねえ)。
追加された 著者 marcelm,
@ Rev1.0ええ、それはほとんどあり得ません…それが、すべての機器を常に表示するのではなく、数か月ごとに1つの機器でしか表示できない理由です。
追加された 著者 immibis,
それは破損の正確な原因を説明することは不可能です:あなたのVccが低下すると、それは他のもので1つのトランジスタを完全に飽和させるには低すぎます。 MCUは基本的に非常に大きな論理式です。トランジスタが論理スイッチとして機能しなくなった場合は、この式を変更してください。最初に誤動作を起こすトランジスタはASICウェハドーピングと外部電磁摂動に依存しているので、何が起こるか予測することはできません。この問題に対処するには、ASICを設計するときに、誤動作の前にデジタル部分のスイッチをオフにするアナログ部分を追加します。しかしそれは全体のASICコストを増加させます。
追加された 著者 blagbalabal lakmakalap,

これはよく知られた問題で、多くのマイクロ コントローラ(ATMELだけでなく)に影響を及ぼします。フラッシュメモリ制御ハードウェアは、低電圧条件下でメモリの一部を破損または消去します。簡単な解決策は、電圧低下保護を有効にすることです。

もちろん、マイクロコントローラの電圧低下保護を常に有効にする必要があります。

4
追加された
HOWとWHY「低電圧条件下でメモリ制御ハードウェアがメモリの一部を破損または消去する」についての明確な参照がありますか。フラッシュの破損に関しては多くのフォーラムの議論がありますが、それが確実に何かになることはほとんどなく、それが私がここで尋ねた理由です。
追加された 著者 Rev1.0,
少なくとも1つのMEGA microの正誤表で読んだことを覚えています。
追加された 著者 daze413,
それはチップ内低電圧問題ですか?それはAFAIKがフラッシュを修正することができるだけのブートローダセクションのプログラムの間違った/ランダムな実行に関連していますか。 2つ目の問題がFUSE経由でブートローダの実行を無効にすることで問題が解決するはずです。
追加された 著者 KayJay,

不足電圧は非常にありそうな原因です。 たとえば、私はかつて1.8 Vの電圧低下レベルで頻繁に破損が発生し、3.5 Vの電圧低下レベルではこれらの破損を再現できないプロジェクトがありました。

プロセッサの実行速度が速いほど、電圧不足の問題に対する感度が高くなります。 CPU周波数を下げることがあなたに利用可能なオプションであるならば、それは試してみる価値があるかもしれません。

3
追加された
ご回答ありがとうございます。私たちは外部の超低消費電力の電圧低下検出器を使用することになり、それ以来破損の問題はありませんでした。
追加された 著者 Rev1.0,

PCB設計の主なルールに従わなければ、EMCがあなたの最大の敵になるでしょう。 これは私自身の経験から最も重要なものです: - 各ICの電源ラインに最低100pF〜1nFのコンデンサを入れること。 - 各PCBの層にできるだけグランド領域を導電する。それらの領域はビアを介して全ての層を通して可能な限り頻繁に接触しなければならず、50milのグリッドが良い値です。これらの領域をグランド信号に接続してください。 - PCBに未接続(フローティング、信号未接続)の銅を残さないでください。それはアンテナのように機能し、電磁放射をデバイスに絶対に与えます - クロック信号を伝送するトレースをできるだけ短くする

"emcプルーフpcb設計のためのガイド"のような検索エンジン要求によってより多くの詳細を見つけてください

0
追加された