背景回顾

  • 芯片:STM32F407ZET6

  • 需求:每30秒用 HC-SR04 测距,通过蓝牙(BLE-CC41-A,串口3)发送数据,其余时间休眠

  • 问题:代码加入休眠后,MCU 进入停止模式 → SWD调试接口关闭 → Keil/J-Link 无法下载

  • 现象Failed to connectInitTarget() returned with error code -1


🔍 第一阶段:发现问题

1. 症状确认

  • 程序能正常运行(蓝牙发数据),但再次下载时报错

  • J-Link 无法连接目标

  • 按住复位键点下载也无效

2. 原因分析

  • STM32 进入 Stop 模式 后,默认关闭 SWD 调试接口

  • 调试器无法在芯片休眠时连接

  • 相当于“自己把自己锁死了”


🛠️ 第二阶段:尝试软件救活

1. Keil 设置调整(失败)

  • 修改 Debug 设置:

    • Connect: under Reset

    • Reset: HW RESET

  • 按住复位键点下载 → 依然失败

2. J-Flash 尝试(V4.12 太老,失败)

  • 旧版 J-Flash 不支持 STM32F407(无 Cortex-M4)

  • 升级到最新 J-Flash V7.x / V9.x

3. J-Flash 设置“Connect under reset”(部分成功)

  • 新版 J-Flash 里,这个选项藏在:

    • Options → Project Settings → MCU → Init. steps

    • 添加一条 Reset 动作,Type=0Delay=100ms

  • 效果:有时能连上,但不稳定


⚡ 第三阶段:物理硬件救活(最终成功)

✅ 方法1:复位大法(临时有效)

  • 用杜邦线短接 GND 和 NRST

  • 在短接瞬间点击 J-Flash Connect

  • 连接成功后立刻擦除

✅ 方法2:BOOT0 强拉模式(100%成功,推荐)

操作步骤(基于你的板子):
  1. 找到 BOOT 排针(3x2 布局)

    text

    1   2   ← BOOT0 相关
    3   4   ← BOOT1 相关
    5   6   ← GND/VDD
  2. BOOT0 接 3.3V

    • 用跳线帽短接 1-2(BOOT0 → VDD3V3)

  3. BOOT1 保持 GND(你板上有 R69 下拉电阻,不用动)

  4. 重新上电

    • 芯片从系统存储器(Bootloader)启动

    • 不会运行休眠程序

    • SWD 接口恢复

  1. 用 Keil 直接下载新程序

  2. 下载成功后断电,跳线帽换回 5-6(BOOT0 → GND)

  3. 重新上电,程序正常运行

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