Altération de la mémoire flash AVR

11

Cette question est liée à la déprogrammation AVR elle-même .

Informations sur le projet:
Nous avons un produit alimenté par batterie utilisant un ATMEGA644P. L'application fonctionne en permanence en mode veille et ne se réveille qu'une fois par seconde (RTC) ou lorsque l'une des deux lignes d'interruption externes est déclenchée.

L'appareil dispose d'un chargeur de démarrage assez simple qui communique via UART (en utilisant l'interface IC RS232). Il sert simplement de méthode pratique pour mettre à jour le micrologiciel de sorte qu'aucun programmeur ISP matériel ne soit requis. (Le chargeur de démarrage attend des télégrammes sécurisés par somme de contrôle)

Les appareils ont été conçus avec une fonction de désactivation interne désactivée car cela double la consommation d'énergie et la longue durée de vie de la batterie est obligatoire (je suppose qu'une détection de panne externe aurait dû être utilisée - une nouvelle conception est en cours).

Problème:
tous les quelques mois, un périphérique cesse de fonctionner, aucune mise à jour du micrologiciel n'a été effectuée sur ces périphériques. Cependant, après un examen plus approfondi, le contenu flash de ces périphériques semble être corrompu. De plus, les batteries de certains de ces appareils étaient toujours bonnes, mais je ne veux pas exclure une sorte de situation de sous-tension.

Voici une comparaison du contenu flash d'origine (à gauche) avec le contenu corrompu (à droite):

Comparaison flash

Quelques observations:

  • Un bloc corrompu se compose toujours d'au moins une page flash (256 octets) et est aligné sur la page. En d'autres termes: seules les pages entières sont concernées, pas les octets uniques.
  • Le contenu corrompu lit 0xFF la plupart du temps, mais peut également contenir d'autres valeurs ou être complètement "aléatoire".
  • La petite barre sur le côté gauche de l'image montre toutes les zones affectées. Pour cet appareil, son environ un dixième du contenu total du flash.
  • Nous avions un appareil sur lequel une seule page était affectée.

Il est totalement plausible qu'une condition de sous-tension lors de l'écriture de la mémoire flash puisse corrompre le contenu du flash. Cependant, cela signifierait que certaines instructions sensibles au flash doivent être exécutées.

Peut-être que le contrôleur redémarre de manière aléatoire en raison d'une sous-tension et que le code du chargeur de démarrage agit de manière totalement imprévisible pendant ce temps. Pour citer un gars d'un autre forum concernant la sous-tension:

"Ce n'est pas seulement des instructions aléatoires du flash qui sont exécutées, mais une période d'instructions aléatoires (il n'y a aucune garantie que le code du flash sera lu et interprété correctement). Parallèlement à cela, d'autres parties du mcu peuvent ne pas se comporter comme prévu, y compris la protection mécanismes. "

Question (s):
Pensez-vous que le "comportement aléatoire pendant la sous-tension et l'exécution de certaines instructions modifiant les données dans les pages flash" - l'explication est bonne? Si tel est le cas, pourquoi ne voyons-nous pas ce type d'erreurs tout le temps comme une cause de certains problèmes logiciels (débordement de pile, pointeurs invalides).

Avez-vous d'autres idées sur ce qui pourrait provoquer ce type de corruption? Cela pourrait-il être causé par EMI / ESD?

Rev1.0
la source
Dans le deuxième bloc de votre exemple, des bits sont-ils passés de 1-> 0 ou tous ont-ils tous des transitions 0-> 1? J'ai un script qui calcule cela, mais je ne vais pas saisir tous les chiffres de votre capture d'écran.
markrages
@markrages: D'après ce que je vois, 0-> 1 seulement. Une réponse a également souligné qu'il ressemblait à un effacement partiel où tous les bits n'étaient pas retournés à 1. Merci pour l'observation.
Rev1.0

Réponses:

11

Vous devriez remarquer que le flash n'est pas écrit, il est effacé. Un flash effacé est plein de 0xFF. Vos 256 premiers octets sont totalement effacés, votre troisième région de 256 octets est partiellement effacée (vous n'avez que 0 à 1 bitflips des données correctes aux données corrompues).

