我们在设计板子的时候,往往注意那些看起来比较核心,比较关键的部分, 对于那些边边角角的地方可能不够注意,但是这些地方往往带来灾难性的后果。

比如说电源的上电时序,我们需要注意系统电源的上升时间,很多人不理解, 上电就上电啊,为啥一定规定上升时间? 告诉你,这里面处理不好,问题可就大了。

下面举个例子:

很多简单的基于MCU的产品采用下面的方式来做Reset,这样做行不行呢? 当然可以, 为什么呢? 因为那么多产品都这么做了,也没有听说过有什么问题,当然OK啦。

单路电源没电是什么原因(让你目瞪口呆的那些坑)(1)

今天我们就来用最简单的方式来描述这个究竟会不会有问题。

首先我们来看理想情况下的上电复位是什么情况:

单路电源没电是什么原因(让你目瞪口呆的那些坑)(2)

当VCC到达MCU的工作电压阈值的时候,MCU开始工作,复位信号20ms以后拉高, Perfect !问题是现实和理想总是有距离的,我们先来看看采用上图RC充电的复位方式会得到什么样的波形:

单路电源没电是什么原因(让你目瞪口呆的那些坑)(3)

我们可以看到即便当VCC上电完美的时候,我们也需要确保Reset充电充到Vih的时候,时间要大于20ms,可是现实真的如此吗?

单路电源没电是什么原因(让你目瞪口呆的那些坑)(4)

可惜理想和现实还有一点距离,请看上面这张图,从VCC上电到达工作电压阈值,到Reset慢慢充电到达Vih,这段时间就是我们需要的复位时间,可是这种情况其实很脆弱,假设VCC上升沿时有台阶或者倒钩怎么办?哈哈,第一个问题出现了:

1. 复位时间变短

单路电源没电是什么原因(让你目瞪口呆的那些坑)(5)

我们可以看到,VCC上电时,第一次到达阈值电压后, 芯片已经开始工作,也就是开始复位了,可是偏偏电源不争气, 又倒回来回到阈值以下,所以复位的时间只能从VCC第二次上升到阈值电压开始算, 那么可以明显看到复位时间变短了,因为每一个芯片对复位的时间是有要求的, 如果复位时间不够,带来的后果是每次上电不一样, 有时候起来,有时候起不来,高低温测试时情况可能会更糟糕。

2. 快速热插拔

当用户快速拔出然后插入电源时, VCC上会有一个跌落, 但是这个跌落由于阻容RC的平滑作用, 在Reset上并没有得到足够深的跌落,由于VCC的跌落把MCU内部已经搞乱了,但是复位信号却没有起作用, 芯片会产生lock out或者latch up。

单路电源没电是什么原因(让你目瞪口呆的那些坑)(6)

在产品的使用过程中,很常见的现象是,很多人会快速插拔一下电源,结果导致的现象是起不来了,只有再次拔出电源,然后稍等一会儿再插入电源才行。

这种快速热插拔导致的问题,在我原来C公司的ASR***系列路由器上导致I2C expander lockout,此问题出现在已经销售出去的产品上, 而且软件解决不了,所以引发的后果是非常严重的,至于为什么EVT没有测试出来,这个可以理解的,因为只有样本多了,才会出现林子大了什么鸟都有的故事。

3. 电源上出现Glitch

这种情况在系统工作过程中,如果受到外界的干扰或者电源太烂,VCC有时候会出现Glitch,此时如果有专门的POR芯片来trigger Reset,那当然没问题了,可惜我们使用的是阻容RC的Reset方式。

由于电源上的Glitch时间短,经过RC积分 后的Reset信号跌落变得更加小,小到不足以触发复位(这一点和上面的快速热插拔原理相同),所以很明显系统会死机,而且死机了就只能插拔电源,并且不能快速插拔才能恢复正常。

单路电源没电是什么原因(让你目瞪口呆的那些坑)(7)

为了证明本人没有胡说八道,我把大牛Howard Johnson的一段话摘录一下,请读者仔细品味。

Power interruptions drive power-on-reset circuits crazy. Consider what a power dropout does to the circuit in Figure 1. Imagine that the RC time constant in this figure is 1 sec. Let VCC come up and stabilize at full voltage for perhaps 10 sec.

Next, apply an ac power interruption just long enough to drop VCC to 0V for about 100 msec. If a processor is involved, the dropout is long enough to make scrambled eggs of the processor's internal state machines but not long enough to discharge the RC circuit. If the RC circuit doesn't discharge, ~RESET doesn't activate, and the processor spins out of control, powered on, but lost in space.

4. 上电顺序被破坏

这里有人想不通了,我上电慢一点和上电顺序有啥关系啊, 请听我图文并茂的说明如下:

单路电源没电是什么原因(让你目瞪口呆的那些坑)(8)

MCU的上电时序要求如下:5V -> 1.8V -> 3.3V -> Reset.

单路电源没电是什么原因(让你目瞪口呆的那些坑)(9)

当在5V上面出现下面两种情况时,就会产生问题(事实USB 5V供电时,有些产品的电源质量很差,我们无法预料5V输出的情况)。

1) 上电时5V有台阶或者回沟

2) 运行过程中5V有Dip或者Glitch

单路电源没电是什么原因(让你目瞪口呆的那些坑)(10)

我们看到由于5V电源的快速跌落, 1.8V由于负载重电流大,很快电就放光了,跌落到0V, 而且3.3V由于轻载,来不及放电,跌落很小, 所以上电顺序变成了 3.3V = Reset -> 5V -> 1.8V, 带来的问题有两个:

1) 重新上电后, 由于3.3V一直在,所以变成3.3V先上电了,这个和第一次上电的1.8V先上电的要求反过来了,后果很简单,芯片很容易latch up, 起不来,或者烧毁

2) 由于采用的3.3V RC 复位,那么此次由于3.3V来不及放电, Reset信号也根本没有反应,你想想CPU内核的电源都掉过了,系统居然没有复位信号,这也太说不过去了吧,不只芯片起不来,而且非常的危险。

总结一下,当我们在简单的MCU系统采用RC的方式产生Reset时,要评估好风险,对于电源输出质量很好, 并且不会出现客户经常热插拔的产品是OK的。反之,如果是一些客户经常即插即用的周边设备,就要注意小心选择你的R和C的值,在满足复位时间的基础上,尽量短,越长越不安全, 另外注意测试你使用电源电路确保不要出现台阶,倒钩,还有太长的上升时间。

,