AVR闪存损坏


11

这个问题与AVR的解码本身有关

项目信息:
我们有一个使用ATMEGA644P的电池供电产品。该应用程序永久以睡眠模式运行,并且仅每秒唤醒一次(RTC)或触发两个外部中断线之一。

该器件具有一个非常简单的引导加载程序,该引导加载程序通过UART(使用RS232接口IC)进行通信。它只是一种方便的方法来更新固件,因此不需要硬件ISP编程器。(引导加载程序需要校验和安全的电报)

该设备设计为具有内部掉电禁用功能,因为它使功耗加倍,并且必须延长电池寿命(我猜应该使用外部掉电检测-重新设计正在进行中)。

问题:
每隔一个月设备就会停止工作,这些设备上不会执行固件更新。但是,在进一步检查之后,这些设备的闪存内容似乎已损坏。此外,其中一些设备的电池仍然不错,但我不想排除某些欠压情况。

这是原始闪存内容(左)与损坏的内容(右)的比较:

闪光灯比较

一些观察:

  • 损坏的块始终至少包含一个闪存页面(256字节),并且是页面对齐的。换句话说:仅影响整个页面,不影响单个字节。
  • 损坏的内容大部分时间读为0xFF,但也可能包含其他值或完全是“随机”的。
  • 图像左侧的小条显示了所有受影响的区域。对于此设备,它大约占闪存总内容的十分之一。
  • 我们有一台只影响单个页面的设备。

完全有理由认为,在写入闪存时出现欠压情况会损坏闪存内容。但是,这意味着必须执行一些闪存敏感指令。

可能是由于欠压导致控制器随机重启,并且引导加载程序代码在此期间的行为完全不可预测。引用另一个论坛中有关欠电压的消息:

“不仅会执行闪存中的随机指令,而且还会执行随机的指令周期(不能保证闪存中的代码会正确读取和解释)。与此同时,单片机的其他部分可能无法按设计运行,包括保护机制。”

问题:
您是否认为“电压不足并执行某些指令以更改闪存页面中的数据期间的随机行为” -解释是否合理?如果真是这样,为什么我们一直没有看到这种错误,只是一些软件问题(堆栈溢出,无效的指针)的原因。

您还有其他想法会导致这种腐败吗?这可能是由EMI / ESD引起的吗?


在您的示例的第二个块中,是否有任何位从1-> 0到全部为0-> 1的跳变?我有一个可以对此进行计算的脚本,但是我不会在屏幕快照中键入所有数字。
markrages 2014年

@markrages:从它的角度来看,仅0-> 1。一个答案还指出,这看起来像是部分擦除,其中并非所有位都翻转为1。感谢您的观察。
Rev1.0 2014年

Answers:


11

您应注意,闪存未写入,已被擦除。擦除的闪存充满了0xFF。您的前256个字节被完全擦除,第三个256个字节的区域被部分擦除(从正确数据到损坏的字节只有0到1个位翻转)。

根据数据表,此闪存可擦除页面(我通常使用大于页面的擦除块)。如第282页所示,通过SPM执行页面擦除非常简单。

您可能会对第23.8.1节(防止闪存损坏)感兴趣:

当电压太低时,有两种情况会导致Flash程序损坏。首先,定期向闪存写入序列需要最低电压才能正常工作。其次,如果用于执行指令的电源电压过低,CPU本身可能会错误地执行指令。遵循以下设计建议即可轻松避免闪存损坏(一个就足够了):

  1. 如果不需要在系统中进行Boot Loader更新,请对Boot Loader Lock位进行编程以防止任何Boot Loader软件更新。
  2. 在电源电压不足的期间,保持AVR RESET处于活动状态(低电平)。
    如果工作电压与检测电平匹配,可以通过启用内部欠压检测器(BOD)来实现。如果没有,则可以使用外部低VCC复位保护电路。如果在写操作进行期间发生复位,则只要电源电压足够,写操作将完成。
  3. 在低VCC期间将AVR内核保持在掉电睡眠模式。这将防止CPU尝试解码和执行指令,从而有效地保护SPMCSR寄存器,从而防止Flash意外写入。

