是什么导致微控制器意外复位?


26

在微处理器控制的系统中,一种特别令人讨厌的错误是使微处理器意外复位。调试此类问题的重要工具是一系列可能的原因。是什么导致微控制器意外复位?


1
这里的一些答案可能会有所帮助:electronics.stackexchange.com/questions/30430/…您在使用哪种微控制器?
乔恩·L

我通常使用dsPIC。但是我现在不尝试调试任何特定的东西,只是编译潜在问题的参考列表。
Stephen Collings

2
这是一个作业问题吗?
old_timer 2013年

1
@dwelch可能适合某人,但不适用于我或我的任何学生。
Stephen Collings

1
@Vorac这样的必读内容表明Atmel无法致力于保持URL的可靠性。
哈兹2014年

Answers:


51

在PIC和dsPIC芯片上,我观察到以下意外复位的原因。

硬件:

  • 复位引脚驱动为低电平或浮空。首先检查明显的东西!
  • ESD耦合到复位引脚。我已经看到,在同一张桌子上打开完全不相关的设备时会发生这种情况。确保复位引脚上有足够的电容,可能高达1 uF。
  • ESD耦合到处理器的其他引脚。示波器探头尤其可以充当天线,将噪声耦合到芯片中并引起奇数复位。我听说过有关“无效的操作码”重置代码的报告。
  • 焊点/断桥不良。可能是处理器上或板上其他地方的电源线丢失或短路。
  • 电源导轨毛刺/噪声。可能由许多外部问题引起,包括调节器损坏或上游电源跌落。确保为处理器供电的电源导轨稳定。在某个地方可能需要更多的上限,也许直接在处理器上解耦上限。
  • 某些微控制器具有Vcap引脚,该引脚不得连接到VDD,并且必须具有自己的公共电容。未能正确连接此引脚可能会导致不可预测的结果。
  • 将模拟输入负驱动到某个限制以上会导致复位,该复位在RCON中报告,如掉电。数字输入也可能如此。
  • 附近的电源转换器中很高的dV / dt可能会导致掉电复位。(请参阅此问题。)我已经在两种情况下看到了这种情况,有一种情况我能够跟踪到电容耦合。IGBT的开关电流为100-200A,并且在关闭时,一些反馈电路会看到几微秒的噪声,在3.3V处理器上,噪声从2V上升到8V以上。增加该反馈导轨上的过滤器盖会使复位停止。可以想象在晶体管上增加一个dV / dt滤波器可能会产生类似的效果。

软件:

  • 看门狗定时器。确保经常清除看门狗定时器,尤其是在代码执行分支(可能需要很长时间才能执行)(例如EEPROM写操作)中。为此,请禁用看门狗以查看问题是否消失。
  • 除以零。如果您正在执行任何代码中的除法运算,确保除数永远不能为零。在除法之前添加边界检查。不要忘记,这也适用于模运算
  • 堆栈溢出。太多的嵌套函数调用可能会导致系统的堆栈动态内存不足,从而可能导致代码执行中异常时刻的崩溃。
  • 堆栈下溢。如果在汇编程序中编程,则意外执行的RETURN可能比执行CALL的更多。
  • 不存在的中断例程。如果允许了中断,但未定义中断例程,则处理器可能会复位。
  • 陷阱例程不存在。类似于中断例程,但区别很大,我将其单独列出。我已经看到了使用dsPIC 30F4013进行随机复位的两个独立项目,其原因被跟踪到一个被调用但未定义的陷阱。当然,现在您有一个问题,为什么首先要调用陷阱,这可能是很多事情,包括硅错误。但是,定义所有陷阱处理程序可能应该是诊断无法解释的重置的一个好的早期步骤。
  • 功能指针故障。如果函数指针未指向有效位置,则取消引用该指针并调用所指向的函数会导致复位。引起这种情况的一个有趣原因是当我初始化结构时,其连续值分别为NULL(对于函数指针)和-1(对于int)。逗号被打错了,因此函数指针实际上被初始化为NULL-1。因此,不要仅仅因为它是CONST就假定它必须包含一个有效值!
  • 无效/负数组索引。确保你执行边界上的所有数组下标,双上肢检查下限,如果适用。
  • 在程序存储器中创建一个大于程序存储器最大部分的数据数组。这甚至可能不会引发编译错误。
  • 将结构的地址强制转换为其他类型的指针,对该指针进行解引用以及在语句中使用该解引用的指针作为LVALUE可能会导致崩溃。看到这个问题。据推测,这也适用于其他未定义的行为。

