You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环中使用WFI导致STM32F103无法挂载调试器的求助

STM32F103 休眠时保持ST-Link调试连接的解决方案

在基于裸机和SysTick实现LED闪烁时,加入WFI指令让CPU休眠以节省周期,但导致ST-Link无法连接MCU,仅切换BOOT0为1时才能重新识别。尝试WFE、配置SCB_SCR寄存器均无效,需找到不影响调试的休眠方法。

核心原因

STM32F103进入睡眠模式后,默认会关闭调试接口(SWD)的时钟,导致ST-Link无法与MCU通信。需通过配置DBGMCU寄存器让调试接口在低功耗模式下保持激活。

具体步骤

1. 添加调试接口配置函数

在代码中新增配置DBGMCU的函数,确保调试模块在睡眠/停止模式下持续工作:

static void configure_debug_interface(void)
{
    // 使能DBGMCU时钟(APB2总线第24位)
    uint32_t rcc_apb2enr_address = 0x40021000 + 0x18;
    volatile uint32_t *rcc_apb2enr = (uint32_t*)rcc_apb2enr_address;
    *rcc_apb2enr |= (1U << 24);

    // 配置DBGMCU:允许睡眠/停止模式下调试接口工作
    uint32_t dbgmcu_cr_address = 0xE0042000;
    volatile uint32_t *dbgmcu_cr = (uint32_t*)dbgmcu_cr_address;
    *dbgmcu_cr |= (1U << 0) | (1U << 1); // DBG_SLEEP | DBG_STOP
}

2. 在初始化流程中调用该函数

修改start函数,在SysTick配置完成后调用调试接口配置:

void start(void)
{
    enable_port_clock();
    configure_pin();
    configure_sys_tick_timer();
    configure_debug_interface(); // 添加调试接口配置

    for (;;)
    {
        asm("WFI");
    }
}

3. 验证效果

完成修改后重新烧写代码:

  • LED仍会按500ms间隔正常闪烁
  • 无需切换BOOT0引脚,直接使用st-info --probe可识别MCU
  • st-flash工具可正常进行烧写操作

额外说明

  • 若使用STOP模式(更深的低功耗),需确保DBGMCU的DBG_STOP位已配置,同时RCC的时钟配置需匹配低功耗模式要求
  • 避免将SWD引脚(PA13=SWDIO、PA14=SWCLK)配置为普通IO功能,保持其默认调试引脚属性

内容的提问来源于stack exchange,提问作者vbezhenar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:14:53