ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

STM32调试接口设计指南:JTAG与SWD原理图及PCB布局实战

STM32调试接口设计指南:JTAG与SWD原理图及PCB布局实战 1. 为什么JTAG电路值得单独拿出来讲很多人画STM32最小系统板的时候电源、晶振、复位电路都认认真真查了手册唯独调试接口随手放一个4针排针就完事了。板子打回来一上电程序烧不进去J-Link连不上开始怀疑芯片是假货、怀疑焊接虚焊、怀疑驱动没装对折腾一整天最后发现是JTAG接口的某一根线画错了位置。我在早期做STM32F103C8T6核心板的时候就吃过这个亏。当时觉得调试口嘛SWD只要两根线随便接一下就行结果把SWDIO和SWCLK的位置搞反了板子焊好之后J-Link死活识别不到目标芯片Keil里报的是“No Cortex-M Device found”换了三根杜邦线、重装了两次驱动都没用。后来拿万用表一根一根对通断才发现是接口定义搞混了。从那以后我在每一块板子上都会把调试接口当成一个独立的电路模块来设计而不是随手放几个焊盘。这篇文章要聊的就是STM32的JTAG/SWD调试电路从原理图设计到PCB布局的完整过程包括J-Link那边的接口定义怎么对应、SWD和JTAG两种模式怎么选、PCB上这几根线怎么走才不容易出问题。适合正在画第一块STM32板子的朋友也适合已经画过几块板但调试口偶尔抽风、想搞清楚根因的人。核心关键词就几个STM32、JTAG、SWD、PCB布局、J-Link。搞明白这几个东西之间的关系调试接口这块基本就不会再翻车了。2. JTAG和SWD到底该选哪个先把账算清楚2.1 两种调试模式的本质区别JTAG全称是Joint Test Action Group最早是为了做芯片边界扫描测试而定义的接口标准后来被ARM拿来做调试接口。它需要5根核心信号线TCK时钟、TMS模式选择、TDI数据输入、TDO数据输出、nTRST复位可选。STM32的JTAG接口还额外支持SWD模式SWD是Serial Wire Debug的缩写只需要两根线SWDIO数据线和SWCLK时钟线。从功能上说JTAG能做的事情SWD基本都能做——下载程序、单步调试、读写寄存器、设置断点。SWD不支持的是边界扫描测试和多器件菊花链但对于99%的STM32开发场景来说这两项功能根本用不到。那为什么还要讲JTAG因为实际项目中你会遇到几种情况一是有些老旧的仿真器只支持JTAG二是某些工业场景需要做板级测试要用到边界扫描三是STM32的JTAG引脚和GPIO是复用的你就算只用SWD也得知道怎么把JTAG功能关掉、把引脚释放出来当普通IO用。2.2 引脚数量的账5针 vs 2针先看STM32F103C8T6这颗芯片的调试引脚分布引脚JTAG功能SWD功能默认复用PA13JTMSSWDIO调试数据PA14JTCKSWCLK调试时钟PA15JTDI无JTAG数据输入PB3JTDO无JTAG数据输出PB4NJTRST无JTAG复位如果你用SWD模式只需要PA13和PA14两根线PA15、PB3、PB4全部可以释放出来当普通GPIO用。这在引脚紧张的F103C8T6上非常关键——多三个可用IO有时候就是能不能少换一颗芯片的区别。如果你用完整的JTAG五根线全占而且PB3和PB4这两个引脚在很多外设初始化的时候会莫名其妙不工作原因就是JTAG功能没关。我见过不止一个新手在PB3上接LED结果灯死活不亮查了半天以为是GPIO配置写错了实际上是JTAG占着引脚没释放。2.3 选型建议什么场景用什么我的建议很直接除非你有明确的边界扫描测试需求否则一律用SWD。理由有三条第一接线少。2根信号线加电源和地4针或者5针的排针就够了PCB上占用的空间小走线也简单。第二引脚释放。SWD只占PA13和PA14PA15、PB3、PB4可以完全当普通IO用对于引脚资源紧张的芯片来说这是实打实的好处。第三兼容性好。J-Link、ST-Link、DAPLink这些主流仿真器都支持SWD模式而且SWD在高速下载的时候稳定性不比JTAG差。我实测J-Link V9在SWD模式下跑4MHz时钟下载STM32F103的64KB程序大概2秒左右完全够用。那什么时候用JTAG两种情况一是你手头只有老款只支持JTAG的仿真器比如某些并口仿真器或者早期USB仿真器二是你的板子上有多颗芯片需要菊花链调试。除此之外SWD是更优解。3. 原理图设计从J-Link接口定义到STM32引脚映射3.1 J-Link的20针接口定义J-Link仿真器标准接口是20针的IDC排针但实际用到的信号线就那么几根。先把完整的引脚定义列出来引脚号信号名方向说明1VTref输入目标板参考电压2SWDIO/TMS双向SWD数据线/JTAG模式选择3GND-地4SWCLK/TCK输出SWD时钟/JTAG时钟5GND-地6SWO/TDO输入跟踪输出/JTAG数据输出7KEY-防呆缺口8TDI输出JTAG数据输入9GNDDetect-地检测10nRESET输出目标复位11GND-地12nTRST输出JTAG复位13GND-地14NC-未连接15GND-地16NC-未连接17GND-地18NC-未连接19GND-地20GND-地实际做板子的时候你不需要把20针全部引出来。对于SWD模式最少只需要4根线VTref引脚1、SWDIO引脚2、SWCLK引脚4、GND引脚3或5。如果要支持复位控制再加上nRESET引脚10。但这里有一个坑VTref必须接。J-Link通过VTref来检测目标板的电压如果VTref悬空J-Link会认为目标板没有供电直接拒绝连接。我见过有人只接了SWDIO、SWCLK和GND三根线然后抱怨J-Link连不上问题就出在VTref没接。3.2 最小系统板上的接口设计对于一块STM32F103C8T6核心板我通常会在PCB上放一个5针的排针2.54mm间距定义如下引脚1: VTref (3.3V) 引脚2: SWDIO (PA13) 引脚3: SWCLK (PA14) 引脚4: nRESET 引脚5: GND这个顺序不是随便定的。你把J-Link的20针接口拿过来用杜邦线对应连接的时候5针的顺序和20针里1、2、4、10、3的顺序一致接线的时候不容易搞混。而且5针排针在PCB上占用的空间很小布局灵活。如果你要用标准的20针IDC接口那就按照J-Link的定义一一对应接好注意引脚7是防呆缺口PCB上的排针座子要选带防呆槽的那种插反了插不进去。3.3 上拉电阻和滤波电容要不要加SWDIO和SWCLK这两根线STM32内部已经有弱上拉一般情况下不需要外部再加。但在以下几种情况建议加上拉调试线缆比较长超过20cm信号质量可能变差板子附近有强干扰源比如电机驱动、开关电源你希望调试接口在不插仿真器的时候保持确定电平我的做法是在SWDIO和SWCLK上各加一个10kΩ的上拉到3.3V同时在SWCLK上并联一个22pF的电容到地做滤波。这个电容值不能太大否则会拖慢时钟边沿导致高速下载失败。22pF是我实测下来比较稳妥的值100pF以上就会在4MHz时钟下出现偶发连接失败。nRESET引脚上建议加一个100nF电容到地同时保留STM32复位电路本身的10kΩ上拉和100nF电容。这样J-Link拉低复位线的时候能可靠地把芯片复位。注意如果你在SWCLK上加了滤波电容J-Link的时钟频率不要设太高。我一般把SWD时钟设在1MHz到4MHz之间超过4MHz之后信号完整性问题会变得明显。3.4 一个容易忽略的细节电源检测J-Link的VTref引脚不只是给仿真器内部电平转换用的它还承担着电源检测的功能。如果你的目标板是独立供电的而J-Link的VTref接到了目标板的3.3V上那么当目标板没上电的时候J-Link会检测到VTref为0V拒绝连接。这是正常行为不是故障。但有一种情况需要注意如果你的目标板由J-Link供电比如J-Link的引脚1输出3.3V给目标板那就要确认J-Link的驱动能力够不够。J-Link的引脚1通常只能提供几十毫安的电流带不动整个STM32系统加外设。所以我的建议是目标板独立供电VTref只做电压检测用不指望它供电。4. PCB布局与走线让调试口一次成功的几个关键点4.1 接口位置的选择调试接口放在PCB的哪个位置直接影响到你调试的时候方不方便。我见过有人把SWD接口放在板子正中间四周全是高元件仿真器插上去之后被电容和电感挡住根本插不进去。还有人把接口放在板子边缘但朝内排线要弯180度才能接上用几次之后排线就断了。我的经验是调试接口放在板子边缘接口方向朝外周围至少留出15mm的净空区域。这样仿真器的排线可以直直地插上去不需要弯折。如果是用排针加杜邦线的方式也要保证手能伸进去插拔。另外如果你用的是20针IDC座子注意座子的高度。有些座子比较高插上排线之后会挡住旁边的元件。选座子的时候看一眼规格书里的高度参数一般选高度在8mm以内的比较稳妥。4.2 SWDIO和SWCLK的走线规则这两根线是调试接口的核心走线质量直接影响连接稳定性。几条实用的规则第一尽量短。SWDIO和SWCLK从接口到STM32引脚的走线长度控制在50mm以内。走线越长寄生电容越大信号边沿越缓高速时钟下容易出错。第二不要跨分割。这两根线下面要有完整的地平面参考。如果走线跨越了地平面的分割缝隙回流路径被切断信号完整性会急剧恶化。我一般会在PCB上专门给调试线留一条完整的地平面区域。第三远离干扰源。晶振、开关电源、电机驱动这些噪声源附近不要走调试线。如果实在避不开中间加地线隔离或者走内层用上下地平面包起来。第四等长不是必须的。SWD是异步串行协议SWCLK和SWDIO之间没有严格的等长要求。但为了信号质量一致我一般会让这两根线尽量靠近走长度差控制在10mm以内。4.3 地线的处理调试接口的地线连接看起来简单但实际做板子的时候经常出问题。J-Link的20针接口里有7个GND引脚3、5、11、13、15、17、19这些地线在仿真器内部是连在一起的。你在PCB上不需要把7个地全部引出来但至少要接2个而且这两个地要在PCB上就近连到地平面。我见过有人只接了一个GND而且这个GND是通过一根细长的走线连到板子另一头的地平面。结果调试的时候J-Link时不时掉线尤其是电机一转就断。后来把GND加粗、就近打过孔到地平面问题就解决了。提示调试接口的GND引脚旁边至少放一个过孔到地平面过孔不要太小0.3mm内径起步。如果空间允许放两个过孔。4.4 丝印标注的重要性这一点很多人不在意但实际用起来差别巨大。PCB上的调试接口旁边一定要有清晰的丝印标注标明每个引脚的功能。我一般会在丝印上写“VTref / SWDIO / SWCLK / RST / GND”而不是只写“J1”。为什么因为板子焊好之后你可能过几个月才回来调试到时候早忘了哪个引脚是哪个。或者你把板子交给同事用没有丝印标注的话对方要翻原理图才能接线。更糟糕的是接错线导致仿真器或者芯片损坏。丝印的字号不要太小1mm高度起步否则打样出来看不清。如果板子空间紧张至少把VTref和GND标出来这两个接反了会烧仿真器。5. 从零跑通一次J-Link连接实操验证流程5.1 硬件连接检查清单板子焊好之后不要急着上电插仿真器。先拿万用表做几项检查电源对地阻抗3.3V和GND之间的阻抗应该在几百欧姆以上如果接近0欧姆说明有短路。调试引脚对地阻抗SWDIO和SWCLK对地阻抗应该在几十千欧以上如果很低说明有焊接短路或者芯片损坏。VTref电压上电之后测量调试接口的VTref引脚应该是稳定的3.3V。nRESET电压正常应该是3.3V按下复位键之后变为0V。这几项检查花不了两分钟但能避免很多低级问题。我遇到过一块板子SWDIO对地阻抗只有几欧姆查了半天发现是排针焊接的时候连锡了。5.2 J-Link驱动安装与配置J-Link的驱动安装本身不复杂但有几个细节容易出问题。去官网下载最新的J-Link软件包安装的时候会同时装驱动和J-Flash、J-Link Commander这些工具。安装完成之后把J-Link插到电脑USB口打开设备管理器应该能看到“J-Link driver”设备。如果显示黄色感叹号说明驱动没装好需要手动指定驱动路径。然后打开J-Link CommanderJLink.exe输入connect命令它会让你选择目标器件。选STM32F103C8接口选SWD速度选4000kHz。如果一切正常会显示芯片ID和电压信息。如果连接失败J-Link Commander会给出具体的错误信息。常见的几种错误信息可能原因排查方向Cannot connect to targetVTref没接或电压不对测VTref电压No Cortex-M device foundSWDIO/SWCLK接反或断路对调两根线试试Target voltage too low目标板没上电或VTref悬空检查供电Communication failure时钟太快或走线太长降低SWD时钟5.3 Keil环境下的调试配置在Keil MDK里配置J-Link调试步骤是这样的打开Options for Target切换到Debug选项卡选择“J-LINK / J-TRACE Cortex”。然后点Settings在Debug标签页里确认Port选的是SWMax Clock根据你的走线质量选1MHz到4MHz。在Flash Download标签页里确认Programming Algorithm里有STM32F10x的Flash算法。有一个坑要注意如果你用的是STM32F103C8T6Flash大小是64KB但Keil里默认的算法可能是128KB的。选错了算法会导致下载失败或者校验错误。在Flash Download里点Add找到“STM32F10x Med-density Flash”这个算法大小是128KB但实际芯片只有64KB这个算法是兼容的可以用。还有一个常见问题是“SWD/JTAG Communication Failure”。这个错误通常出现在下载过程中原因可能是芯片进入了低功耗模式、或者调试引脚被复用成了普通IO。解决办法是在Keil的Debug设置里勾选“Reset and Run”并且在下载前按住复位键点下载的瞬间松开。5.4 实测中遇到的几个典型问题问题一能识别芯片但下载失败。这种情况多半是Flash算法选错了或者芯片写保护了。用J-Link Commander输入unlock命令解锁然后重新下载。问题二下载成功但程序不运行。检查BOOT0和BOOT1引脚的电平。BOOT0接高电平的时候芯片从系统存储器启动不会运行你下载的程序。正常跑程序的时候BOOT0要接GND。问题三调试的时候断点打不上。可能是优化等级太高编译器把代码优化掉了。把Keil的优化等级调到Level 0再试。问题四J-Link连接正常但ST-Link连不上。检查调试接口的引脚定义是否兼容。ST-Link的SWD接口定义和J-Link不同ST-Link的20针接口里SWDIO和SWCLK的位置和J-Link不一样不能直接互换排线。6. 释放JTAG引脚把PA15、PB3、PB4当普通IO用6.1 为什么要关闭JTAG前面提到过STM32的PA15、PB3、PB4默认是JTAG功能。如果你用SWD模式这三根线就空出来了可以当普通GPIO用。但如果你不主动关闭JTAG功能直接配置这三个引脚为输出会发现引脚不受控制——你写1它不输出高写0它不输出低。这不是芯片坏了是JTAG功能还占着引脚。STM32的参考手册里写得很清楚要使用PA15、PB3、PB4作为普通IO必须先关闭JTAG功能保留SWD功能。6.2 关闭JTAG的代码实现关闭JTAG功能需要操作AFIO的MAPR寄存器。标准库和HAL库的写法不一样我两种都列出来。标准库的写法RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);HAL库的写法__HAL_RCC_AFIO_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_AFIO_REMAP_SWJ_NOJTAG();这两段代码的效果是一样的关闭JTAG保留SWD。执行之后PA15、PB3、PB4就可以正常当GPIO用了。注意关闭JTAG之后如果你还想用JTAG模式调试就没办法了。所以在开发阶段建议保留JTAG功能等产品定型、不需要JTAG调试了再关闭。或者你可以用GPIO_Remap_SWJ_Disable把SWD也关了但那样就彻底没法调试了只能靠串口下载程序。6.3 关闭JTAG的时机关闭JTAG的代码要放在GPIO初始化之前。如果你先初始化了PA15为输出再关闭JTAGPA15的状态可能会不确定。正确的顺序是使能AFIO时钟关闭JTAG功能配置PA15、PB3、PB4为普通GPIO正常使用我一般会在main函数的最开始就做这一步放在所有外设初始化之前。这样后面不管怎么配置这三个引脚都不会受到JTAG功能的影响。7. 几个容易踩的坑和排查思路7.1 排针间距搞错J-Link的20针接口是2.54mm间距但有些仿真器用的是2.0mm间距的排针。如果你照着2.54mm画了PCB买回来的仿真器是2.0mm的那就插不上去。画板子之前先确认你手头仿真器的接口间距或者干脆两种都留焊盘。7.2 丝印方向搞反PCB上的排针丝印引脚1的位置一定要标清楚。我见过有人把引脚1标在了右边但实际焊接的时候排针从背面插过来引脚顺序整个反了。结果VTref接到了GND上一上电J-Link就保护了。解决办法很简单在丝印上画一个方形焊盘标记引脚1同时在旁边写“1”字。焊接的时候对照原理图确认方向。7.3 调试线和电源线捆在一起有些人为了走线整齐把SWDIO、SWCLK和电源线捆在一起走。电源线上的电流变化会在调试线上感应出噪声导致通信不稳定。调试线要和电源线保持至少3倍线宽的间距或者中间加地线隔离。7.4 忘记接nRESETnRESET不是必须接的J-Link可以通过SWD协议发送复位命令。但在某些情况下比如芯片跑飞了、进入了低功耗模式、或者调试引脚被复用成了普通IOSWD协议可能无法正常通信这时候就需要硬件复位。所以我的建议是nRESET一定要引出来多一根线的事但能省很多麻烦。7.5 用杜邦线连接时的线序问题用杜邦线连接J-Link和自制板子的时候线序一定要对照好。J-Link的20针接口里引脚1是VTref引脚2是SWDIO引脚4是SWCLK引脚3是GND。如果你用的是5针排针顺序是VTref、SWDIO、SWCLK、nRESET、GND那对应的杜邦线连接就是J-Link引脚1 → 板子引脚1J-Link引脚2 → 板子引脚2J-Link引脚4 → 板子引脚3J-Link引脚10 → 板子引脚4J-Link引脚3 → 板子引脚5我一般会用不同颜色的杜邦线来区分红色接VTref绿色接SWDIO黄色接SWCLK白色接nRESET黑色接GND。这样即使接错了也能一眼看出来。8. 从原理图到PCB的完整检查清单画完板子发出去打样之前对照这个清单过一遍[ ] 调试接口的VTref、SWDIO、SWCLK、GND、nRESET五根线全部连接正确[ ] VTref连接到目标板的3.3V不是5V[ ] SWDIO和SWCLK没有接反[ ] GND至少有两个引脚连接到地平面[ ] SWDIO和SWCLK走线长度小于50mm[ ] 调试线下方有完整地平面[ ] 调试接口周围有15mm以上的净空区域[ ] 丝印标注了每个引脚的功能[ ] 引脚1的位置有明确标记[ ] 如果关闭了JTAG确认PA15、PB3、PB4的配置正确[ ] nRESET上有100nF电容到地[ ] SWCLK上的滤波电容不超过22pF如果加了的话这份清单是我做了十几块STM32板子之后总结出来的每次发板之前都会过一遍。看起来项目多但实际操作起来五分钟就能检查完比板子打回来发现问题的成本低太多了。最后说一个我自己的习惯每次画完PCB我会把调试接口那部分单独截图和J-Link的接口定义图放在一起对比一遍。这个动作花不了一分钟但帮我避免了好几次引脚定义搞混的问题。尤其是用不同厂家的仿真器的时候接口定义有细微差别对比一下最保险。
返回列表