J-Link 调试器 生产落地案例
五、生产落地案例
案例一:产线烧录与序列号写入
背景:某控制器产品每台需要在 Flash 里写入唯一的序列号和出厂校准参数,之前靠人工点 IDE 按钮,效率低且偶发漏烧。
怎么做:用 J-Flash 建立工程(选定 device、Flash 地址范围、待烧录的 hex),导出工程文件;产线脚本调用 J-Flash 的命令行模式,传入固件与参数文件,连接、擦除、编程、校验、启动一气呵成。序列号由上位机从数据库取出,写进参数区。
JFlash -openprj product.jflash -open firmware.hex \
-connect -erasechip -program -verify -startapp -exit
关键配置:device 型号与 Flash 容量后缀必须与实际芯片一致;速度在产线夹具上适度降低以换取稳定;打开校验步骤,避免擦写不良流入下一站。
效果:单台烧录时间明显下降,且因为强制校验,漏烧和烧录不全的问题基本消失。
坑与解决:一是夹具上的 SWD 排线太长导致偶发连接失败,把线缩短并加地线伴行、速度降到 1000 kHz 之后稳定;二是忘记勾选校验,出现过几台只写了部分区域的情况,之后把 -verify 写死在脚本里。
案例二:现场死机取证
背景:设备在现场偶发停机,重启即恢复。现场无法接串口,也复现不了。
怎么做:固件里加入 RTT 输出和故障处理函数——发生 HardFault 时把关键寄存器写进 RTT 并保留一块掉电不丢的 RAM 区域;同时打开看门狗。现场死机后,工程师带笔记本和 J-Link 到现场,用 connect under reset 连接,先不做整片擦除,直接读故障寄存器与保留内存。
device STM32F407VG
si SWD
speed 1000
connect
mem32 0xE000ED28 1
mem32 0xE000ED38 1
savebin fault_ram.bin 0x2001F000 0x1000
qc
关键配置:连接前不要复位,connect 之后先用 h 停机再读,避免继续跑飞覆盖现场;速度降到 1000 kHz 提高连接成功率。
效果:从 CFSR 的取值定位到是除零还是非法地址访问,再结合保留内存里存的调用现场,最后定位到某次指针未判空。
坑与解决:第一次直接用了 erase 做整片擦除,把现场抹掉了;另外仅靠硬件复位连接不上跑飞的芯片,必须用 connect under reset 并在复位释放前抓住内核。还有一个隐蔽的坑:看门狗在调试时最好暂停,否则单步到一半就被复位。

