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
相关产品推荐
相关产品推荐