在某些dsPIC上,RCON寄存器存储指示复位原因的位。这在调试时非常有用。


1
@reset引脚:浮动复位引脚因虚假复位而闻名。始终通过电阻将其连接至Vcc。
jippie

4
这是一个非常详尽的清单。我相信我使用AVR的经验是,即使不是全部,大多数情况也会导致意外的结果或重置。
HL-SDK

4
让我为汇编语言编程添加另一个-堆栈中不匹配的寄存器PUSH和POP。
Michael Karas 2013年

2
还有更多:在硬件下,掉电复位。在软件下,有软件重置指令。这两个都可以在几个微控制器上使用。
tcrosley13年

2
另一个例子是:放置在电缆附近的移动电话会在弱驱动的线路上感应出惊人数量的电压。如果您的重置线穿过电缆(例如,一个板可以强制另一个板重置),则电缆附近的移动电话可能会在接收到呼叫时触发重置。
超级猫

7

RESET引脚必须由复位电路正确驱动,该电路监视过压/欠压并产生足够长的复位信号。考虑到这一点,我的硬件重置不受控制的经验来自于:

  • 开关线与RESET引脚/线之间的串扰(使其短接)
  • 接通/关断外部大电流负载引起的接地偏移/环路
  • 电压尖峰未被电源过滤掉,且过短而无法激活适当的RESET
  • 由微控制器切换外部负载会导致上述问题(主要是感应负载,例如电动机开/关,继电器或旧灯(浪涌电流)
  • 任何微控制器引脚上的电压/电流尖峰(最差的是振荡器)都可能引起反向电流,并可能切换内部寄存器(与电源线上的电压尖峰相同)。通常,在与某种工业环境进行接口连接时,需要谨慎行事(有关更多信息,请参见:http : //www.ichaus.biz/wp1_mcu_interface)。需要考虑IO的电平转换,输入滤波和软开关输出。清洁电源线在硬件方面是第一要务。然后是RESET和振荡器引脚,然后是IO线。-毫米

1
地面的变化只是在咬我。就我而言,我的普通网有特定部分承载着约100安培的电流。微控制器被引用到该粗迹线的一侧,但是微控制器正在驱动的某些电路被引用到迹线的另一端。迹线仅为3 mOhm,但在100A时足以使微型驱动器与其驱动的外围设备之间产生300 mV的电压差。将外围设备重新布线为与控制器在该迹线的同一端通用,现在一切正常。在目前的情况下,没有节点之类的东西。
史蒂芬·科林斯

4

我在此列表中未看到的另一种可能性是支持ICSP的设备。如果在电路串行编程模式下触发的线路上使用的上拉电阻不足,则有时可能会随机进入该模式。当没有程序更新发送到指定的串行接收器线路时,这会导致在很短的间隔后复位。我怀疑如果ICSP启动并且没有发送编程数据,则内部看门狗定时器会强制复位。这是我犯的一个错误,并花费了大量时间寻找16F876。


3

确保在电路中使用CMOS或TTL逻辑芯片时,它们在Vdd和地之间具有足够的去耦电容(通常为0.1 uF)。我在设计中使用的是CD4021,使用时显然会引起一些尖峰,导致微处理器重新启动。然后该循环将重复。这也是为什么在代码开始时放置一个显而易见的测试序列(例如使LED闪烁几次并熄灭)是一个好主意的原因,从而使您知道微处理器正在工作并正在执行代码。


2

这是可能会出现的罕见事物之一:

我有一个涉及微控制器的项目,它会偶尔重置自身。长话短说,原来某些选项必须启用或禁用,否则可能会发生重置。在放弃其他所有内容之后,我才通过阅读勘误表才发现了这一点。

现在,我习惯养成阅读勘误表的习惯,甚至在决定使用芯片来了解自己所要学习的内容以及我是否可以管理的情况之前。不幸的是,毕业后,我真的没有人要教我一些常见的习惯,所以我在现实世界中的很多学习都是通过失败和挫折来进行的。


我什至没有意识到这个问题太老了,已经提供了答案。哎呀。
efox29 2015年
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.