STM32 调试停留在LDR R0, =SystemInit,不能自动Run to main

博客指出常见问题是设置的断点过多,针对此情况给出解决办法,即把断点全部删除,还提到STLink只能设置5个断点。
出现最多的情况就是设置的断点过多,可以把断点全部删除试试看,STLink只能设置5个
### 3.1 程序卡在 `SystemInit()` 的常见原因与解决方法 在使用 Keil 进行 MCU 调试时,如果程序卡在 `SystemInit()` 函数而没有进入 `main()`,通常是由于系统时钟配置或调试设置不当引起的。 #### 3.1.1 系统时钟配置错误 如果外部晶振的频率与代码中配置的参数不一致,可能导致系统时钟初始化失败,从而卡死在 `SystemInit()` 中。例如,在某次调试中发现,硬件使用的是 25MHz 晶振,而代码中配置的是 8MHz,这会导致时钟初始化失败,程序无法继续执行[^4]。 **解决方法:** 检查硬件原理图中使用的晶振频率,并在代码中将对应的系统时钟配置修改为正确的值。例如,在 STM32 中,应确保 `HSE_VALUE` 定义与实际使用的晶振频率一致。 ```c // 在 system_stm32f10x.h 中定义 HSE_VALUE #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ ``` #### 3.1.2 缺少 MicroLIB 支持 在 Keil 中,如果未启用微库(MicroLIB),某些底层初始化函数可能无法正常执行,导致程序卡在 `SystemInit()` 中。例如,在一次调试中,程序卡在 `SystemInit()` 处,按了多次 Run 才能运行,最终发现是未勾选 MicroLIB 选项[^1]。 **解决方法:** 在 Keil 的项目选项中启用 MicroLIB: - 打开项目,点击 `Options for Target`; - 在 `Target` 标签下勾选 `Use MicroLIB`; - 重新编译项目并下载调试。 #### 3.1.3 调试器配置错误 在使用 J-Link 或 ULINK 等调试器时,若 Keil 的调试设置不正确,也可能导致程序无法正常跳转到 `main()`。例如,在某些情况下,调试器 DLL 设置错误会导致程序卡在 `SystemInit()` 或 `BX R0` 指令处[^3]。 **解决方法:** 检查调试器设置: - 打开 `Options for Target`; - 在 `Debug` 标签下选择正确的调试器(如 J-Link 或 ULINK); - 在 `Settings` 中确认芯片型号和时钟频率; - 在 `Initialization` 部分确保正确配置了调试接口(如 SWD 或 JTAG)。 #### 3.1.4 程序入口点未正确设置 在某些工程配置中,链接脚本或启动文件未正确指定程序入口点,可能导致调试器无法识别 `main()` 函数的地址,从而停留在 `SystemInit()` 或启动文件中。 **解决方法:** 确保启动文件中正确调用了 `main()` 函数,例如: ```armasm Reset_Handler: LDR R0, =_estack MOV SP, R0 ; 设置主堆栈指针 BL SystemInit ; 系统时钟初始化 LDR R0, =__data_load_addr LDR R1, =__data_start LDR R2, =__data_end B CopyDataInit ; 复制.data段到SRAM CopyDataInit: CMP R1, R2 ITE LT LDRPLT R3, [R0], #4 STRPLT R3, [R1], #4 BPL CopyDataInit LDR R1, =__bss_start LDR R2, =__bss_end MOV R3, #0 ZeroBSS: CMP R1, R2 ITE LT STRPLT R3, [R1], #4 BPL ZeroBSS BL main ; 跳转到main函数 ``` ###
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值