1. 为什么值得花时间把JTAG电路吃透
STM32的调试接口,看着就是几根线的事,但真到画板子的时候,翻车的人一抓一大把。我自己就见过不少项目,程序烧不进去,第一反应是芯片坏了、JLINK坏了、驱动没装好,折腾一整天,最后发现是原理图上JTAG那几个上拉下拉电阻焊错了位置,或者PCB走线拉得太长导致时序不稳。这类问题不复杂,但特别耗时间,而且一旦板子打样回来才发现,改板成本就上去了。
这篇内容就是把我这些年画STM32调试接口的经验完整梳理一遍。核心围绕STM32、JTAG、PCB、JLINK、原理图这几个关键词展开,从JTAG和SWD的关系讲起,到引脚定义、上拉下拉电阻怎么放、JLINK怎么接、PCB布局布线要注意什么,最后再聊聊怎么在代码里把JTAG引脚释放出来当普通GPIO用。适合正在画第一块STM32板子的新手,也适合做过几块板但调试接口偶尔抽风的老手。
需要先说明一点:STM32的调试接口有JTAG和SWD两种模式,SWD是JTAG的精简版,只用了两根信号线。现在实际项目里SWD用得更多,因为引脚少、布线简单、速度也够用。但JTAG作为标准接口,理解它的完整结构对排查问题很有帮助,而且很多现成的JLINK仿真器都是20pin标准JTAG接口,搞清楚每一根线的作用,接线的时候心里才有底。下面讲的内容,JTAG和SWD都会覆盖到,因为它们在硬件设计上是共用引脚的。
2. JTAG与SWD的关系拆解
2.1 两种调试模式的本质区别
JTAG全称Joint Test Action Group,最早是为了做芯片边界扫描测试而制定的标准,后来被扩展用来做程序下载和在线调试。它需要5根核心信号线:TCK、TMS、TDI、TDO、TRST,再加上电源和地,一个完整的JTAG接口至少占7个引脚。SWD全称Serial Wire Debug,是ARM公司推出的两线调试接口,只保留SWCLK和SWDIO两根信号线,本质上是对JTAG协议的一种精简封装。
从硬件角度看,STM32的JTAG和SWD是复用同一组引脚的。以常见的STM32F103C8T6为例,PA13是SWDIO也是JTMS,PA14是SWCLK也是JTCK,PA15是JTDI,PB3是JTDO,PB4是JNTRST。也就是说,当你用SWD模式时,只需要PA13和PA14两根线,PA15、PB3、PB4就可以释放出来当普通GPIO用。这个特性在实际项目中非常实用,尤其是引脚资源紧张的时候。
从调试体验上看,JTAG支持多器件级联,适合复杂的多芯片调试场景;SWD结构简单,抗干扰能力更强,在长距离布线和高速下载时表现更稳定。我个人的习惯是:板子上只留SWD接口,但把JTAG的完整引脚都引出来做成测试点,方便出问题时用示波器抓波形。
2.2 为什么STM32默认启用JTAG
STM32上电复位后,调试接口默认是JTAG和SWD都使能的。这是因为芯片出厂时不知道用户会用哪种模式,所以把两种都打开,保证任何标准仿真器都能连上。但这个默认状态会占用5个引脚,对于引脚数量少的型号(比如LQFP48封装的F103C8T6),这5个引脚占了将近10%的资源,有时候确实不够用。
所以ST提供了复用重映射功能,可以通过配置AFIO_MAPR寄存器来关闭JTAG、只保留SWD。具体操作后面会详细讲。这里先建立一个概念:JTAG和SWD不是二选一的关系,而是可以同时存在、也可以只留一个。硬件设计时要把两种模式都考虑进去,软件配置时再根据实际需求决定释放哪些引脚。
2.3 硬件设计时该选JTAG还是SWD
这个问题没有标准答案,取决于项目需求。如果板子空间充裕、引脚够用、调试环境复杂(比如需要多芯片级联调试),那就保留完整的JTAG接口,用标准的20pin排针,兼容性最好。如果板子紧凑、引脚紧张、只需要单芯片调试,那SWD是更优选择,4根线(VCC、GND、SWDIO、SWCLK)就能搞定。
我自己的做法是折中:PCB上放一个标准的20pin JTAG排针(2.54mm间距),但实际只用其中的SWD引脚,其余引脚要么接地要么悬空。这样既兼容标准JLINK排线,又不会浪费太多板子空间。而且万一以后需要用到JTAG的完整功能,排针已经在那里了,不用重新改板。
3. JTAG引脚定义与JLINK连接详解
3.1 标准20pin JTAG接口引脚定义
JLINK仿真器最常用的接口是20pin的JTAG排针,间距2.54mm。这个接口的定义是有标准的,每一根线都有明确用途。下面这张表是我根据ARM标准整理出来的,画原理图的时候可以直接对照。
| 引脚编号 | 信号名称 | 方向 | 说明 |
|---|---|---|---|
| 1 | VTref | 输入 | 目标板参考电压,用于检测目标板是否上电 |
| 2 | VCC | 输出 | JLINK输出的3.3V,一般不用 |
| 3 | nTRST | 输出 | JTAG复位信号,低有效 |
| 4 | GND | - | 地 |
| 5 | TDI | 输出 | 测试数据输入 |
| 6 | GND | - | 地 |
| 7 | TMS/SWDIO | 输出 | 模式选择/串行数据 |
| 8 | GND | - | 地 |
| 9 | TCK/SWCLK | 输出 | 时钟/串行时钟 |
| 10 | GND | - | 地 |
| 11 | RTCK | 输入 | 返回时钟,一般不用 |
| 12 | GND | - | 地 |
| 13 | TDO/SWO | 输入 | 测试数据输出 |
| 14 | GND | - | 地 |
| 15 | nRESET | 输出 | 目标板复位信号 |
| 16 | GND | - | 地 |
| 17 | NC | - | 未连接 |
| 18 | GND | - | 地 |
| 19 | NC | - | 未连接 |
| 20 | GND | - | 地 |
这张表建议收藏,画原理图的时候直接照着连。需要特别注意的是第1脚VTref,这个引脚必须接到目标板的3.3V电源上,JLINK通过它来检测目标板是否上电、电压是否正常。如果这个脚没接或者接错,JLINK会报“无法识别目标板”或者“目标板电压异常”。
3.2 最小系统下的SWD连接方案
如果只用SWD模式,接线可以大幅简化。只需要4根线:
- VTref(引脚1)接目标板3.3V
- GND(引脚4、6、8、10、12、14、16、18、20任选一个)接目标板地
- SWDIO(引脚7)接STM32的PA13
- SWCLK(引脚9)接STM32的PA14
nRESET(引脚15)可选接,接了之后JLINK可以控制目标板复位,调试更方便。不接也能用,只是复位操作要靠软件或者手动按键。
我实测下来,SWD模式下这4根线只要连接可靠,JLINK的识别率和下载速度都很稳。线长控制在15cm以内,超过20cm就容易出现连接不稳定的情况。如果非要用长线,建议在SWDIO和SWCLK上串联33Ω电阻做阻抗匹配,同时降低SWD时钟频率。
3.3 上拉下拉电阻的正确配置
这是最容易出错的地方。STM32的JTAG引脚内部有弱上拉和弱下拉,但为了信号完整性,通常建议在外部再加电阻。具体怎么加,要看引脚功能:
- TCK/SWCLK:建议加下拉电阻(10kΩ到地),保证时钟线在空闲时处于低电平,避免误触发。
- TMS/SWDIO:建议加上拉电阻(10kΩ到3.3V),保证模式选择线在空闲时处于高电平。
- TDI:建议加上拉电阻(10kΩ到3.3V),因为TDI在JTAG模式下需要保持高电平。
- TDO:一般不加,它是输出引脚,加了下拉反而可能影响驱动能力。
- nTRST:建议加上拉电阻(10kΩ到3.3V),保证复位信号在空闲时为高电平(不复位状态)。
- nRESET:STM32内部已经有上拉,外部可以不加,但如果调试环境干扰大,建议加一个100nF电容到地做滤波。
这些电阻的阻值不是随便选的。10kΩ是经验值,既能保证足够的驱动能力,又不会在信号翻转时消耗太多电流。如果板子上有多个器件共用JTAG总线,电阻值可以适当减小到4.7kΩ,增强抗干扰能力。
注意:上拉电阻要接到3.3V,不要接到5V。STM32的IO耐压是3.3V,接5V上拉会损坏芯片。
3.4 JLINK驱动安装与连接测试
硬件连好之后,需要在电脑上安装JLINK驱动。去JLINK官网下载最新的驱动包,安装过程一路下一步就行。安装完成后,把JLINK插到电脑USB口,打开设备管理器,应该能看到“J-Link driver”设备,没有黄色感叹号就说明驱动正常。
然后打开JLINK Commander(驱动安装时会一起装上),输入connect命令,再输入?查看可用的芯片型号,选择对应的STM32型号。如果连接成功,会显示芯片的ID和电压信息。如果报错“Cannot connect to target”,按这个顺序排查:
- 检查目标板是否上电,VTref是否有3.3V
- 检查SWDIO和SWCLK是否接反
- 检查GND是否共地
- 降低SWD时钟频率试试(在Commander里输入
speed 1000) - 检查nRESET是否被拉低
这套排查流程我用了很多次,基本上90%的连接问题都能定位到。
4. 原理图设计实操要点
4.1 从STM32最小系统开始
画原理图的时候,我习惯先把STM32最小系统搭起来,再往外扩。最小系统包括:STM32主控、晶振电路、复位电路、电源电路、启动模式配置、调试接口。调试接口这部分,就是把前面讲的JTAG/SWD引脚引出来,加上上拉下拉电阻,再接到排针上。
以STM32F103C8T6为例,具体连接如下:
- PA13(SWDIO)→ 10kΩ上拉到3.3V → 接到排针引脚7
- PA14(SWCLK)→ 10kΩ下拉到GND → 接到排针引脚9
- PA15(JTDI)→ 10kΩ上拉到3.3V → 接到排针引脚5
- PB3(JTDO)→ 直接接到排针引脚13
- PB4(JNTRST)→ 10kΩ上拉到3.3V → 接到排针引脚3
- 3.3V → 接到排针引脚1
- GND → 接到排针引脚4、6、8、10、12、14、16、18、20
- NRST → 接到排针引脚15
画的时候注意,排针的引脚1要标注清楚,通常用方形焊盘或者丝印标记。JLINK排线的红线对应引脚1,插反了虽然一般不会烧,但肯定连不上。
4.2 电源与参考电压处理
VTref引脚(排针引脚1)要接到目标板的3.3V电源上。这个3.3V应该是目标板的主电源,不是JLINK输出的3.3V。JLINK的引脚2虽然也输出3.3V,但那个电流能力很弱,带不动目标板,而且如果目标板有自己的电源,两个电源冲突可能出问题。
如果目标板有多个电源域(比如3.3V和1.8V),VTref要接调试接口所在的电源域。STM32的调试接口IO电压是跟着VDD走的,所以VTref接VDD就行。
另外建议在VTref和GND之间加一个100nF电容,滤掉高频噪声。这个电容位置要靠近排针,不要离太远。
4.3 复位电路与调试接口的配合
STM32的NRST引脚内部有上拉电阻,典型值40kΩ左右。外部通常再加一个100nF电容到地,构成RC复位电路,时间常数约4ms,足够芯片完成上电复位。
调试接口的nRESET(排针引脚15)接到STM32的NRST上。这样JLINK可以通过拉低NRST来复位芯片,下载程序后自动运行。如果不接这根线,下载完程序需要手动按复位键,比较麻烦。
有个细节要注意:如果目标板上NRST还接了其他复位源(比如看门狗输出、复位按键),要确保这些复位源不会在调试时干扰JLINK的复位控制。我遇到过复位按键卡住导致JLINK无法连接的情况,排查了半天才发现是按键机械故障。
4.4 原理图检查清单
画完原理图后,对照这个清单检查一遍,能避免大部分低级错误:
- [ ] VTref是否接到目标板3.3V
- [ ] GND是否全部连通
- [ ] SWDIO和SWCLK是否接对引脚
- [ ] 上拉下拉电阻是否焊在正确位置
- [ ] 排针引脚1是否标注清楚
- [ ] NRST是否接到排针引脚15
- [ ] 是否有100nF滤波电容
- [ ] 电源和地是否加了去耦电容
这个清单看着简单,但每一条我都见过有人踩坑。尤其是上拉下拉电阻,画反了不会报错,但调试就是连不上,特别隐蔽。
5. PCB布局布线实战
5.1 元器件布局原则
PCB布局的第一步是把调试接口相关的元器件摆好。我的习惯是把20pin排针放在板子边缘,方便插拔JLINK排线。排针旁边放上拉下拉电阻和滤波电容,尽量靠近排针,走线越短越好。
STM32主控和排针之间的距离也要控制。SWDIO和SWCLK这两根信号线,走线长度最好控制在10cm以内。超过这个长度,信号完整性会变差,表现为下载速度上不去、偶尔连接失败。如果板子实在太大,STM32离排针很远,那就考虑把调试接口做成一个独立的测试点区域,用短线连接。
电阻和电容的摆放也有讲究。上拉电阻要靠近STM32引脚还是靠近排针?我的经验是靠近STM32引脚更好,因为上拉电阻的作用是在信号源端提供稳定的高电平,靠近源端能更有效地抑制反射。滤波电容则要靠近排针,因为它的作用是滤掉从排针引入的噪声。
5.2 走线规则与阻抗控制
SWDIO和SWCLK是高速信号线,虽然SWD的时钟频率通常只有几MHz,但边沿很陡,谐波成分丰富。走线时要注意:
- 等长:SWDIO和SWCLK尽量等长,偏差控制在5mm以内。不等长会导致时序偏差,高速下载时可能出错。
- 包地:如果板子空间允许,在SWDIO和SWCLK两侧走地线,或者铺地铜,减少串扰。
- 避免跨分割:这两根线不要跨过电源分割区,否则回流路径断裂,信号质量会急剧下降。
- 少打过孔:每过一个过孔就多一个阻抗不连续点,尽量在同一层走完。
线宽方面,普通信号线6mil到8mil就够了。如果走线较长(超过10cm),可以适当加宽到10mil,减小直流电阻。阻抗方面,SWD信号一般不做严格的50Ω阻抗控制,因为频率不高,但保持走线均匀、避免突变总是好的。
5.3 地平面与回流路径
调试接口的GND引脚很多,这不是没有道理的。每一根信号线都需要一个干净的回流路径,GND引脚越多,回流路径越短,信号质量越好。
PCB上要保证排针下方有一个完整的地平面。如果排针在顶层,底层就要铺地铜,并且通过多个过孔把顶层的地和底层的地连起来。过孔数量建议每根GND引脚旁边至少放一个,这样回流路径最短。
我见过一些板子,排针下面没有地平面,GND引脚只靠一根细线连到主地,结果调试时好时坏。后来在排针下面加了一块地铜,问题就消失了。这个细节在低速电路里可能不明显,但在调试接口这种对信号质量敏感的地方,影响很大。
5.4 丝印与标识
排针的丝印标识很重要。引脚1要用特殊标记(比如方形焊盘、丝印三角形、或者直接写“1”),其他引脚可以标上信号名。这样接线的时候不容易插反,排查问题也方便。
我还会在排针旁边丝印上“SWD”或者“JTAG”字样,标明这个接口的用途。如果板子上有多个调试接口(比如主控一个、协处理器一个),一定要用不同的丝印区分开,否则很容易插错。
另外建议在丝印上标注VTref的电压值,比如“3.3V”,提醒接线的人不要接错电压。虽然JLINK有电压检测,但接错电压还是可能损坏器件。
6. 软件配置:关闭JTAG释放引脚
6.1 为什么要关闭JTAG
前面提到,STM32默认启用JTAG和SWD,占用了PA13、PA14、PA15、PB3、PB4五个引脚。对于引脚紧张的型号,这五个引脚如果能释放出来当普通GPIO用,能解决大问题。比如用STM32F103C8T6驱动一个LCD屏,引脚本来就不够,释放出PB3和PB4就能多控制两个信号。
关闭JTAG的操作是通过配置AFIO_MAPR寄存器实现的。这个寄存器控制引脚复用和重映射,其中SWJ_CFG位域控制调试接口的配置。具体配置如下:
| SWJ_CFG值 | 调试接口状态 | 释放的引脚 |
|---|---|---|
| 000 | 全使能(默认) | 无 |
| 001 | 全关闭 | PA13、PA14、PA15、PB3、PB4 |
| 010 | 关闭JTAG,使能SWD | PA15、PB3、PB4 |
| 100 | 关闭JTAG,使能SWD | PA15、PB3、PB4 |
实际使用中,最常用的是010配置:保留SWD用于调试和下载,释放PA15、PB3、PB4三个引脚。这样既不影响调试,又能多出三个GPIO。
6.2 标准库下的配置代码
用STM32标准外设库的话,配置代码如下:
#include "stm32f10x.h" void JTAG_Disable(void) { // 使能AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 关闭JTAG,保留SWD GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 此时PA15、PB3、PB4已释放为普通GPIO // 可以继续配置这三个引脚的功能 }这段代码的关键是GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE),它把SWJ_CFG配置为010,关闭JTAG但保留SWD。执行完这段代码后,PA15、PB3、PB4就可以像普通GPIO一样使用了。
需要注意的是,这个配置要在使用这三个引脚之前执行。如果先配置了GPIO再关闭JTAG,可能会冲突。我通常把这段代码放在系统初始化函数的最前面,确保调试接口配置优先完成。
6.3 HAL库下的配置代码
用HAL库的话,配置方式略有不同:
#include "stm32f1xx_hal.h" void JTAG_Disable(void) { __HAL_RCC_AFIO_CLK_ENABLE(); // 关闭JTAG,保留SWD __HAL_AFIO_REMAP_SWJ_NOJTAG(); // 释放PA15、PB3、PB4 }HAL库提供了宏__HAL_AFIO_REMAP_SWJ_NOJTAG(),效果和标准库的GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE)一样。如果连SWD也要关闭(比如需要释放PA13和PA14),可以用__HAL_AFIO_REMAP_SWJ_DISABLE(),但这样就没法用SWD调试了,只能通过串口或者USB下载程序,要谨慎使用。
6.4 关闭JTAG后的注意事项
关闭JTAG后,有几个坑要注意:
第一,关闭操作是不可逆的,至少在当前复位周期内不可逆。一旦执行了关闭JTAG的代码,JLINK的JTAG模式就连不上了,只能用SWD模式。所以调试的时候要确保SWD接口是通的。
第二,如果代码里关闭了JTAG,但硬件上SWD接口没接或者接错了,那就彻底连不上了,只能通过BOOT模式或者串口下载程序来恢复。我建议在关闭JTAG之前,先确认SWD连接正常。
第三,有些STM32型号的PB3和PB4还复用了其他功能(比如SPI1的SCK和MISO),关闭JTAG后如果要使用这些复用功能,还需要额外配置AFIO的重映射寄存器。这个要根据具体型号的参考手册来操作。
第四,GD32系列(比如GD32F4)的JTAG关闭方式和STM32略有不同,寄存器地址和位定义可能有差异。如果是从STM32移植到GD32,这部分代码要重新核对。
7. 常见问题与排查技巧实录
7.1 JLINK连接失败排查表
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 提示“Cannot connect to target” | 目标板未上电 | 测量VTref是否有3.3V |
| 提示“Cannot connect to target” | SWDIO/SWCLK接反 | 交换两根线试试 |
| 提示“Cannot connect to target” | GND未共地 | 测量JLINK和目标的GND是否连通 |
| 提示“Target voltage too low” | VTref电压不足 | 检查目标板电源 |
| 连接成功但下载失败 | SWD时钟太快 | 降低时钟频率到1MHz |
| 连接成功但下载失败 | Flash被写保护 | 用JLINK Commander解除保护 |
| 偶尔连接成功偶尔失败 | 走线太长或干扰大 | 缩短排线,加滤波电容 |
| 提示“JTAG communication failure” | JTAG被关闭 | 改用SWD模式连接 |
这张表是我这些年排查问题的经验总结,基本上覆盖了90%以上的连接故障。遇到问题的时候按顺序排查,能省很多时间。
7.2 SWD/JTAG Communication Failure的典型原因
这个报错信息很常见,原因也很多。我遇到过的典型情况有:
第一种是芯片进入了低功耗模式。STM32在Stop或者Standby模式下,调试接口会关闭,JLINK连不上。解决办法是在JLINK Commander里选择“Connect under reset”,让JLINK在芯片复位期间连接,这时候调试接口还是使能的。
第二种是代码里关闭了JTAG但没保留SWD。前面讲过,如果SWJ_CFG配置为001,JTAG和SWD都关闭了,那就彻底连不上了。恢复方法是通过BOOT0拉高进入系统存储器启动模式,用串口下载一个不关闭调试接口的程序。
第三种是硬件上nRESET被拉低。如果复位电路有问题,芯片一直处于复位状态,调试接口也不工作。测量NRST引脚电压,正常应该是3.3V左右,如果是0V就是复位电路有问题。
第四种是电源不稳定。STM32的调试接口对电源质量有一定要求,如果电源纹波太大,可能导致调试接口工作异常。用示波器看一下3.3V电源的纹波,正常应该在50mV以内。
7.3 关闭JTAG后引脚无法使用的排查
有时候关闭了JTAG,但PA15、PB3、PB4还是不能当普通GPIO用。常见原因有:
- AFIO时钟没使能。配置AFIO_MAPR之前必须先使能AFIO时钟,否则配置不生效。
- 配置顺序不对。要先关闭JTAG,再配置GPIO。如果先配置了GPIO的模式,再关闭JTAG,GPIO的状态可能被重置。
- 引脚被其他外设占用。比如PB3复用了SPI1_SCK,如果SPI1已经使能,PB3就被SPI1控制了,需要先关闭SPI1或者重映射SPI1的引脚。
- 代码优化导致配置被跳过。有些编译器会把“看似无用”的寄存器配置优化掉,建议在配置语句前加
volatile关键字,或者用调试器确认寄存器确实被写了。
7.4 实操心得与避坑建议
分享几个我踩过的坑和总结的经验:
坑一:排针引脚1标反了。有一次画板子,排针的引脚1丝印标在了右边,但实际焊盘是左边是引脚1。结果JLINK排线插上去,VTref接到了GND,SWDIO接到了SWCLK,怎么都连不上。后来用万用表一个个量才发现的。教训是:丝印和焊盘一定要对应,画完PCB后仔细检查一遍。
坑二:上拉电阻焊成了下拉。有一次批量焊接的时候,贴片电阻的料盘放错了,10kΩ上拉电阻焊成了下拉。板子回来调试,SWDIO一直被拉低,JLINK连不上。排查了半天才想到量电阻。教训是:焊接前确认料盘,焊完后抽检几个关键电阻。
坑三:SWD走线太长导致下载不稳定。有一块板子,STM32和排针分别在板子两端,走线大概15cm。JLINK能连上,但下载速度只能降到500kHz才稳定。后来在SWDIO和SWCLK上串联了33Ω电阻,下载速度提到了2MHz。教训是:调试接口走线尽量短,长了就加匹配电阻。
坑四:忘记使能AFIO时钟。写代码的时候,直接调用了GPIO_PinRemapConfig,但忘了先使能AFIO时钟。结果配置不生效,PA15还是不能当GPIO用。这个错误很隐蔽,因为代码编译没问题,运行也不报错,就是功能不对。教训是:配置AFIO之前,先使能AFIO时钟。
坑五:JLINK驱动版本太老。有一次用了一个老版本的JLINK驱动,连接新的STM32型号时提示“Unknown device”。去官网下载最新驱动后问题解决。教训是:JLINK驱动要定期更新,尤其是使用新型号芯片的时候。
7.5 调试接口的测试与验证
板子打样回来之后,不要急着焊STM32,先做几个基础测试:
第一步,用万用表测量排针的VTref和GND之间的电阻,应该是无穷大(没有短路)。如果电阻很小,说明有短路,要排查。
第二步,给板子上电,测量VTref对GND的电压,应该是3.3V。如果不对,检查电源电路。
第三步,测量SWDIO和SWCLK对GND的电压。SWDIO应该有上拉,电压接近3.3V;SWCLK应该有下拉,电压接近0V。如果不对,检查上拉下拉电阻。
第四步,把JLINK插上,打开JLINK Commander,输入connect,看能否识别到芯片。如果识别到了,说明硬件没问题,可以开始下载程序了。
这套测试流程花不了几分钟,但能提前发现大部分硬件问题,避免焊完芯片才发现调试接口不通的尴尬。
8. 从原理图到PCB的完整检查清单
最后整理一份完整的检查清单,画完板子后对照检查一遍,能避开大部分坑。
原理图检查项:
- [ ] VTref接到目标板3.3V,不是JLINK的3.3V
- [ ] GND全部连通,没有悬空的GND引脚
- [ ] SWDIO接PA13,SWCLK接PA14,没有接反
- [ ] PA13上拉10kΩ到3.3V,PA14下拉10kΩ到GND
- [ ] PA15上拉10kΩ到3.3V,PB4上拉10kΩ到3.3V
- [ ] PB3(JTDO)不加上拉下拉
- [ ] NRST接到排针引脚15,有100nF电容到地
- [ ] 排针引脚1有明确标识
- [ ] VTref和GND之间有100nF滤波电容
PCB检查项:
- [ ] 排针放在板子边缘,方便插拔
- [ ] 上拉下拉电阻靠近STM32引脚
- [ ] 滤波电容靠近排针
- [ ] SWDIO和SWCLK走线尽量短,控制在10cm以内
- [ ] SWDIO和SWCLK尽量等长,偏差小于5mm
- [ ] SWDIO和SWCLK两侧有地线包地或铺地铜
- [ ] 排针下方有完整地平面
- [ ] 每根GND引脚旁边有至少一个过孔连接到地平面
- [ ] 丝印清晰标注引脚1和信号名
- [ ] 没有跨电源分割区走线
软件检查项:
- [ ] 配置AFIO之前使能了AFIO时钟
- [ ] 关闭JTAG的代码放在GPIO配置之前
- [ ] 关闭JTAG后确认SWD仍然可用
- [ ] 释放的引脚没有被其他外设占用
- [ ] 如果需要使用复用功能,额外配置了重映射寄存器
这份清单看着长,但实际操作中花个十几分钟就能过一遍。比起板子打样回来发现问题的返工成本,这点时间投入非常值得。
我个人在实际操作中的体会是,调试接口的硬件设计本身不复杂,但细节特别多,而且很多问题在原理图阶段看不出来,非要到调试的时候才暴露。所以最好的办法就是严格按照标准来,该加的电阻一个不少,该走的线一根不省,该检查的项目逐条过。这样虽然前期麻烦一点,但后期调试会顺畅很多。另外建议第一次画板子的时候,把JTAG和SWD都引出来,用标准20pin排针,兼容性最好,等积累了一定经验再根据项目需求做精简。