To pytanie dotyczy samego przeprogramowania AVR .
Informacje o projekcie:
Mamy produkt zasilany bateryjnie za pomocą ATMEGA644P. Aplikacja działa na stałe w trybie uśpienia i budzi się tylko raz na sekundę (RTC) lub po uruchomieniu jednej z dwóch zewnętrznych linii przerwania.
Urządzenie posiada dość prosty moduł ładujący, który komunikuje się przez UART (za pomocą interfejsu RS232 IC). Służy jedynie jako wygodna metoda aktualizacji oprogramowania układowego, dzięki czemu nie jest wymagany sprzętowy programista ISP. (Moduł ładujący oczekuje telegramów zabezpieczonych sumą kontrolną)
Urządzenia zostały zaprojektowane z wewnętrznym wyłączeniem zasilania WYŁĄCZONE, ponieważ podwaja zużycie energii, a długa żywotność baterii jest obowiązkowa (wydaje mi się, że należało zastosować zewnętrzne wykrywanie wyłączenia zasilania - trwa przeprojektowanie).
Problem:
Co kilka miesięcy urządzenie po prostu przestaje działać, na tych urządzeniach nie przeprowadzono żadnych aktualizacji oprogramowania układowego. Jednak po dalszym badaniu zawartość flash tych urządzeń wydaje się być uszkodzona. Co więcej, baterie niektórych z tych urządzeń były nadal dobre, ale nie chcę wykluczyć jakiejś sytuacji pod napięciem.
To jest porównanie oryginalnej zawartości flash (po lewej) z uszkodzoną zawartością (po prawej):
Niektóre spostrzeżenia:
- Uszkodzony blok zawsze składa się z co najmniej jednej strony flash (256 bajtów) i jest wyrównany. Innymi słowy: dotyczy to tylko całych stron, a nie pojedynczych bajtów.
- Uszkodzona treść przez większość czasu czyta 0xFF, ale może także zawierać inne wartości lub być całkowicie „losowa”.
- Mały pasek po lewej stronie obrazu pokazuje wszystkie dotknięte obszary. W przypadku tego urządzenia jest to około jednej dziesiątej całkowitej zawartości pamięci flash.
- Mieliśmy jedno urządzenie, na którym miało to wpływ tylko na jedną stronę.
Jest całkowicie prawdopodobne, że zbyt niskie napięcie podczas zapisywania pamięci flash może spowodować uszkodzenie zawartości pamięci flash. Oznaczałoby to jednak, że niektóre instrukcje wrażliwe na flash muszą zostać wykonane.
Być może kontroler uruchamia się losowo z powodu zbyt niskiego napięcia, a kod modułu ładującego działa w tym czasie całkowicie nieprzewidywalnie. Cytując faceta z innego forum dotyczącego niskiego napięcia:
„Wykonywane są nie tylko losowe instrukcje z pamięci flash, ale także okres losowych instrukcji (nie ma gwarancji, że kod z pamięci flash zostanie poprawnie odczytany i zinterpretowany). Wraz z tym inne części MCU mogą nie działać zgodnie z przeznaczeniem, w tym z ochroną mechanizmy ”.
Pytanie:
Czy uważasz, że „przypadkowe zachowanie podczas zbyt niskiego napięcia i wykonywania niektórych instrukcji zmieniających dane na stronach flash” - wyjaśnienie jest trafne? Jeśli tak, to dlaczego nie widzimy tego rodzaju błędów przez cały czas jako przyczynę problemów z oprogramowaniem (przepełnienie stosu, nieprawidłowe wskaźniki).
Czy masz jakieś inne pomysły, co może spowodować tego rodzaju korupcję? Czy może to być spowodowane przez EMI / ESD?