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

STM32F411代码仅在调试单步执行时运行问题求助

问题:STM32F411开发板代码仅单步调试可运行,直接执行挂死

硬件与基础配置

  • 使用标准STM32F411开发板
  • 已验证STLink连接时BOOT0引脚为GND、NRST引脚为3V
  • 排除外部引脚硬件配置问题,编译优化等级设为"None"

核心问题现象

  • 原本正常的代码仅能在调试单步执行时工作,Release模式或Debug模式直接运行均挂死
  • 添加LD3(橙色LED,连接PD13引脚)测试代码到执行链最前端后,发现设备在时钟配置代码执行时立即挂死
  • 补充现象:
    • Debug模式直接运行可正常工作,但断开编程器后无法运行,Release模式也无法运行
    • Debug与Release版本汇编代码无差异
    • 代码由Segger Embedded Studio生成,Release模式下在Segger启动初始化函数_start中挂死:LED代码置于_start开头可点亮,置于末尾则无法点亮;RunInit过程会调用__SEGGER_init_zero和__SEGGER_init_copy,其中__SEGGER_init_zero被调用次数极多,跳过该代码可点亮LED但运行环境未正确初始化

相关代码

寄存器操作宏(来自stm32.h)

// from stm32.h
/* modify bitfield */
#define _BMD(reg, msk, val)     (reg) = (((reg) & ~(msk)) | (val))
/* set bitfield */
#define _BST(reg, bits)         (reg) = ((reg) | (bits))
/* clear bitfield */
#define _BCL(reg, bits)         (reg) = ((reg) & ~(bits))
/* wait until bitfield set */
#define _WBS(reg, bits)         while(((reg) & (bits)) == 0)
/* wait until bitfield clear */
#define _WBC(reg, bits)         while(((reg) & (bits)) != 0)
/* wait for bitfield value */
#define _WVL(reg, msk, val)     while(((reg) & (msk)) != (val))
/* bit value */
#define _BV(bit)                (0x01 << (bit))

LED与主函数代码

void LD3_Init(void) {
    _BST(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);
    _BMD(GPIOD->MODER, (0x03 << 26), (0x01 << 26));
    _BCL(GPIOD->OTYPER, (0x01 << 13));

} // end LD3_Init

void LD3_ON(void) {
    _BST(GPIOD->ODR, (0x01 << 13));

} // end LD3_ON

int main (void) {
    volatile uint32_t reg_value;

    // Original source assumes default RCC register setting of 0x0000_XX81
    //  which enables the HSI clock, but better perhaps to explicitly set it
    _BCL(RCC->CR, RCC_CR_PLLON);
    _BCL(RCC->CR, RCC_CR_HSEON);
    _BST(RCC->CR, RCC_CR_HSION);
    _WBS(RCC->CR, RCC_CR_HSIRDY);

    do {
        _BST(RCC->APB1ENR, RCC_APB1ENR_PWREN);
        reg_value = RCC->APB1ENR;
        (void)reg_value;
    } while (0x00);

    /* set flash latency 2WS */
    _BMD(FLASH->ACR, FLASH_ACR_LATENCY, FLASH_ACR_LATENCY_2WS);
    /* setting up PLL 16MHz HSI, VCO=144MHz, PLLP = 72MHz PLLQ = 48MHz  */
    _BMD(RCC->PLLCFGR,
        RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLQ | RCC_PLLCFGR_PLLP,
        _VAL2FLD(RCC_PLLCFGR_PLLM, 8) | _VAL2FLD(RCC_PLLCFGR_PLLN, 72) | _VAL2FLD(RCC_PLLCFGR_PLLQ, 3));

    // Original driver also fails to set the APB1 Prescaler as the APB1 clock must run 
    //  at or below 50MHz
    RCC->CFGR &= ~((uint32_t)(0x07 << 0x0A));
    RCC->CFGR |=  ((uint32_t)(0x04 << 0x0A));
    /* enabling PLL */
    _BST(RCC->CR, RCC_CR_PLLON);
    _WBS(RCC->CR, RCC_CR_PLLRDY);
    /* switching to PLL */
    _BMD(RCC->CFGR, RCC_CFGR_SW, RCC_CFGR_SW_PLL);
    _WVL(RCC->CFGR, RCC_CFGR_SWS, RCC_CFGR_SWS_PLL);

    // wait for the clock to stabilize
    reg_value = 0x0000FFFF;
    while (reg_value) { --reg_value; };
    LD3_Init();
    LD3_ON();
    // lots of other stuff...
} // 

已完成排查

  • 处理器内部NRST上拉正常(引脚电压3V),开发板无外部上拉,仅设接地复位按钮
  • 相同时钟配置代码在其他场景运行正常

请求帮助

恳请提供排查方向与解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:37:02