一、复位是什么?
复位(Reset)就是让单片机回到一个已知的初始状态:所有寄存器恢复默认值,程序从头开始执行。它有三个主要来源:
- 上电复位(POR):电源刚接上时,电压从 0 慢慢升高,芯片必须等电压稳定后才能工作。
- 外部复位:按下复位按键,让复位引脚(NRST)拉低。
- 内部复位:看门狗超时、掉电检测、软件主动复位等。
类比:复位像电脑的"重启"。开机时系统要从头加载,不能带着上次的状态乱跑;正在运行时死机了,按一下重启键,系统就从干净的起点重新开始。
复位引脚为什么要有电阻?NRST 引脚内部通常有一个上拉电阻,把它平时拉到高电平(不复位)。外部按键按下时把它接地(复位),松开后回到高电平。这就是"低电平复位"的基本接法。
二、RC 上电复位:算一算
最经典的上电复位电路,是在复位引脚和地之间接一颗电容 C,并在电源和复位引脚之间接一颗电阻 R。上电瞬间,电容两端的电压不能突变,所以复位脚先是低电平;随着电容被电阻慢慢充电,复位脚电压逐渐升到高电平,芯片才开始工作。
RC 复位电路 以低电平复位输入为例
2.1 时间常数与复位时间
τ = R × C
t_复位 ≈ τ × ln( VDD / (VDD − Vth) )
Vth 是芯片认为"已经脱离复位"的门槛电压。这里为了便于理解,假设门槛为 0.7 × VDD(实际数值以芯片手册为准);此时 t = τ × ln(1/0.3) ≈ 1.2 τ
2.2 动手拨一拨:复位电压曲线
选择电阻和电容,观察复位脚的电压从 0 升到电源电压的过程,以及它跨过门槛(虚线)的时间。
复位脚电压 门槛 0.7 × VDD
2.3 为什么复位时间不能太短?
单片机上电后,还要等两件事完成:晶振起振并稳定,以及内部电压稳定。晶振起振一般需要几毫秒,如果复位脚很快就释放,单片机可能在时钟还没稳定时就开始执行程序,结果就是"上电偶尔不正常"。
一个常见的错误搭配:10 kΩ 配 100 nF,τ 只有 1 ms,复位只持续约 1.2 ms,远远不够晶振起振。这时应该把电容加大(如 10 μF),或者使用专门的复位芯片(监控芯片)。上面的计算器里选 10 kΩ + 100 nF 就能看到这个问题。
二极管加速放电:断电后再上电,如果电容里还残留电荷,复位时间就会变短,有时导致复位不可靠。在 R 两端并联一个二极管(负极朝电源侧),可以让电容快速放电,保证每次上电都有完整的复位。
三、复位按键与看门狗
3.1 复位按键
按键一端接 NRST,另一端接地。按下时复位脚被拉到地,芯片复位;松开后由上拉电阻拉回高电平。
- 复位按键旁边常并一颗 100 nF 电容到地,用来滤掉按键抖动,防止误复位。
- 按键本身有机械抖动(第6课讲过),但复位只需要一次有效的低电平,抖动影响一般不大。
3.2 看门狗(Watchdog)
看门狗是一个独立的定时器。程序正常运行时,要定期"喂狗"(清零它);如果程序跑飞、死循环,无法及时喂狗,看门狗超时就会自动复位芯片,让系统恢复正常。
类比:看门狗像一个需要定时打卡的值班员。他必须每隔一段时间按一下按钮(喂狗),证明自己还清醒。如果他睡着了(程序跑飞),按钮没人按,系统就会自动"叫醒"(复位)。
使用看门狗的一个原则:喂狗的位置要放在主循环中,而不是放在一个会一直运行的中断里。否则主程序死了,中断还在喂狗,看门狗就失去了作用。
四、启动配置(BOOT)
很多单片机在复位释放时,会读取 BOOT 引脚(或 BOOT0、BOOT1)的电平,决定从哪里取得程序来执行:
| 模式 | 典型 BOOT 设置 | 用途 |
| 从内部 Flash 启动 | BOOT 接低电平(下拉) | 正常运行已烧录的程序 |
| 从系统存储器(Bootloader)启动 | BOOT 接高电平(上拉) | 通过串口等方式下载程序 |
| 从 RAM 启动 | 部分芯片有此模式 | 调试或特殊加载 |
BOOT 引脚必须有确定的电平。悬空的 BOOT 脚会受干扰,让单片机每次上电进入不同的模式,表现为"有时能运行、有时不能下载"。所以 BOOT 脚一定要接一个 10 kΩ 左右的上拉或下拉电阻。
4.1 常见的接法
- BOOT0 接 10 kΩ 下拉到地:默认从 Flash 启动,正常运行。
- 板上做一个跳线或按键:需要进入 Bootloader 时,短接到 3.3 V 再复位。
习惯:设计原理图时,把 BOOT 的接法标注清楚,并在板子上印上"BOOT0 = 0 运行 / 1 下载"的字样,后来调试的人才不会困惑。
五、下载接口:SWD 与 JTAG
程序要通过调试接口烧录到单片机里,并能在线调试(单步、看变量、打断点)。现在最常用的是 SWD,它只需要很少的线。
| 接口 | 需要的线数 | 说明 |
| SWD(Serial Wire Debug) | 3 根核心线:SWDIO(数据)、SWCLK(时钟)、GND;另建议接 NRST 和 3.3 V | 引脚少、速度够用,是现在的主流 |
| JTAG | 至少 4 ~ 5 根线(TMS、TCK、TDO、TDI,可加 TRST) | 老牌标准,引脚多,功能也多 |
5.1 SWD 接口的标准接法
SWD 下载与调试连接 接口名和供电功能以具体调试器为准
具体引脚号以所用芯片的手册为准(上面以 STM32 常见的 PA13/PA14 为例)。GD32 系列同样支持 SWD,引脚定义以 GD32 的数据手册为准。
SWD 的两条线最好加上拉:SWDIO 与 SWCLK 在不通信时要有确定的电平,很多设计在两根线上各加一颗 10 kΩ 上拉(或由芯片内部上拉),防止下载不稳定。
六、电源去耦:为什么要一大堆电容?
第2课讲过去耦电容,第5课讲过,芯片在工作时会突然抽走一个电流阶跃。这一节我们把它完整地落到最小系统上。
类比:想象一条水管给很多用水点供水,某个水龙头突然猛开,水压会瞬间下跌。在每个用水点旁边放一个小水箱,突然要水时水箱先供一下,水压就稳了。去耦电容就是这个"小水箱"。
6.1 不同大小的电容分工
| 电容 | 放在哪里 | 负责的频率范围 | 作用 |
| 10 μF(大容量) | 电源入口处,离芯片可稍远 | 低频(kHz 到几百 kHz) | 储存较大能量,应付慢速的大电流变化 |
| 1 μF(中容量) | 每组电源脚附近 | 中频(几百 kHz 到几 MHz) | 承接中间段的电流需求 |
| 100 nF(小容量) | 紧贴每一对 VDD / GND 引脚 | 高频(几 MHz 到几十 MHz) | 快速的瞬态电流,是最关键的一颗 |
经验配置:芯片每个 VDD 引脚旁边放一颗 100 nF,电源入口放 10 μF,芯片附近再放一颗 1 μF(或 4.7 μF)。数据手册通常会给出推荐值,以手册为准。
6.2 为什么一颗电容不够?
单个电容只在它的"有效频段"里好用。频率再高,电容自身的引线电感(ESL)会起主导作用,阻抗反而变大。所以要用不同容量的电容并联,让它们在不同频段接力。下一节用阻抗曲线来看这个现象。
七、去耦电容的阻抗曲线
一颗实际的电容可以用一个简化模型表示:一个理想电容 C,串联一个等效电阻 ESR,再串联一个引线电感 ESL。它的阻抗随频率变化的规律是:
|Z(f)| = √( ESR² + (2πf·ESL − 1/(2πf·C))² )
f₀ = 1 / (2π√(ESL·C)) (自谐振频率,阻抗最小,约等于 ESR)
低于 f₀:电容性(阻抗随频率升高而下降);高于 f₀:电感性(阻抗随频率升高而上升)
7.1 动手拨一拨:不同电容的去耦效果
选择电容容量和引线电感(ESL),观察阻抗曲线。横轴为频率(对数),纵轴为阻抗(对数)。下方虚线是一个示例的"目标阻抗":只要曲线在它下面,去耦就是有效的。
|Z| 曲线 示例目标阻抗 0.1 Ω
自谐振频率 f₀-
f₀ 处的阻抗(≈ ESR)-
目标阻抗以下的频段-
读图要点:100 nF 在约 10 ~ 25 MHz 这一段阻抗最低(按示例参数计算),频率再高就不行了;10 μF 在低频更有效,却在高频段失效。把它们并联,两者的"有效区"就能接上。这正是多颗电容组合的道理。
并联电容之间会反谐振:两颗电容并联时,在某个频率上总阻抗可能比单颗还高,形成一个尖峰(反谐振)。所以多颗电容要选不同的容量,让它们的自谐振频率错开,而不是堆同一个值。
八、电源与地的布局
再好的电容,如果走线很长,也会失效:走线的电感会把"小水箱"和用水点隔开。布局时要遵守几条原则:
- 去耦电容紧贴电源引脚:100 nF 要尽量靠近 VDD 与 GND 引脚,走线越短越好,最好直接用过孔连到地平面。
- 先过电容,再进芯片:电源从入口进来,先经过大电容,再依次经过小电容,最后进入芯片的电源脚。
- 完整的地平面:尽量用整块铺铜做地,不要把地切成很多条细线,否则回流路径变长,噪声变大。
- 电源线要宽:承载大电流的电源线要足够宽,减少压降。
- 数字与模拟分开:模拟电源(ADC 参考)要用磁珠或电感与数字电源隔离,并加独立的去耦。
类比:去耦电容像一个"随身携带的小水箱"。如果水箱放在房间门口,而用水的水龙头在厨房深处,中间的水管一长,水压再快也送不过去。所以水箱要放在水龙头旁边。
九、完整的最小系统原理图
把前面所有部分组合起来,就得到一块能工作的最小系统。下面用电源连接和功能框图说明组成(以 Cortex-M 类单片机为例,引脚名与具体连接以芯片手册为准):
单片机最小系统组成 功能框图 + 电源旁路示意,非完整原理图
检查这张图的思路:电源(有去耦)→ 时钟(有负载电容)→ 复位(有上拉与电容)→ 启动(BOOT 有确定电平)→ 调试(SWD 齐全)→ 指示(LED 有限流)。六项缺一不可。
9.1 计算一下复位与晶振参数
在这张图里,NRST 的 10 kΩ 与 100 nF 组成 RC 复位,τ = 10 kΩ × 100 nF = 1 ms,远远短于晶振起振所需的时间。所以很多设计把这里的电容改为 1 μF 或 10 μF,或者加一颗专用的复位监控芯片。这是"看图纸时要算一算"的典型例子。
十、检查清单与故障排查
10.1 焊接前与上电前的检查清单
- 电源电压是否正确(3.3 V 没有接成 5 V),正负极有没有短路。
- 每个 VDD 旁边是否都有 100 nF 去耦,电源入口是否有 10 μF 以上。
- 晶振型号(有源或无源)与接法是否一致,负载电容是否按计算取值。
- 复位脚是否有上拉,RC 复位时间是否足够(或用了复位芯片)。
- BOOT 脚是否有确定的上拉或下拉电阻。
- SWD 的 SWDIO、SWCLK、GND(以及 NRST、3.3 V)是否接对,没有接反或接错引脚。
- 所有的 GND 是否连通,地平面是否完整。
10.2 上电后不工作,怎么查?
| 现象 | 最可能的原因 | 检查方法 |
| 完全没反应,电流异常大 | 短路(电源与地之间) | 断电后用万用表测电源与地的电阻 |
| 能下载,但程序不运行 | 晶振不起振、时钟配置错误、BOOT 设置不对 | 用示波器看晶振两端波形;检查 BOOT 电平和时钟配置 |
| 偶尔能运行,偶尔不能 | 复位时间太短、去耦不足、BOOT 悬空 | 加大复位电容;检查每个 VDD 去耦;给 BOOT 加电阻 |
| 下载失败,提示找不到芯片 | SWD 接线错误、电源没有、NRST 被拉低 | 用万用表检查 3.3 V;检查 SWDIO/SWCLK 是否对调 |
| 串口乱码 | 时钟误差大(用了内部 RC)、波特率配置错 | 改用外部晶振;核对波特率计算 |
| 一按按键就复位或乱跳 | 复位线受干扰、按键抖动 | 复位脚加 100 nF 到地;缩短复位线 |
排查的通用顺序:先电源(电压对不对、有没有短路),再时钟(晶振有没有振荡),然后复位(复位脚是不是高电平),最后启动与程序(BOOT、下载、程序本身)。按这个顺序,大部分问题都能定位。
安全提醒:上电前一定要检查电源正负极,尤其是接 USB 或外部电源时。芯片的 VDD 接错 5 V 或接反,都可能直接损坏。第一次通电时,最好用限流电源(如实验室电源设置 100 mA 限流),先看电流是否正常,再继续调试。
十二、本节小结
- 复位让芯片回到已知状态,来源有上电复位、外部按键复位、看门狗和掉电检测。
- RC 上电复位:τ = RC,脱离复位约需 1.2τ(门槛按 0.7 × VDD 估算);要保证时间长于晶振起振时间。
- 看门狗在程序跑飞时自动复位,喂狗要放在主循环中。
- BOOT 引脚决定从哪里启动,必须有确定的上拉或下拉电阻。
- SWD 只需 SWDIO、SWCLK、GND(另建议 NRST 与 3.3 V),是现在最常用的下载调试接口。
- 去耦分工:10 μF 管低频,1 μF 管中频,100 nF 紧贴电源脚管高频;多颗电容并联要注意反谐振。
- 去耦电容必须紧贴引脚、地平面完整,走线越短越好。
- 最小系统 = 电源去耦 + 时钟 + 复位 + 启动配置 + 下载接口 + 指示灯,缺一不可。
下一课:第9课 · 常见通信接口(GPIO、UART、SPI、I²C、RS485)——让单片机和外部世界说话。
回到上一页:第8课(上):晶振与时钟