4、烧录协议入门:常见的烧录协议(ST-Link, J-Link, ISP)、协议选择原则

大家好,欢迎来到第四章。前面我们聊了固件烧录的基本流程和工具链,今天咱们来点硬核的——烧录协议。

说白了,烧录协议就是芯片和烧录器之间沟通的「语言」。你用的烧录器再好,如果跟芯片「说不上话」,那也是白搭。我刚开始做嵌入式那会儿,就吃过这个亏——拿着J-Link去烧一个只支持ISP的芯片,折腾了半天没反应,后来才发现是协议不匹配。

好,咱们一个一个来看。

4.1 ST-Link 协议

ST-Link 是意法半导体(ST)自家出的调试烧录器,主要伺候 STM32 系列芯片。它支持两种底层协议:SWD(串行线调试)和 JTAG。

SWD 协议

  • 只需要两根线:SWDIO(数据线)和 SWCLK(时钟线)
  • 速度最高能到几十MHz,实际用起来很稳
  • 我个人习惯,只要芯片支持SWD,我就优先用这个——省引脚,布线也方便

JTAG 协议

  • 需要5根线:TMS、TCK、TDI、TDO、nTRST(可选)
  • 兼容性更好,很多ARM芯片、FPGA都支持
  • 但引脚多,在小板子上不太友好

实际经验:我在一个四层板的项目中,因为空间紧张,硬是用SWD把6个引脚挤成了2个。嗯,省下来的4个引脚刚好用来加了一路I2C传感器。所以说,协议选对了,硬件设计能省不少事。

4.2 J-Link 协议

J-Link 是 Segger 公司的产品,可以说是调试器里的「瑞士军刀」。它支持的协议更丰富:

  • SWD:跟ST-Link一样,但J-Link的驱动优化更好,速度更快
  • JTAG:标准JTAG,支持多核调试
  • SPI / I2C 直写:有些J-Link型号可以直接通过SPI或I2C烧录,不需要走标准调试接口

我记得有一次,客户要求用J-Link烧录一个非ARM架构的芯片。当时我查了半天资料,发现J-Link的「Generic JTAG」模式可以自定义指令序列。说白了,就是你可以手动拼出烧录时序。虽然麻烦了点,但确实能解决问题。

小技巧:如果你用J-Link烧录STM32,建议把速度调到4MHz以上。我实测过,4MHz比1MHz快了将近3倍,而且稳定性没差别。当然,线太长的话要降速,不然容易出错。

4.3 ISP 协议

ISP(In-System Programming)是在系统编程的意思。它跟SWD、JTAG最大的区别是:不需要专用的调试接口

常见的ISP实现方式:

  • UART ISP:比如STM32的串口下载,通过Bootloader引导
  • USB ISP:比如AVR芯片的USBasp,直接走USB协议
  • SPI ISP:有些芯片支持通过SPI接口烧录Flash

为什么会用ISP?我遇到过一种场景:产品已经量产了,但发现固件有bug。这时候如果拆机用SWD烧录,成本太高。好在芯片预留了UART ISP接口,只需要一根USB转串口线就能现场升级。嗯,这就是ISP的实用价值。

注意:ISP烧录通常需要芯片内部有Bootloader。如果Bootloader被擦除了,那ISP就废了。我曾经手滑把STM32的Bootloader给擦了,结果只能上J-Link救砖。所以,量产前一定要确认Bootloader的保护机制。

4.4 协议选择原则

好,三种协议都介绍完了。那实际项目中怎么选?我总结了几条原则:

场景 推荐协议 理由
开发调试阶段 SWD(J-Link或ST-Link) 速度快,支持断点调试,效率高
量产烧录 SWD 或 JTAG 稳定可靠,适合自动化产线
现场升级 ISP(UART或USB) 不需要专用工具,成本低
多芯片同时烧录 JTAG(菊花链模式) 一根线可以串多个芯片,节省时间
引脚极度受限 SWD 2根线搞定,适合小封装芯片

另外,还有几个小建议:

  • 优先选SWD:只要芯片支持,SWD就是最省心的选择。我90%的项目都用它。
  • JTAG留作备选:如果SWD死活连不上,试试JTAG。有时候是芯片的SWD引脚被复用了。
  • ISP只用于特殊场景:比如远程升级、产线最后一道工序。别拿它当主力烧录方式,速度慢且不稳定。

避坑指南:我曾经在一个项目中,为了省成本,用ISP代替了SWD做量产烧录。结果因为产线上的USB转串口线质量参差不齐,烧录失败率高达5%。后来换回SWD,失败率直接降到0.1%。所以,量产环节别省那几十块钱的烧录器钱。

4.5 小结

今天的内容就这些。总结一下:

  • ST-Link 适合 STM32 开发,SWD 是首选
  • J-Link 更通用,支持多种协议,适合多平台
  • ISP 适合现场升级,但别用于量产主力
  • 协议选择要看场景:开发用SWD,量产用SWD/JTAG,现场用ISP

下一章,我们会深入讲烧录脚本的编写。到时候我会分享一个我常用的Python烧录框架,保证让你写脚本的效率翻倍。咱们下期见。