3. Keil 调试器入门:Debug 模式进入与退出、断点设置与删除、单步执行、全速运行与停止

说实话,很多工程师写代码时挺自信,一进调试就手忙脚乱。我见过不少人,连怎么退出 Debug 模式都要找半天。这一章,咱们就把 Keil 调试器最基础的操作捋一遍。你把这些玩熟了,后面定位故障才能快起来。

3.1 进入与退出 Debug 模式

进入调试模式,说白了就是让芯片停下来,听你指挥。Keil 里最常用的方式有两种:

  • 直接点击 Debug 按钮:工具栏上那个放大镜图标,点一下就开始下载并进入调试。
  • 快捷键 Ctrl + F5:我个人习惯用这个,手不用离开键盘,效率高一些。

退出就更简单了。点击那个红色的 Stop 按钮,或者按 Ctrl + F5 再按一次。嗯,这里要注意:退出前最好先让程序全速跑起来,别停在断点处直接退,有时候会引发一些奇怪的外设状态残留。

我的习惯:每次退出调试前,我都会先按一下 F5(全速运行),确认程序在跑,然后再点 Stop。这样下次重新下载时,芯片状态更干净。

3.2 断点设置与删除

断点就是让程序停在你关心的那一行。Keil 支持硬件断点和软件断点,不过对咱们 STM32 来说,最常用的就是 行断点。

3.2.1 设置断点

  • 在代码行号左侧的灰色区域双击,出现一个红色圆点,断点就设好了。
  • 或者光标放在那一行,按 F9 快捷键。

3.2.2 删除断点

  • 再次双击那个红色圆点,它就消失了。
  • 想一次性清空所有断点?菜单栏 Debug → Breakpoints,或者按 Ctrl + Shift + F9。
我曾经踩过的坑:有一次我在中断服务函数里设了断点,结果程序一进中断就停,主循环根本跑不动。后来才发现,断点设在了中断频繁触发的地方。所以,断点别乱放,尤其是高频路径上。

3.3 单步执行:Step Into / Over / Out

单步执行是调试的灵魂。Keil 提供了三种步进方式,很多人搞混,我帮你理清楚。

操作 快捷键 行为 适用场景
Step Into F11 进入函数内部 你想看这个函数怎么跑的
Step Over F10 跳过函数,不进去 你只关心当前函数,不关心子函数细节
Step Out Ctrl + F11 从当前函数跳出,回到调用处 你进错了函数,或者看够了想出来

你想想看,如果你在 main() 里调了一个 HAL_Delay(),按 F10 就直接过去了,按 F11 就会跳进 HAL 库的 Delay 函数里。我一般调试自己写的函数时用 F11,调试库函数时用 F10,省时间。

3.4 全速运行与停止

全速运行就是让芯片按正常速度跑,不受调试器干扰。停止就是让它立刻刹车。

  • 全速运行:按 F5,或者点击工具栏的绿色三角形。
  • 停止:点击红色 Stop 按钮,或者按 Ctrl + F5(这个其实是退出调试,不是单纯停止)。

这里有个小技巧:全速运行时,如果程序卡死了,你可以点 Stop 按钮,调试器会停在当前正在执行的指令处。这时候你就能看到程序到底卡在哪了。我曾经用这招抓到一个死循环,省了整整半天时间。

核心逻辑总结:
调试的本质就是:设断点 → 全速跑到断点 → 单步观察 → 分析问题 → 继续跑或停止。这个循环你熟练了,大部分故障都能定位。

3.5 本章知识体系

下面这张图帮你把本章的核心操作串起来,看一眼就明白调试流程了。

Keil 调试器入门知识体系 Keil 调试器入门核心流程 进入 Debug 模式 设置断点 全速运行 (F5) 单步执行 (F10/F11) 停止 / 退出 Debug 提示 断点不要设在 高频中断里 退出前先全速跑

这张图把调试流程分成了五个关键节点。你从左上角进入,设好断点,全速跑过去,然后根据情况选择单步观察还是直接停止。说白了,调试就是在这几个动作之间来回切换。

3.6 避坑指南

  • 断点数量有限:STM32 的硬件断点一般只有 6 个(F103 系列),设多了会变成软件断点,影响实时性。
  • 不要在延时函数里单步:你按一次 F10,可能就过了几百毫秒,外设状态早变了。
  • 退出调试后记得复位:有时候退出调试,外设寄存器还保留着调试时的值,最好按一下复位键再跑。
我的小建议:刚开始学调试,别急着用高级功能。先把 F5、F9、F10、F11 这四个键练熟,你就已经能解决 80% 的问题了。