第8课(下):复位、启动、下载与电源去耦,组装最小系统

硬件学习路线 · 上一页讲时钟,本页讲其余几个"必不可少"的部分,并把它们拼成一张完整的原理图

一、复位是什么?

复位(Reset)就是让单片机回到一个已知的初始状态:所有寄存器恢复默认值,程序从头开始执行。它有三个主要来源:

类比:复位像电脑的"重启"。开机时系统要从头加载,不能带着上次的状态乱跑;正在运行时死机了,按一下重启键,系统就从干净的起点重新开始。
复位引脚为什么要有电阻?NRST 引脚内部通常有一个上拉电阻,把它平时拉到高电平(不复位)。外部按键按下时把它接地(复位),松开后回到高电平。这就是"低电平复位"的基本接法。

二、RC 上电复位:算一算

最经典的上电复位电路,是在复位引脚和地之间接一颗电容 C,并在电源和复位引脚之间接一颗电阻 R。上电瞬间,电容两端的电压不能突变,所以复位脚先是低电平;随着电容被电阻慢慢充电,复位脚电压逐渐升到高电平,芯片才开始工作。

RC 复位电路 以低电平复位输入为例
VDDRNRSTCGND是否需要外部上拉及复位参数以芯片手册为准

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,另一端接地。按下时复位脚被拉到地,芯片复位;松开后由上拉电阻拉回高电平。

3.2 看门狗(Watchdog)

看门狗是一个独立的定时器。程序正常运行时,要定期"喂狗"(清零它);如果程序跑飞、死循环,无法及时喂狗,看门狗超时就会自动复位芯片,让系统恢复正常。

类比:看门狗像一个需要定时打卡的值班员。他必须每隔一段时间按一下按钮(喂狗),证明自己还清醒。如果他睡着了(程序跑飞),按钮没人按,系统就会自动"叫醒"(复位)。
使用看门狗的一个原则:喂狗的位置要放在主循环中,而不是放在一个会一直运行的中断里。否则主程序死了,中断还在喂狗,看门狗就失去了作用。

四、启动配置(BOOT)

很多单片机在复位释放时,会读取 BOOT 引脚(或 BOOT0、BOOT1)的电平,决定从哪里取得程序来执行:

模式典型 BOOT 设置用途
从内部 Flash 启动BOOT 接低电平(下拉)正常运行已烧录的程序
从系统存储器(Bootloader)启动BOOT 接高电平(上拉)通过串口等方式下载程序
从 RAM 启动部分芯片有此模式调试或特殊加载
BOOT 引脚必须有确定的电平。悬空的 BOOT 脚会受干扰,让单片机每次上电进入不同的模式,表现为"有时能运行、有时不能下载"。所以 BOOT 脚一定要接一个 10 kΩ 左右的上拉或下拉电阻。

4.1 常见的接法

习惯:设计原理图时,把 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 下载与调试连接 接口名和供电功能以具体调试器为准
调试器目标板 MCUVTref目标板 VDD 参考SWDIOSWDIOSWCLKSWCLKGNDGNDNRSTNRST(可选)VTref 用于参考电压;是否供电需核对调试器

具体引脚号以所用芯片的手册为准(上面以 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 在低频更有效,却在高频段失效。把它们并联,两者的"有效区"就能接上。这正是多颗电容组合的道理。
并联电容之间会反谐振:两颗电容并联时,在某个频率上总阻抗可能比单颗还高,形成一个尖峰(反谐振)。所以多颗电容要选不同的容量,让它们的自谐振频率错开,而不是堆同一个值。

八、电源与地的布局

再好的电容,如果走线很长,也会失效:走线的电感会把"小水箱"和用水点隔开。布局时要遵守几条原则:

  1. 去耦电容紧贴电源引脚:100 nF 要尽量靠近 VDD 与 GND 引脚,走线越短越好,最好直接用过孔连到地平面。
  2. 先过电容,再进芯片:电源从入口进来,先经过大电容,再依次经过小电容,最后进入芯片的电源脚。
  3. 完整的地平面:尽量用整块铺铜做地,不要把地切成很多条细线,否则回流路径变长,噪声变大。
  4. 电源线要宽:承载大电流的电源线要足够宽,减少压降。
  5. 数字与模拟分开:模拟电源(ADC 参考)要用磁珠或电感与数字电源隔离,并加独立的去耦。
类比:去耦电容像一个"随身携带的小水箱"。如果水箱放在房间门口,而用水的水龙头在厨房深处,中间的水管一长,水压再快也送不过去。所以水箱要放在水龙头旁边。

九、完整的最小系统原理图

把前面所有部分组合起来,就得到一块能工作的最小系统。下面用电源连接和功能框图说明组成(以 Cortex-M 类单片机为例,引脚名与具体连接以芯片手册为准):

单片机最小系统组成 功能框图 + 电源旁路示意,非完整原理图
5 V 输入LDO3.3 V 输出3.3 V 总线输入电容GNDCoutGND100 nFGND微控制器 MCUVDD / VDDA 供电 · VSS 接地时钟晶振与负载电容复位10kΩ / 100nF启动BOOT 配置调试SWD指示GPIO + LED电容必须并接电源和地;容值、极性与布局遵循器件手册
检查这张图的思路:电源(有去耦)→ 时钟(有负载电容)→ 复位(有上拉与电容)→ 启动(BOOT 有确定电平)→ 调试(SWD 齐全)→ 指示(LED 有限流)。六项缺一不可。

9.1 计算一下复位与晶振参数

在这张图里,NRST 的 10 kΩ 与 100 nF 组成 RC 复位,τ = 10 kΩ × 100 nF = 1 ms,远远短于晶振起振所需的时间。所以很多设计把这里的电容改为 1 μF 或 10 μF,或者加一颗专用的复位监控芯片。这是"看图纸时要算一算"的典型例子。

十、检查清单与故障排查

10.1 焊接前与上电前的检查清单

10.2 上电后不工作,怎么查?

现象最可能的原因检查方法
完全没反应,电流异常大短路(电源与地之间)断电后用万用表测电源与地的电阻
能下载,但程序不运行晶振不起振、时钟配置错误、BOOT 设置不对用示波器看晶振两端波形;检查 BOOT 电平和时钟配置
偶尔能运行,偶尔不能复位时间太短、去耦不足、BOOT 悬空加大复位电容;检查每个 VDD 去耦;给 BOOT 加电阻
下载失败,提示找不到芯片SWD 接线错误、电源没有、NRST 被拉低用万用表检查 3.3 V;检查 SWDIO/SWCLK 是否对调
串口乱码时钟误差大(用了内部 RC)、波特率配置错改用外部晶振;核对波特率计算
一按按键就复位或乱跳复位线受干扰、按键抖动复位脚加 100 nF 到地;缩短复位线
排查的通用顺序:先电源(电压对不对、有没有短路),再时钟(晶振有没有振荡),然后复位(复位脚是不是高电平),最后启动与程序(BOOT、下载、程序本身)。按这个顺序,大部分问题都能定位。
安全提醒:上电前一定要检查电源正负极,尤其是接 USB 或外部电源时。芯片的 VDD 接错 5 V 或接反,都可能直接损坏。第一次通电时,最好用限流电源(如实验室电源设置 100 mA 限流),先看电流是否正常,再继续调试。

十一、小测验:复位与去耦

十二、本节小结

下一课:第9课 · 常见通信接口(GPIO、UART、SPI、I²C、RS485)——让单片机和外部世界说话。

回到上一页:第8课(上):晶振与时钟