您对第三页上的部分擦除的观察似乎是合理的。关于Atmel案文:我们都同意BOD似乎是强制性的。但是我仍然不确定造成腐败的确切原因。控制器是否不太可能仅执行(由于低电压)此特定指令来擦除闪存页面?我的意思是,这甚至必须在引导加载程序代码执行期间发生,因为闪存只能从那里写入。并且它需要特定的顺序。
Rev1.0

3
无法解释损坏的确切原因:随着Vcc的下降,它变得太低而无法使一个晶体管与另一个晶体管完全饱和。MCU本质上是一个非常大的逻辑方程式。如果您的晶体管停止表现为逻辑开关,则可以更改此公式。由于第一个行为不当的晶体管取决于ASIC晶圆掺杂和外部电磁干扰,因此您无法预测会发生什么。为了解决这个问题,在设计ASIC时,您可以添加一个模拟部分,该模拟部分在行为异常之前会关闭数字部分。但这增加了整个ASIC的成本。
Jacen 2014年

应用笔记AVR180外部掉电保护状态令人困惑:“请注意,AVR®内部闪存程序存储器的内容永远不会受到电源电压不足的影响”。此外:“由于AVR CPU无法写入其自己的程序存储器,因此内部闪存程序存储器的内容永远不会受到电源故障情况的影响。” -IMO Atmel只是忽略了诸如引导加载程序之类的东西必须更改闪存。
Rev1.0 2014年

@ Rev1.0是的,这不太可能...这就是为什么您每隔几个月只能在一台设备上看到它,而不是一直在所有设备上看到它的原因。
user253751 '18

“我的意思是,这甚至必须在引导加载程序代码执行期间发生,因为闪存只能从那里写入。” -仅在正确设置了引导锁定位(BLB01和朋友)的情况下才可以!是吗 “令人困惑的...应用程序说明...” -众所周知,应用程序说明不可靠。仅将它们用作灵感;要获得担保,请依靠数据表(它也不是万无一失,但是嘿)。
marcelm

4

这是一个众所周知的问题,并且会影响许多微控制器(不仅限于Atmel)。闪存控制硬件在低电压条件下会损坏或擦除部分存储器。简单的解决方法是启用掉电保护。

当然,您应该始终在微控制器上启用掉电保护。


3
您是否有关于“在低压条件下内存控制硬件损坏或擦除部分内存”的HOW和WHY的可靠参考?论坛上有很多有关闪存损坏的讨论,但是几乎从来没有解决过,这就是我在这里问的原因。
Rev1.0 2014年

是片内欠压问题还是与引导加载程序部分中程序的错误/随机执行有关,而AFAIK仅可以修改FLASH。如果第二个问题是通过FUSE禁用引导加载程序执行,则应该可以解决问题。
TMa 2014年

我记得在至少一个MEGA micro的勘误中读过它。
用户

3

欠电压是很可能的原因。例如,我曾经有一个项目,其中1.8 V的欠压电平经常引起损坏,而这些压坏永远无法在3.5V的欠压电平下再现。

请注意,处理器运行得越快,它对欠压问题的敏感性就越高。如果降低CPU频率是您可以选择的选项,则可能值得尝试。


1
感谢您的回答。我们最终使用了外部超低功率掉电检测器,此后再没有任何损坏问题。
2015年

0

如果不遵循PCB设计的主要规则,EMC将是您的最大敌人。根据我的经验,以下是最重要的:-在任何IC上阻塞电容器,无论制造商在其数据手册中关于地上原理图的内容是什么,都应在每个IC的电源线上至少放置100pF-1nF之间的电容-在每个PCB的层越多越好。这些区域应尽可能通过通孔通过所有层进行接触,最好使用50mil的网格。将这些区域连接到地面信号。-切勿在PCB中留下未连接的(浮动的,无信号连接的)铜。它就像天线一样,将电磁辐射放到设备上-使携带时钟信号的走线尽可能短

通过搜索引擎请求查找更多详细信息,例如“ EMC证明PCB设计指南”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.