一、常见的STM32程序下载失败现象和原因

        有如下:

现象/错误提示 可能原因 解决方案
目标芯片无法识别 (No target detected) - SWDIO/SWCLK 接线错误或松动- 目标板无供电或电压不足- ST-LINK 驱动未安装 - 检查接线,确保 VCC、GND、SWDIO、SWCLK 正确- 测量 VDD=3.3V- 重新安装 ST-LINK 驱动
一直提示连接失败 - SWD 接口被禁用(Option Bytes 配置错误)- 程序占用了调试引脚 (PA13/PA14)- ST-LINK 固件太老 - 使用 Connect under reset 模式- 更新 ST-LINK 固件- 用 BOOT0=1 进入系统 Bootloader 烧录
下载器能连上,但下载过程中断 - 供电不足- 线太长或干扰大- 下载速率过高 - 确保 3.3V 稳定供电- 线尽量短于 20cm- 将 ST-LINK 下载速率调低
下载成功,但程序无法运行 - BOOT0/BOOT1 配置错误,跑到系统 Bootloader- 时钟配置错误(外部晶振异常)- 复位电路异常 - BOOT0=0,BOOT1=0 进入 Flash- 确认 HSE 晶振正常- 检查 NRST 电路
无法擦除/下载,报错 RDP error - 读保护 (RDP Level 1 或 2) 开启 - 若为 Level 1:执行 全芯片擦除(CubeProgrammer 里有选项)- 若为 Level 2:芯片已彻底锁定,无法解锁
一直复位,无法稳定连接 - 程序里启用了 IWDG,看门狗不断复位- 代码跑飞,导致系统异常 - 使用 Connect under reset 模式- 上电同时点“下载”
文件下载成功,但调试报错 - 选择了 JTAG 而非 SWD- 目标电压未检测到 - 将接口改成 SWD,禁用 JTAG- 确保 VCC → ST-LINK 的 Vtarget 检测脚正确连接
板子完全无响应 - 芯片损坏(静电/过压)- NRST 被外部电路拉死 - 尝试更换芯片- 检查复位电路是否短路

二、特殊的STM32程序下载失败现象和原因

1.程序第一次能下载成功,第二次下载就下载失败,并出现以下错误提示:

情况1:

Debugger -Cortex-M Error
Error while accessing a target resource. Resource perhaps notavailable or a wrong access was attempted.

Error: Flash Download failed - Target DLL has been cancelled

        我遇到的同样的报错情况,其实是 STM32H7 系列常见的“外设卡死 + Debug 失联”问题,由于我在使用LTDC驱动RGB屏幕的时候,STM32在初始化系统时钟时,LTDC 没配好时钟就开始初始化和使用LTDC,很容易踩坑出现这个程序下载失败的问题。(FMC、LTDC、SDMMC 这种总线外设都可能导致 第二次下载失败。)

你的现象可以分成两个阶段理解:

第一次下载程序能跑

  • 第一次下载时,芯片复位后 LTDC 寄存器处于默认状态,LTDC 时钟默认是关的。

  • 程序启动后你调用了 HAL_LTDC_Init(),但是因为没有配置 RCC_PERIPHCLK_LTDC,LTDC 的 Pixel Clock 实际没有运行。

  • 这会导致 LTDC 的某些控制寄存器进入 “等待事件” 状态(特别是在启动传输或者等待同步信号时)。

  • LTDC 没有时钟时,外设状态机无法退出这种等待,相当于进入硬件死循环。

第二次下载就报 ST-LINK 错

  • 当你第二次下载程序时,MCU 上电后并没有完全复位 LTDC 外设(特别是在用 SWD 调试时,如果上次是“Run”状态下断电,外设可能保持原状态)。

  • LTDC 依然卡在死循环状态,AHB 总线被它占住或长时间阻塞。

  • 结果 SWD 访问寄存器时,访问超时,就出现:

    Error while accessing a target resource.
    Resource perhaps not available or a wrong access was attempted.
    
  • 这时你会发现 有时只能全断电一段时间才能重新连接,因为只有上电复位才能完全清除 LTDC 的锁死状态。


为什么 LTDC 时钟没开会卡死

  • STM32H7 的 LTDC 必须有 像素时钟(Pixel Clock)才能正常驱动同步信号生成器。

  • 如果没开 RCC_PERIPHCLK_LTDC 选择 PLL3(或其他源),LTDC 初始化时会等待同步信号 ready,但因为时钟为 0,这个状态永远不会置位。

  • CPU 会在访问 LTDC 寄存器时被总线握手阻塞,严重时阻塞 SWD 调试器。


怎么避免

  1. 正确配置时钟

    RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
    
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
    PeriphClkInitStruct.PLL3.PLL3M = 5;
    PeriphClkInitStruct.PLL3.PLL3N = 160;   // 根据需求设置
    PeriphClkInitStruct.PLL3.PLL3P = 2;
    PeriphClkInitStruct.PLL3.PLL3Q = 2;
    PeriphClkInitStruct.PLL3.PLL3R = 32;    // 像素时钟分频
    PeriphClkInitStruct.LtdcClockSelection = RCC_LTDCCLKSOURCE_PLL3;
    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
    

    确保 Pixel Clock 符合 LCD 面板要求。

  2. 加 Debug 保护

    • main() 里先检测 LTDC 时钟是否有效,再初始化 LTDC。

    • 避免一上电就卡死,可以用延时或串口日志先确认时钟状态。

  3. 救砖方法(卡死无法下载时)

    • 在 ST-LINK Utility / STM32CubeProgrammer 里勾选 Connect under reset,用硬件复位引脚进入下载模式。

    • 或断电 → 按住 BOOT0 → 上电 → 进入系统 Bootloader,用 UART/USB DFU 下载。

       我建议在使用STM32 MCU的项目里,把所有用到的外设时钟先配置好,再初始化外设,不然像 FMC、LTDC、SDMMC 这种总线外设都可能导致 第二次下载失败。

情况2:

       有可能是 程序里面有代码禁用了 JTAG 或者 SWD接口的时钟,或者把JTAG 或者 SWD接口的引脚配置成了其他的功能,找到冲突的代码,修改下就好。

Logo

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

更多推荐