Esta pregunta está relacionada con la desprogramación de AVR .
Información del proyecto:
Tenemos un producto con batería que utiliza un ATMEGA644P. La aplicación se ejecuta permanentemente en modo de suspensión y solo se activa una vez por segundo (RTC) o cuando se activa una de las dos líneas de interrupción externas.
El dispositivo presenta un cargador de arranque bastante simple que se comunica a través de UART (usando la interfaz RS232 IC). Simplemente sirve como un método conveniente para actualizar el firmware para que no se requiera un programador ISP de hardware. (El gestor de arranque espera telegramas seguros de suma de comprobación)
Los dispositivos se diseñaron con una disminución de voltaje interna DESACTIVADA porque duplica el consumo de energía y la larga duración de la batería es obligatoria (supongo que se debería haber utilizado una detección externa de disminución de voltaje; un rediseño está funcionando).
Problema:
cada pocos meses un dispositivo deja de funcionar, NO se realizaron actualizaciones de firmware en esos dispositivos. Sin embargo, después de un examen más detallado, el contenido flash de esos dispositivos parece estar dañado. Además, las baterías de algunos de esos dispositivos seguían siendo buenas, pero no quiero descartar algún tipo de situación de baja tensión.
Esta es una comparación de los contenidos flash originales (izquierda) con los contenidos corruptos (derecha):
Algunas observaciones
- Un bloque dañado siempre consta de al menos una página flash (256 bytes) y está alineado con la página. En otras palabras: solo se ven afectadas páginas enteras, no bytes individuales.
- El contenido dañado lee 0xFF la mayor parte del tiempo, pero también puede contener algunos otros valores o ser completamente "aleatorio".
- La pequeña barra en el lado izquierdo de la imagen muestra todas las áreas afectadas. Para este dispositivo, es aproximadamente una décima parte del contenido total del flash.
- Teníamos un dispositivo donde solo una página se veía afectada.
Es totalmente plausible que una condición de bajo voltaje al escribir la memoria flash pueda corromper el contenido flash. Sin embargo, esto significaría que se deben ejecutar algunas instrucciones sensibles al flash.
Tal vez el controlador se reinicia aleatoriamente debido a un bajo voltaje y el código del cargador de arranque está actuando de manera completamente impredecible durante este tiempo. Para citar a un tipo de otro foro sobre subtensión:
"No solo se ejecutan instrucciones aleatorias de flash, sino un período de instrucciones aleatorias (no hay garantía de que el código de flash se leerá e interpretará correctamente). Junto con esto, otras partes del mcu pueden no comportarse según lo diseñado, incluida la protección mecanismos ".
Pregunta (s):
¿Crees que el "comportamiento aleatorio durante el bajo voltaje y la ejecución de algunas instrucciones que cambian los datos en páginas flash" - la explicación es sólida? Si ese es el caso, ¿por qué no vemos este tipo de errores todo el tiempo solo como causa de algunos problemas de software (desbordamiento de pila, punteros no válidos)?
¿Tienes alguna otra idea de lo que podría causar este tipo de corrupción? ¿Podría ser esto causado por EMI / ESD?