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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:45:45