Diese Frage bezieht sich auf die AVR-Deprogrammierung selbst .
Projektinfo:
Wir haben ein batteriebetriebenes Produkt mit einem ATMEGA644P. Die Anwendung läuft permanent im Schlafmodus und wacht nur einmal pro Sekunde (RTC) oder wenn eine der beiden externen Interrupt-Leitungen getriggert wird auf.
Das Gerät verfügt über einen ziemlich einfachen Bootloader, der über UART kommuniziert (mit RS232-Schnittstellen-IC). Es dient nur als bequeme Methode zum Aktualisieren der Firmware, sodass kein Hardware-ISP-Programmierer erforderlich ist. (Der Bootloader erwartet prüfsummengesicherte Telegramme)
Die Geräte wurden mit internem Brown-out DEAKTIVIERT entwickelt, da dies den Stromverbrauch verdoppelt und eine lange Batterielebensdauer obligatorisch ist (ich denke, dass eine externe Brown-out-Erkennung verwendet werden sollte - ein Re-Design ist in Arbeit).
Problem:
Alle paar Monate funktioniert ein Gerät einfach nicht mehr, es wurden KEINE Firmware-Updates auf diesen Geräten durchgeführt. Nach weiterer Untersuchung scheinen die Flash-Inhalte dieser Geräte jedoch beschädigt zu sein. Außerdem waren die Batterien einiger dieser Geräte noch gut, aber ich möchte eine Art Unterspannungssituation nicht ausschließen.
Dies ist ein Vergleich der ursprünglichen Flash-Inhalte (links) mit den beschädigten Inhalten (rechts):
Einige Beobachtungen:
Es ist völlig plausibel, dass ein Unterspannungszustand beim Schreiben des Flash-Speichers den Flash-Inhalt beschädigen kann. Dies würde jedoch bedeuten, dass einige flash-sensitive Anweisungen ausgeführt werden müssen.
Möglicherweise startet der Controller aufgrund von Unterspannung zufällig neu und der Bootloader-Code verhält sich während dieser Zeit völlig unvorhersehbar. Um einen Typen aus einem anderen Forum bezüglich Unterspannung zu zitieren:
"Es werden nicht nur zufällige Anweisungen vom Flash ausgeführt, sondern auch zufällige Anweisungen (es gibt keine Garantie dafür, dass der Code vom Flash richtig gelesen und interpretiert wird). Außerdem verhalten sich andere Teile der MCU möglicherweise nicht wie vorgesehen, einschließlich des Schutzes Mechanismen."
Frage(n):
Glauben Sie, dass die Erklärung "zufälliges Verhalten bei Unterspannung und Ausführung einiger Anweisungen, die Daten in Flash-Seiten ändern" stichhaltig ist? Wenn das der Fall ist, warum sehen wir diese Art von Fehlern nicht ständig nur als Ursache für einige Softwareprobleme (Stapelüberlauf, ungültige Zeiger).
Haben Sie weitere Ideen, was diese Art von Korruption verursachen könnte? Könnte dies durch EMI/ESD verursacht werden?
Sie sollten feststellen, dass der Flash nicht geschrieben, sondern gelöscht wird. Ein gelöschter Flash ist voll mit 0xFF. Ihre ersten 256 Byte werden vollständig gelöscht, Ihre dritte 256-Byte-Region wird teilweise gelöscht (Sie haben nur 0 bis 1 Bitflips von korrekten Daten zu beschädigten).
Laut Datenblatt ist dieser Flash seitenlöschbar (ich arbeite normalerweise mit Löschblöcken, die größer als die Seiten sind). Wie auf Seite 282 zu sehen ist, ist das Durchführen von Page Erase by SPM ziemlich einfach.
Abschnitt 23.8.1 (Verhindern von Flash-Korruption) könnte Sie interessieren:
Eine Beschädigung des Flash-Programms kann durch zwei Situationen verursacht werden, in denen die Spannung zu niedrig ist. Erstens erfordert eine reguläre Schreibsequenz zum Flash eine Mindestspannung, um korrekt zu funktionieren. Zweitens kann die CPU selbst Befehle falsch ausführen, wenn die Versorgungsspannung zum Ausführen von Befehlen zu niedrig ist. Flash-Korruption kann leicht vermieden werden, indem Sie diese Designempfehlungen befolgen (eine reicht aus):
- Wenn im System keine Bootloader-Aktualisierung erforderlich ist, programmieren Sie die Bootloader-Sperrbits, um Aktualisierungen der Bootloader-Software zu verhindern.
- Halten Sie AVR RESET aktiv (low) während Perioden mit unzureichender Versorgungsspannung.
Dies kann durch Aktivieren des internen Brown-Out-Detektors (BOD) erfolgen, wenn die Betriebsspannung dem Erkennungspegel entspricht. Falls nicht, kann eine externe Rücksetzschutzschaltung für niedrige VCC verwendet werden. Wenn ein Reset auftritt, während eine Schreiboperation im Gange ist, wird die Schreiboperation abgeschlossen, vorausgesetzt, dass die Stromversorgungsspannung ausreichend ist.- Halten Sie den AVR-Core während Perioden mit niedriger VCC im Power-down-Schlafmodus. Dadurch wird verhindert, dass die CPU versucht, Anweisungen zu decodieren und auszuführen, wodurch das SPMCSR-Register und damit der Flash wirksam vor unbeabsichtigten Schreibvorgängen geschützt werden.
BLB01
und Co.) entsprechend gesetzt sind! Sind sie? "Verwirrend ... Anwendungshinweis ..." - Anwendungshinweise sind notorisch unzuverlässig. Verwenden Sie sie nur zur Inspiration; Verlassen Sie sich für Garantien auf die Datenblätter (die auch nicht unfehlbar sind, aber hey).Dies ist ein bekanntes Problem und betrifft viele Mikrocontroller (nicht nur Atmel). Die Flash-Speicher-Steuerhardware beschädigt oder löscht einen Teil des Speichers unter Niederspannungsbedingungen. Die einfache Lösung besteht darin, den Brownout-Schutz zu aktivieren.
Selbstverständlich sollten Sie den Brownout-Schutz auf Mikrocontrollern immer aktivieren.
Die Unterspannung ist eine sehr wahrscheinliche Ursache. Ich hatte zum Beispiel einmal ein Projekt, bei dem ein Brownout-Pegel von 1,8 V häufig zu Korruption führte, und diese Korruptionen konnten mit einem Brownout-Pegel von 3,5 V nie reproduziert werden.
Beachten Sie, dass der Prozessor umso empfindlicher auf Unterspannungsprobleme reagiert, je schneller er läuft. Wenn das Senken der CPU-Frequenz für Sie eine verfügbare Option ist, könnte es einen Versuch wert sein.
EMV wird Ihr größter Feind sein, wenn man sich nicht an die Hauptregeln des PCB-Designs hält. Hier sind die wichtigsten aus meiner eigenen Erfahrung: - Sperrkondensatoren auf jedem IC, unabhängig davon, was die Hersteller in ihren Datenblättern über höllische Schaltpläne sagen, legen Sie mindestens einen zwischen 100 pF - 1 nF auf die Stromleitungen jedes ICs - Leitende Massebereiche an jede PCB-Schicht so weit wie möglich. Diese Bereiche sollen so oft wie möglich durch alle Lagen hindurch über Vias kontaktiert werden, ein Raster von 50mil ist ein guter Wert. Verbinden Sie diese Bereiche mit dem Massesignal. - Lassen Sie niemals unverbundenes (schwebendes, an kein Signal angeschlossenes) Kupfer in Ihrer Leiterplatte. Es wirkt wie eine Antenne und bringt elektromagnetische Strahlung auf göttliche Weise auf die Geräte - machen Sie die Spuren, die Taktsignale tragen, so kurz wie möglich
Finden Sie mehr Details durch Suchmaschinenanfragen wie "Leitfaden für EMV-sicheres Leiterplattendesign"
Markierungen
Rev