kdm keil 的使用,led stm32 调试模式是亮led 的,直接加载到板子上,led 不亮
不勾选 Microlib 导致 STM32F103 不亮灯,最根本的原因是代码中使用了
printf 等标准输入输出函数,触发了 ARM 编译器的“半主机(Semihosting)”模式,导致程序在进入 main 函数前或执行到 printf 时陷入死循环卡死。 [1, 2]从你上一轮给出的编译日志中可以看到,你的项目包含
Usart1.c,显然做了串口初始化和打印相关的操作。以下是导致不亮灯的详细原理和两个彻底解决的方法:为什么不勾选 Microlib 就会卡死?
- 使用了标准C库:当你不勾选 Use MicroLIB 时,MDK(Keil)默认链接的是完整的标准 C 库(Standard C Library)。 [1, 2]
- 激活半主机机制:标准 C 库中的
printf、scanf等函数,默认底层使用的是半主机机制。这种机制的作用是让嵌入式芯片通过调试器(如 ST-Link/J-Link)借用电脑屏幕来显示打印信息,或借用电脑键盘输入。 [1, 2] - 硬件卡死:芯片在运行时会发送中断等待电脑调试器的响应。如果你的板子断开了调试器独立供电,或者调试器没有进入对应的半主机接收状态,程序就会无限死循环等待响应,从而直接卡死,甚至连最开始的点灯代码、初始化代码(如
SystemInit)都无法执行到。 [1, 2]
彻底解决的两个办法(二选一)
办法一:重新勾选 Microlib(最简单、最推荐)
在 Keil 中勾选 Use MicroLIB。 [1]
- 位置:点击魔术棒 (
Options for Target) -> 切换到 Target 选项卡 -> 勾选右侧的 Use MicroLIB。 - 原理:MicroLIB 是 ARM 专门为嵌入式微控制器优化的精简库,它默认关闭了半主机机制。只要勾选它,标准库就不会去等待调试器的回显信号,程序就能正常运行并点灯。 [1, 2]
办法二:不勾选 Microlib,但手动“禁用半主机”并重定向(适用于不能用 Microlib 的项目)
请把以下这段代码复制到你的
Usart1.c 的末尾(确保包含了 #include <stdio.h>):
浙公网安备 33010602011771号