STM32G071RBT6仅在设断点时触发系统复位问题求助
STM32G071RBT6按钮触发MCU复位逻辑异常求助
我是嵌入式开发新手,基于STM32CubeIDE(搭配CubeMX完成基础配置)编写代码,想要实现:当按钮按下(低电平有效,已启用内部上拉电阻)且满足特定条件时,复位STM32G071RBT6 MCU。
原问题代码
// 存在问题的代码段 if (HAL_GPIO_ReadPin(BT1_GPIO_Port, BT1_Pin) == 0) { if (latch == 1) { latch = 0; HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, 0); } else if (latch == 0) { __DSB(); // 等待Flash写入完成! __disable_irq(); // 禁用所有中断(因为有定时器在运行) NVIC_SystemReset(); // 执行复位! // NVIC_SystemReset(); 也可以替换为: //SCB->AIRCR = 0x05FA0004;// 写入系统复位密钥和复位位 while(1); // 等待硬件执行复位... } HAL_Delay(500); // 临时用简单的延时消抖 }
问题现象
编译Debug或Release版本运行时,第一次按压按钮功能正常(latch被设为0,LD4输出拉低),但第二次按压按钮时,MCU始终无法触发复位——除非在代码任意位置设置断点。
已尝试的排查方法
- 设置断点追踪代码流程,确认代码能执行到系统复位步骤
- 读取GPIO输入寄存器,确认按钮按压的低电平信号正常输入
- 切换Debug/Release编译配置,问题现象无差异
修改后正常工作的代码
// 修改后正常的代码段 if (HAL_GPIO_ReadPin(BT1_GPIO_Port, BT1_Pin) == 0 && latch ==1) { latch = 0; HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, 1); HAL_Delay(500); // 临时用简单的延时消抖 } if (HAL_GPIO_ReadPin(BT1_GPIO_Port, BT1_Pin) == 0 && latch == 0) { __DSB(); // 等待Flash写入完成! __disable_irq(); // 禁用所有中断 NVIC_SystemReset(); // 执行复位! while(1); // 等待硬件执行复位... HAL_Delay(500); // 临时用简单的延时消抖 }
我怀疑是自己对else if语句的实际执行逻辑理解有误,打算深入学习相关内容,特此求助各位开发者帮忙分析问题原因。
内容的提问来源于stack exchange,提问作者jagos34
相关产品推荐
相关产品推荐

