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