在最近的一个项目开发中,因为主控芯片的引脚资源非常紧张,我不得不将用于程序烧录的引脚复用 为 ADC 电压检测引脚。
电路设计非常常规:烧录引脚上接了一个电阻分压网络(R1、R2)用于检测电池电压,并在分压点并联了一颗 100nF(0.1μF) 的滤波电容(C9)用于滤除高频噪声。

上电准备烧录程序时,离奇的事情发生了:烧录器死活连不上芯片,一直报同步错误(Chip sync error)或下载失败。
一、 离奇的排查过程
遇到无法烧录的问题,我开始了常规的硬件排查:
-
怀疑分压电阻影响:难道是 R1、R2 形成的分压网络拉低了烧录信号?
-
操作:风枪吹掉 R1 和 R2。
-
结果 :依然无法烧录!
-
-
怀疑引脚被主程序锁死:是不是芯片里面的程序把复用引脚配置成了模拟输入,导致数字信号进不去?
-
操作:尝试各种复位、短接进入Bootloader的时机。
-
结果 :依然无法烧录!
-
-
只剩下电容了:抱着死马当活马医的心态,把仅剩的 C9(100nF)也吹掉。
-
操作:取下 C9,直接飞线连接烧录器。
-
结果 :一把烧录成功!
-
真相大白:罪魁祸首就是这颗 100nF 的滤波电容。
二、 刨根问底:为什么电容会"吃掉"烧录信号?
很多人会有疑问:电容不是用来滤波的吗?为什么能导致烧录失败?这要从数字信号的完整性说起。
1. 烧录信号是"高频方波"
无论你使用的是 UART(串口) 还是 SWD/JTAG 接口,烧录器发送的数据本质都是高速跳变的电平信号(比如 115200 波特率,甚至几兆的时钟信号)。它需要极其陡峭的上升沿 和下降沿 ,芯片才能准确识别出逻辑 0 和 1。
2. 100nF 电容是一个巨大的"负载"
100nF 对电源退耦来说刚刚好,但对通信引脚来说极其庞大。
当烧录器尝试输出高电平(3.3V)时,它必须先给这个 100nF 的电容充电;输出低电平时,又要让电容放电。
因为烧录器的 IO 驱动能力通常只有几毫安到十几毫安,这就导致:
-
上升沿被严重拉缓:完美的直角方波变成了缓慢的斜坡。
-
下降沿同样变缓:放电不及时。
3. 信号被"磨平",通信协议超时
-
对于 UART :信号上升缓慢,芯片采样时可能读不到高电平,或者处于中间的不确定态,导致误码。
-
对于 SWD :边沿不够陡峭会导致时序错乱,烧录器等不到芯片的 ACK 应答,直接判定为同步失败(Chip sync error)。
三、 解决方案:如何让 ADC 和烧录共存?
既然问题找到了,在资源受限的情况下,如何兼顾 ADC 滤波和正常烧录呢?提供以下几种常用方案:
方案一:物理断开(最推荐)
在烧录测试点和电容之间,串联一个 0Ω 电阻 或者 排针跳线帽。
-
烧录时:拆下 0Ω 电阻/拔掉跳线,切断电容,信号完美通过。
-
工作时 :焊上 0Ω 电阻/插上跳线,正常进行 ADC 采样和滤波。
(大部分正规开发板上的 Boot 引脚或复用功能都采用这种跳线帽设计。)
方案二:极大幅度减小电容容值
不要用 100nF,改用 10pF ~ 100pF 的小电容。
-
小电容只能滤除 GHz 级别的射频干扰,对几十 kHz 到几 MHz 的烧录信号影响极小,不会拉缓边沿。
-
同时,它也能满足一般 ADC 采样的微小高频毛刺滤除。
方案三:使用二极管隔离(特殊场景)
如果这个复用引脚只是 UART_RX(只接收不发送),可以在烧录器和电容之间串联一个二极管(如 1N4148)。
-
烧录器的强信号可以通过二极管强行给电容充电。
-
但这种方法不适用于 SWD 或双向通信,且会损耗 0.7V 的电压。
方案四:更换引脚
如果板子还没定型,且芯片有富余引脚,千万别把大电容挂在烧录引脚上。直接换一个普通的 GPIO 去做 ADC 检测。
四、 硬件设计避坑总结
通过这次踩坑,我总结了几条硬件设计的铁律:
-
数字通信引脚(UART, I2C, SPI, SWD)极度反感大电容。像 I2C 那样规范的开漏总线最多也就几 pF 到几十 pF 的分布电容。
-
复用引脚必须做"隔离"设计。当你把模拟(ADC)和数字(烧录/通信)功能复用在同一个引脚时,物理上串一个 0Ω 电阻是最稳妥的选择。
-
烧录器驱动能力有限。不要指望烧录器能像电源芯片那样强行驱动几百 nF 的容性负载。
希望这篇排错记录能帮到遇到同样问题的你,少走弯路,少吹两颗电容!