
1. 上电瞬间单片机到底在怕什么1.1 一次让我印象深刻的异常上电现象先讲一个我实际调试过的场景。板子一上电挂在PB口上的继电器莫名其妙吸合了大概几十毫秒直接把后面接的电动设备带得抖了一下。当时的硬件电路是照着网上一个经典图纸做的复位引脚也接了电阻和电容数值看起来“大家都这么用”检查了两遍没发现问题。最后把示波器探棒夹到复位引脚上才发现真相电源从0V爬升到3.3V用了将近10ms而复位引脚在2ms左右就已经释放了程序几乎是在电源还没进入工作区的时候就开始跑执行顺序完全不可控IO口乱输出鬼知道它会干什么。这类问题就是非常典型的上电初始状态不确定。MCU上电时如果复位信号不可靠程序计数器、寄存器、GPIO方向寄存器全部是随机值单片机可能从一个随机地址开始取指令外设也跟着乱动。轻则LED闪一下、继电器抖一下重则在开机过程中误写EEPROM/Flash或者把电机、阀门这类执行机构直接带起来造成安全事故。1.2 上电瞬间内部到底发生了什么要真正理解“为什么要复位”得先弄清楚上电瞬间芯片内部发生了什么。首先是电源。VCC不是一瞬间就从0V跳到3.3V或5V的它有一定的爬升斜率。开关电源大概几百微秒到几毫秒线性稳压器会快一些但在爬升过程中电压低于芯片最低工作电压VMIN的这段时间里芯片内的逻辑电路处于“半死不死”的状态电压不够高各个门电路翻转阈值又不同内部状态完全不可预测。其次是时钟。即使电源电压到位了晶振也不是瞬间起振。晶体振荡器从加电到输出稳定频率通常需要1~10ms有些低功耗晶振甚至更慢。时钟没稳定CPU什么也干不了但这个“干不了”不是被冻结的而是处于不确定状态。然后是复位引脚本身的逻辑。典型的单片机数据手册都会给出复位时间要求比如最小复位脉冲宽度、上电复位电压阈值、复位释放后到程序开始执行的延时等。它的意思是复位引脚必须保持有效电平足够长时间直到内部逻辑全部被清到默认态时钟也稳定之后才能释放。如果我们用RC网络目的就是让复位引脚在电源建立阶段一直处于复位状态等一切就绪再放行。很多人觉得复位电路不过是“上电拉一下”随便接个电容就行了。但RC网络的选择直接决定了这个“拉一下”的宽度能不能覆盖住整个危险窗口。RC上电复位说到底是给单片机一个“先别跑”的强制信号所以原理、计算、实测这三步都不能省。2. RC复位的原理一阶充放电曲线与阈值判断的完整推演2.1 一阶RC电路的核心公式RC网络本质上是一个一阶电路利用的是“电容两端电压不能突变”这个物理特性。上电瞬间电容相当于短路之后通过电阻缓慢充放电引脚电压就变成了一条能计算的指数曲线。电容充电公式Vc(t) VCC × (1 - e^(-t/RC))电容放电公式Vc(t) VCC × e^(-t/RC)其中 τ R × C称为时间常数。别看这个公式简单绝大多数复位电路计算不准问题都出在“释放阈值”选错上。给个直观感受τ1ms时电容充到50%约0.693ms充到63.2%约1ms充到90%约2.3ms。所以R和C不是随便抓一个就行的它们决定复位引脚在阈值附近停留多久。2.2 阈值判定不是等到充满电才释放复位引脚不是等到电容充满电才释放而是电压越过芯片数据手册里的逻辑阈值那一刻就释放了。现代单片机绝大多数是低电平复位也就是复位引脚RESET/NRST平时要高拉低就是复位。RC接法是电阻R从VCC接到复位引脚电容C从复位引脚接到GND。上电瞬间电容两端电压为0复位引脚被拉到GND处于复位状态随后VCC通过R给C充电复位引脚电压按指数曲线上升等它越过VIH输入高电平阈值时复位释放MCU开始跑。充电释放时间公式t RC × ln(VCC / (VCC - Vth))假设Vth0.7VCC很多芯片的VIH典型值那么ln(1/0.3)1.204也就是说复位释放发生在t1.204×RC的时刻。我把不同阈值对应的系数列出来方便大家以后直接查释放阈值(Vth/VCC)时间系数 t/RC0.600.9160.651.0500.701.2040.751.3860.801.609高电平复位也有典型就是8051这一代RST引脚平时要低拉到高就复位。RC接法是电容C从VCC接到RST电阻R从RST接到GND。上电瞬间电容相当于短路RST引脚被拉到接近VCC处于复位状态之后电容通过R放电RST引脚电压往下掉掉到低于VIL阈值时复位释放。放电释放时间公式t RC × ln(VCC / Vth)注意一个有意思的对称性如果充电复位用了0.7VCC作为释放阈值系数是1.204放电复位如果用0.3VCC作为释放阈值掉到低于这个值算复位释放系数也是1.204。因为ln(1/0.3)ln(3.33)两边刚好对上。所以同一个RC值在低电平复位和高电平复位电路里如果阈值分别取0.7VCC和0.3VCC得到的复位时间是一样的。2.3 复位时间到底要留多久确定了释放时刻的计算方法接下来要回答一个实际问题RC到底该把复位时间做到多长复位时间需要同时覆盖三个时间段之和电源电压从0爬升到芯片最低工作电压VMIN并稳定的时间晶振或内部振荡器起振稳定的时间芯片手册要求的最小复位脉冲宽度这个通常很短几微秒级别。举个例子某8位MCU电源爬升加稳定按2ms估算晶振起振按5ms估算手册要求最小复位脉宽1.5µs。那么复位时间至少要7ms以上。考虑到电容误差、温度变化、芯片批次差异我会再留50%以上余量按10~12ms设计。如果用低电平复位取释放阈值0.7VCC那就是1.204 × RC ≥ 12ms RC ≥ 10ms取R10kΩ、C1µF正好RC10ms释放时刻约12ms。这个组合也是我在中等速度MCU电路里最常用的默认值。你可能会问10k和1µF是不是随手抓的不是下面这节会展开讲选型的完整逻辑。3. 直接可抄的电路电阻电容选型与参数计算实例3.1 低电平复位现代MCU的主流接法以绝大多数ARM Cortex-M内核MCU、AVR、PIC等低电平复位芯片为例电路长这样VCC │ R1 10kΩ │ ├──── RESET (低电平复位) │ C1 1µF │ GND上电时C1两端电压不能突变RESET被拉低VCC通过R1给C1充电RESET电压从0V按指数曲线爬升。当电压越过VIH时复位释放。如果需要手动复位按键把按键并在C1两端就好按下时强制把RESET拉低。这个电路我有几个实际经验第一很多现代MCU的复位引脚内部自带一个上拉电阻阻值通常在30kΩ到100kΩ之间。如果你外部再并一个10kΩ到VCC等效充电电阻是两个电阻的并联值比如10k并50k约8.3kΩ实际复位时间会比理论计算值短20%左右。所以严格的设计必须以实测为准不能光靠公式算完就完事。第二现在的MCU很多内部已经有POR上电复位甚至有的还有BOR掉电检测。外部RC的价值更多是提供一段可预测的延时用来等晶振稳定、等外部外设电源就绪或者单纯给手动复位按键做去抖。这种情况下C用到100nF就够了只要保证复位时间超过芯片内部POR释放时间就行如果还要等外部器件C可以放到1µF甚至更大。3.2 高电平复位8051那一代的老朋友如果是8051这类高电平复位的老芯片电路就反过来了VCC ── C1 10µF ──┬──── RST │ R1 8.2kΩ │ GND上电瞬间C1相当于短路VCC直接灌到RSTRST为高电平进入复位状态。随后C1通过R1放电RST电压指数下降低于VIL阈值后复位释放。经典8051电路常用10µF8.2kΩRC82ms释放时间在100ms左右比需求长很多但没关系上电复位时间做长一点不会损失什么反而更稳。高电平复位的手动按键是接在RST和VCC之间的按下时把RST直接拉到VCC触发复位。这个电路要注意的是掉电后C1放电不完全可能导致快速重新上电不复位。所以用这种接法时一定要用示波器验证掉电后RST引脚是不是回到了0V如果快速开关机后复位波形消失就要在RST对地加一只防负压钳位二极管或者干脆换成专用复位IC。3.3 参数计算与几个设计折中给一组可以直接套用的参考值都是低电平复位电路目标复位时间RCRC常数0.7VCC释放点短延时约1ms10kΩ0.1µF1ms约1.2ms中延时约12ms10kΩ1µF10ms约12ms长延时约120ms100kΩ1µF100ms约120ms选型时有两个折中必须想清楚。一个是静态电流。R接到VCC会产生持续的漏电流3.3V电源下10kΩ就是330µA100kΩ是33µA。如果你的系统是电池供电整板休眠电流才5µA一个复位网络就吃掉330µA这是灾难。想省电就得把R往大里提比如470kΩ,但R太大后复位引脚的输入漏电流和PCB漏电开始影响阈值点充电曲线被拉歪电路可靠性下降。实在矛盾的场景直接用专用复位IC它内部是电压比较器静态电流能做到1µA以下这个问题从根上消失了。另一个是电容类型。C0.1µF~1µF的陶瓷电容建议用X7R或C0G介质别用Z5U/Y5V这种温漂大的。电容在承受直流偏压时实际容值会下降某些劣质小封装电容在额定电压一半时只剩标称值的50%这个问题在复位电路上会导致复位时间缩短而且是那种“批次性”的时好时坏很难查。容量大的场合用铝电解电容便宜大碗但容值是50%/-20%的需要按键复位时电容放电速度也慢设计时按容值下限算一遍按容值上限又算一遍取中间值即可。4. 示波器实测怎么看复位波形怎么判断电路不合格4.1 抓波形的正确方式RC电路理论算得再漂亮最后也要靠示波器验收。我见过太多“算下来没问题”的复位电路实际波形一塌糊涂。正确的测试方法示波器两个通道都用10×无源探头CH1接电源输出端CH2接MCU复位引脚探头带宽限制开到20MHz防止开关电源纹波和空间噪声干扰判断触发方式选上升沿触发电平设在VCC的50%处时基放到5~10ms/格采集模式选单次用外部开关给板子通电抓上电瞬间的波形同一块板子至少测5次确认波形一致。探头地线要短。用那种很长的鳄鱼夹地线会在复位引脚上感应出一堆毛刺让你误判“阈值附近有抖动”。把探头地线弹簧或者短的接地夹直接接到复位引脚旁边最近的地焊盘上。4.2 合格波形与不合格波形的判读合格的复位波形长这样VCC开始爬升后复位引脚先跟着低电平走一段然后以光滑的指数曲线上升一次性越过释放阈值没有回退没有抖动。释放时刻必须晚于VCC稳定到工作电压之后最好余量在2ms以上。下面这些就是不合格的特征复位引脚几乎跟着VCC一起上升看不到明显延迟R或C太小了或者引脚上原有的内部上拉把外部充电电阻“吃掉”了。复位在VCC还在爬升时就释放后续VCC继续往上涨但复位已经失效这种情况最危险因为程序在电压不足时就开始跑。阈值附近有“台阶”或者来回抖动通常是探头地线过长、电源纹波太大或者复位引脚附近有高频开关信号串扰。快速断电再上电时复位波形消失或明显变短说明掉电时电容上的电荷没有放干净。最后一个现象很多人第一次见都会懵。低电平复位电路里掉电后VCC掉到0但如果C1上还存着电压第二次上电时复位引脚初始电压就不是0电容充电的起点高复位时间一下子被压缩。这种情况的修法是在R1两端并一只1N4148或肖特基二极管方向是阳极接复位引脚、阴极接VCC。正常工作时二极管反偏不导通掉电瞬间VCC掉得快复位引脚电压高于VCC二极管正向导通给电容提供一个快速放电通路几十毫秒内就放干净了。5. 让RC复位失效的五类坑与对应修法RC复位电路看着简单能踩的坑一点都不少。我按实际项目里遇到的频率排了个序每一条都是真实改过板的经历。坑现场现象根因修法掉电后快速重新上电不复位按电源开关连续开关第二次上电MCU状态错乱电容电荷没放完R两端并放电二极管电源爬升/跌落过程反复缓慢电压抖动时MCU死机、复位引脚电平不确定RC不监测电压只在纯上电时工作一次上BOR或换复位IC内部上拉/漏电把充电电阻拉偏实际复位时间比理论短很多并行上拉、引脚漏电以实测为准R不要超过100k陶瓷电容容值衰减换了一批器件后复位时间变短直流偏压导致容值下降用X7R/C0G做好降额复位时间不够外部器件就绪外设上电比MCU慢通信失败只考虑了MCU自己的复位需求延长RC时间或做上电时序控制逐一展开说一下。第一类坑快速重新上电前面已经提过修法就是放电二极管。注意复位按键并接在电容两端时按键本身也会在断电后提供一个电阻通路但按键不按下去就是开路不能指望它放电。第二类坑电源慢爬坡或跌落。RC网络只能在“从0上电”这唯一一种场景下起作用如果电源已经稳定运行、突然出现一个几百毫秒的电压跌落跌到MCU工作电压以下然后又恢复RC引脚上的电容会跟着放电但释放阈值和恢复速度不一定匹配MCU可能在一个“半复位”状态下运行。这种场景靠RC是无解的必须用带电压检测的BOR功能或者专用复位IC它们会在电压低于阈值时立刻输出复位电压恢复后再延时释放。第三类坑高阻值带来的漏电问题。R用到几百kΩ以后PCB表面的潮气、引脚助焊剂残留、芯片输入漏电都会影响电容的充放电流导致实际的复位时间远超计算值。我看到有人为了省电把R用到1MΩ结果板子一受潮复位引脚电压就扯不上去芯片整片死掉。RC复位网络里R最好不要超过100kΩ省电的需求应该用复位IC去解决而不是硬堆电阻。第四类坑电容容值衰减。批量化生产时如果只认容值不认介质换一家便宜的电容厂复位时间可能缩水一半。特别是贴片MLCC直流偏压加上以后容值下降小封装的更明显这一点很多人不知道。复位电容不要省X7R起步对容量精度要求高的地方宁可上C0G。第五类坑外部器件的上电时序。MCU自己复位完成了但外挂的Flash、LCD、射频模块还没准备好MCU开机第一件事就是访问外设结果通信失败。这种情况要延长复位时间让MCU的释放时刻晚于最慢的那个外设的启动时间。复位时间也不宜过长否则系统上电响应太慢用户按一下开机键等两百毫秒才看到动静体验很糟糕。6. 什么时候该放弃RC复位IC的判断标准与选型参考6.1 什么场景该换掉RC复位RC复位电路最大优势是便宜、简单两个元件就完事。但它的局限是硬伤RC电路只在“正常冷启动”时工作一次对运行中电源跌落、缓慢爬升、频繁掉电这些场景完全无能为力。而工业设备、汽车电子、电池供电设备恰恰最怕的就是运行中电压不稳。所以只要项目满足下面任一条件就别在RC上纠结了应用环境是工业控制或车载电源可能大范围波动MCU需要真正的BOR掉电检测电压跌了就立刻复位整板有严格的休眠电流要求不能忍受330µA甚至更大的复位网络漏电需要看门狗防止程序跑飞外设多、上电时序要求复杂需要可编程的复位延时。6.2 常见复位IC怎么选极性和时序怎么对上专用复位IC也有人叫电压监控器或supervisor是把电压比较器、延时电路、看门狗集成在一个小封装里常用SOT-23或更小的封装。常见型号有这么几个型号复位极性输出结构典型复位延时备注MAX809低电平复位推挽约160ms极常用SOT-23APX803低电平复位推挽约140ms静态电流极低适合电池MIC803低电平复位推挽约140ms也有高电平版本MIC805TPS3823低电平复位推挽约200ms带看门狗选型就三件事。第一极性必须匹配。MCU复位引脚是低有效复位IC就必须选低电平输出有些型号设计了高电平输出版本比如MIC805对应高电平复位专用于8051这类芯片别买错。第二阈值电压要和电源电压匹配。3.3V系统要选阈值在2.93V附近的5V系统选4.38V或4.63V附近的。阈值选得太低电源已经明显异常了它还不报警选得太高又在正常范围内误触发复位。一般选标称阈值略低于电源最小值即可。第三注意输出结构。推挽输出不需要外接上拉电阻开漏输出需要在复位线上加一个上拉。绝大多数现代MCU复位引脚内部有上拉所以开漏也能用但推挽总归更省心。6.3 换用复位IC之后的电路长什么样换用复位IC之后电路反而变得更简单了VCC ──┬──────── VDD (复位IC) │ │ │ ├──── RESET ── MCU │ │ │ GND │ 100nF │ GND复位IC的VDD接电源RESET输出接MCU的复位引脚GND共地。VDD引脚边上放一个100nF去耦电容其他外围元件基本省光。按键复位原来怎么接现在还是怎么接按键和复位输出之间串一个几百欧电阻防止按键按下瞬间产生大电流毛刺。从成本看一个复位IC批发价大概一两块钱比一个电阻加一个电容贵不了多少但可靠性提升是数量级的。我现在的原则是简单的消费电子板子、电源质量有保证、对成本极度敏感的用RC其他场景尤其是要过认证、要进工业现场、要卖到电网质量不稳定地区的东西一律复位IC。回头修一台设备的时间成本远比省下的几毛钱贵得多。最后分享一个我多年的习惯每块新板子第一版回来别急着调功能先上电抓一串波形存下来——VCC和复位引脚的波形开关机各存一组日期标注好。板子后面出了再诡异的问题翻出当初的“标准波形”对比一下10分钟就能确认是不是复位问题。这个习惯救过我很多次也建议大家养成。