KEIL 调试模式分为软件仿真和在线仿真。所谓软件仿真即用电脑模拟 51 或 32 的工作过程,可以在没有实际单片机开发板存在的情况下进行模拟运行。而硬件仿真则需要实际开发板的支持才能够进行(当然你的电脑也必不可少)。
本节内容以 STM32F103RET6 为例进行介绍,并且使用软件仿真的功能进行模拟,这样的介绍将更全面一些。而硬件仿真可能会在软件仿真的基础上减少一些功能,这些就视具体情况而定了。
不管是软件仿真还是硬件仿真(关于如何配置的问题可参考 STM32 工程模板相关内容),首先都是使用以下按钮进入调试模式(硬件仿真注意连接仿真器,比如 ST-LINK,可以看这章节内容C 语言的程序怎么烧进 STM32 里?):

之后就会进入如下界面:

这个界面和平常的编辑界面有很大不同,增加了不少调试功能。
首先介绍基本的功能:

1、Reset


这个按钮用于将单片机复位的(类似于用复位按键复位),复位之后程序回到最开始处,即复位中断处理函数处:

如果说你想让单片机在进入调试模式后直接运行到 main(),那么你可以在退出调试模式的情况下设置这个:

这样程序将自动在 main 的第一条指令停止(在此之前的代码自动运行完了):

注意:黄色光标指向的语句是准备执行的语句,但还没开始执行。

2、Run(F5)


使用这个按钮将使程序一直处于运行状态,直到代码运行到你设置的断点才会停止(设置的断点有可能在汇编位置,注意查看)。
进入全速运行后,全速运行按钮变成灰色,而旁边的按钮将显示为红色,用于停止全速运行(此时程序将停在当前执行的代码里面):

3、Step(F11)


这个按钮用于单步调试。注意这里的单步是汇编层面上的,而不是 C 语言层面:

这也就意味着将一步一步的执行每一条汇编指令,从另一个角度看,就是它能够深入到每一个函数内执行,对于精确定位代码很有帮助。

4、Step Over(F10)

如果你不想深入到每一个函数内(比如延时函数,你不可能一直在那单步运行吧),那么使用该按钮是不错的选择:

使用这个调试按钮将直接跳过函数执行(不是说这个函数不执行,而是它能快速执行完这个函数体,并准备执行下一条语句),这样就可以节省不少按钮点击次数。

5、Step Out(CTR+F11)

当你不幸进入了函数内执行,怎么办,就是使用这个按钮了:

这个按钮能快速执行完当前函数的剩下语句,然后跳出该函数体,准备执行下一条语句。

6、Run to Cursor Line(CTR+F10)

如果你觉得打断点太麻烦了,那么就试试这个按钮,这个按钮能直接运行到你的光标处(当然光标指示的语句还没开始运行呢)。

按下按钮的效果就是这样(注意黄色光标位置和蓝色光标一样了,已经重合了):

7、Show Next Statement

文件切来切去,发现不知道现在的代码运行到哪里去了,怎么办?那试试这个光标。即使你把当前运行代码的源文件关闭了,使用它之后也会自动打开源文件,然后定位光标,相当方便。

8、Nevigate

使用 F12 跳转挺方便的,那怎么跳回去呢?就是这两个按钮了,往前往后跳就随你意了,不过这个跳转次数有限,别跳转太多哦。

9、Bookmark

如果使用 Nevigate 不是很方便的话,那么试试书签如何?

这个可以

10、Breakpoint

如果你希望程序运行到某一段代码的时候停下来(断点位置还未执行),那么这些按钮将实现你的要求(当然你的配合前面的代码运行按钮)。

当然断点设置可以直接在代码的左边位置直接设置:

11、搜索

有没有搞错,搜索也属于调试范畴?对我来说还真是。搜索的快捷键 CTRL+F,替换是 CTRL+H。
很多时候你并不能找到一个标志符或者变量在哪里使用了,那么试试搜搜功能吧。它能搜到工程内所有你想要的符号。

注意,搜索区域可以设置范围,可以通过以下选项选择你的搜索区域。

12、Commd

这个是命令输出窗口,如果你在调试过程中遇到问题了,那么看看这个窗口给你输出了什么信息吧!