Selon la fiche technique , ce flash est effaçable par page (je travaille généralement avec des blocs d'effacement plus gros que les pages). Comme indiqué à la page 282, l'exécution de l'effacement de page par SPM est assez simple.

Vous pouvez être intéressé par la section 23.8.1 (Prévention de la corruption de Flash):

Une corruption de programme Flash peut être causée par deux situations lorsque la tension est trop faible. Tout d'abord, une séquence d'écriture régulière sur le Flash nécessite une tension minimale pour fonctionner correctement. Deuxièmement, le CPU lui-même peut exécuter des instructions de manière incorrecte, si la tension d'alimentation pour exécuter les instructions est trop faible. La corruption de Flash peut être facilement évitée en suivant ces recommandations de conception (une est suffisante):

  1. S'il n'y a pas besoin d'une mise à jour du chargeur de démarrage dans le système, programmez les bits de verrouillage du chargeur de démarrage pour empêcher toute mise à jour du logiciel du chargeur de démarrage.
  2. Gardez l'AVR RESET actif (bas) pendant les périodes de tension d'alimentation insuffisante.
    Cela peut être fait en activant le détecteur de coupure interne (DBO) si la tension de fonctionnement correspond au niveau de détection. Si ce n'est pas le cas, un circuit de protection externe de réinitialisation à faible VCC peut être utilisé. Si une réinitialisation se produit pendant qu'une opération d'écriture est en cours, l'opération d'écriture sera terminée à condition que la tension d'alimentation soit suffisante.
  3. Gardez le noyau AVR en mode veille hors tension pendant les périodes de faible VCC. Cela empêchera le processeur de tenter de décoder et d'exécuter des instructions, protégeant efficacement le registre SPMCSR et donc le flash contre les écritures involontaires.
Jacen
la source
Votre observation sur l'effacement partiel sur la troisième page semble plausible. Concernant le texte Atmel: Nous convenons tous que la DBO semble être obligatoire. Mais je ne suis toujours pas sûr de la cause EXACTE de la corruption. N'est-il pas assez improbable que le contrôleur exécute simplement (à cause de la basse tension) cette instruction spécifique pour effacer une page flash? Je veux dire, cela devrait même se produire pendant l'exécution du code du chargeur de démarrage, car flash n'est accessible qu'en écriture à partir de là. Et cela nécessite une séquence spécifique.
Rev1.0
3
Il n'est pas possible d'expliquer la source exacte de la corruption: lorsque votre Vcc baisse, il devient trop faible pour saturer complètement un transistor avec un autre. Un MCU est fondamentalement une très grande équation logique. Si vos transistors cessent de se comporter comme des commutateurs logiques, vous modifiez cette équation. Comme le premier transistor à se comporter mal dépend du dopage ASIC Wafer et des perturbations électromagnétiques externes, vous ne pouvez pas prédire ce qui va se passer. Pour résoudre ce problème, lorsque vous concevez votre ASIC, vous pouvez ajouter une partie analogique qui désactive la partie numérique avant un mauvais comportement. Mais cela augmente le coût total de l'ASIC.
Jacen
Confus que la note d'application AVR180 External Brown-out Protection indique: "Notez que le contenu de la mémoire programme interne de l'AVR® Flash n'est jamais affecté par une tension d'alimentation insuffisante". En outre: "Comme l'AVR CPU n'est pas capable d'écrire dans sa propre mémoire de programme, le contenu de la mémoire interne du programme Flash n'est jamais affecté par une situation de panne de courant." - IMO Atmel ignore simplement qu'il existe quelque chose comme des chargeurs de démarrage qui DOIT changer de mémoire flash.
Rev1.0
@ Rev1.0 Eh bien, c'est peu probable ... c'est pourquoi vous ne le voyez que sur un seul appareil tous les quelques mois, plutôt que sur tous les appareils tout le temps.
user253751
"Je veux dire, cela devrait même se produire pendant l'exécution du code du chargeur de démarrage, car le flash n'est accessible qu'en écriture à partir de là." - Cela n'est vrai que si les bits de verrouillage de démarrage ( BLB01et les amis) sont définis correctement! Sont-ils? "Confondre ... note d'application ..." - Les notes d'application sont notoirement peu fiables. Utilisez-les uniquement pour l'inspiration; pour les garanties, comptez sur les fiches techniques (qui ne sont pas non plus infaillibles mais bon).
marcelm
4

Il s'agit d'un problème bien connu qui affecte de nombreux microcontrôleurs (pas seulement Atmel). Le matériel de contrôle de la mémoire flash corrompt ou efface une partie de la mémoire dans des conditions de basse tension. La solution simple consiste à activer la protection contre le brunissement.

Vous devez toujours activer systématiquement la protection anti-brunissement sur les microcontrôleurs.

utilisateur
la source
3
Avez-vous des références solides sur COMMENT et POURQUOI "le matériel de contrôle de la mémoire corrompt ou efface une partie de la mémoire dans des conditions de basse tension"? Il y a beaucoup de discussions sur le forum concernant la corruption flash, mais cela ne se résume presque jamais à quelque chose de solide, c'est pourquoi j'ai demandé ici.
Rev1.0
S'agit-il d'un problème de sous-tension dans la puce ou est-il lié à une exécution incorrecte / aléatoire du programme dans la section du chargeur de démarrage qu'AFAIK ne peut modifier que FLASH. Si le second est un problème, la désactivation de l'exécution du chargeur de démarrage via FUSE devrait résoudre le problème.
TMa
Je me souviens avoir lu à ce sujet dans les errata d'au moins un micro MEGA.
utilisateur
3

La sous-tension est une cause très probable. Par exemple, j'ai déjà eu un projet où un niveau de brunissement de 1,8 V causait fréquemment de la corruption, et ces corruptions ne pouvaient jamais être reproduites avec un niveau de brunissement de 3,5 V.

Notez que plus le processeur s'exécute rapidement, plus il est sensible aux problèmes de sous-tension. Si la réduction de la fréquence du processeur est une option disponible, cela peut valoir la peine d'essayer.

vsz
la source
1
Merci de répondre. Nous avons fini par utiliser un détecteur d'extinction ultra-faible puissance externe et n'avons eu aucun problème de corruption depuis.
Rev1.0
0

EMC sera votre plus grand ennemi, si l'on ne suit pas les principales règles de conception des PCB. Voici les plus importants de ma propre expérience: - blocage des condensateurs sur n'importe quel circuit intégré, indépendamment de ce que les fabricants vous disent dans leurs fiches techniques sur les schémas infernaux, mettez au moins un entre 100pF - 1nF sur les lignes électriques de chaque circuit intégré - conduisant des zones de masse sur chaque couche de PCB autant que possible. Ces zones doivent être contactées à travers toutes les couches via des vias aussi souvent que possible, une grille de 50 mil est une bonne valeur. Connectez ces zones au signal de masse. - Ne laissez jamais de cuivre non connecté (flottant, aucun signal connecté) dans votre PCB. Il agit comme une antenne et applique de manière dévinatoire un rayonnement électromagnétique sur les appareils - rend les traces transportant les signaux d'horloge aussi courtes que possible

Trouver plus de détails par les requêtes des moteurs de recherche comme "guide pour la conception de circuits imprimés à l'épreuve des emc"

woodz
la source