循环中使用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
相关产品推荐
相关产品推荐

