我写了一个基于python的jlink自动烧录器,自动检测jlink是否连接上指定mcu,连接上后自动烧录程序,烧录完成后等待断开,下一个mcu连接后继续自动烧录。
而且可以一台电脑连接多个jlink,通过运行多个脚本实现,一台电脑使用多个jlink批量烧录单片机
目前的话经过测试,上百次烧录是没有问题的。

代码在最后,相关仓库也在最后。
import pylink
import time
import os
# ==================== 配置参数 ====================
MCU = 'STM32F407VE'
DOWNLOAD_FILE = 'E:\\other\\jlink_programing\\PWM.bin'
FLASH_START_ADDR = 0x08000000
POLL_INTERVAL = 2
COUNT_FILE = 'burn_count.txt'
JLINK_SERIAL = None
# ===================================================
def auto_burn_mcu():
jlink = pylink.JLink()
burn_count = 0
print("="*50)
print("🚀 自动烧录程序启动(核心ID=-1视为未连接)")
print(f"📌 配置:MCU={MCU} | 间隔={POLL_INTERVAL}秒 | 累计烧录:{burn_count}次")
print("💡 操作:连接MCU→自动烧录→断开接线→等下一轮")
print("="*50)
try:
while True:
# 每次循环重置J-Link,避免前次异常残留
if jlink.opened():
jlink.close()
jlink.open(serial_no=JLINK_SERIAL)
jlink.set_tif(pylink.enums.JLinkInterfaces.SWD)
try:
print(f"\n⌛ 等待MCU连接...(累计:{burn_count}次)")
connect_result = jlink.connect(MCU, verbose=False)
core_id = jlink.core_id() if jlink.connected else "-1"
# 关键判断:核心ID=-1 或 未连接 → 视为没接上,重新等待
if core_id == -1 or not jlink.connected:
print(f"⚠️ 未检测到有效MCU(核心ID:0x{core_id}),{POLL_INTERVAL}秒后重试")
time.sleep(POLL_INTERVAL)
continue
# 走到这步=真正连接成功
print(f"✅ 检测到MCU!核心ID:0x{core_id}")
print(f"🚀 开始烧录文件...")
# 烧录前确保CPU暂停,避免冲突
jlink.halt()
jlink.flash_file(DOWNLOAD_FILE, FLASH_START_ADDR)
jlink.reset()
jlink.power_on() # 正确启动程序
# 计数更新
burn_count += 1
print("🎉 烧录成功!程序已运行")
print("="*50)
# 等待断开(读取核心ID,-1即视为断开)
print("🔌 请断开MCU所有接线...")
while True:
try:
current_id = jlink.core_id()
if current_id == -1:
print("✅ 已确认MCU断开!准备下一轮")
print("="*50)
break
time.sleep(1)
except pylink.JLinkException:
# 读取失败也视为断开
print("✅ 已确认MCU断开!准备下一轮")
print("="*50)
break
except pylink.JLinkException as e:
print(f"⚠️ 连接异常:{str(e)[:30]}...,{POLL_INTERVAL}秒后重试")
time.sleep(POLL_INTERVAL)
except Exception as e:
print(f"\n❌ 操作异常:{str(e)}")
print("💡 排查:接线是否牢固 | MCU供电是否稳定")
print("="*50)
time.sleep(POLL_INTERVAL)
except KeyboardInterrupt:
print(f"\n\n🛑 程序终止")
print(f"📊 本次烧录:{burn_count}次")
finally:
jlink.close()
print("🔌 J-Link已断开,程序退出")
if __name__ == "__main__":
auto_burn_mcu()