1. 引言
在做项目时,百分之三十的时间写代码,还有百分之70的时间用于调试。本期将以Keil为例进行调试章节的讲解,目的在于做出一个标准化的调试步骤,方便大家学习如何调试代码。内容分为基础调试、中级调试及进阶调试三部分,本次主要讲解基础调试。
2. 基础调试
2.1 调试设置
在Keil中,我们通常通过下载调试器进行调试。常见的下载调试器有DAP/Stlink等,本次讲解以Stlink为例。首先,需要点击魔术棒进行设置,点击魔术棒,再点击DeBug--点击红框中的Use,选择Stlink Debugger,同时将其勾选;如下图所示:

接下来点击Utilities--取消勾选use debug driver,如下图所示:

选择Stlink Debugger,如下图所示,最后点击确定。

2.2 调试界面讲解
点击Keil工具栏的 "d"符号进入调试界面(前提是Stlink已经连接板子),如下图所示:

进入后调试界面如下图所示:

接下来介绍一下debug工具栏,如下图所示:

复位:其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代 码会重新从头开始执行。
执行到断点处:该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的, 而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查 看的地方设置了断点。
停止运行:此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止 下来,进入到单步调试状态。
执行进去:该按钮用来实现执行到某个函数里面去的功能,也就是进入函数中去执行每一行语句,这个过程会让你看到。
执行过去:在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个 函数单步执行。
执行出去:该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩 余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位 置。
执行到光标处:该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功 能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。
汇编窗口:通过该按钮,就可以查看汇编代码,这对分析程序很有用。
堆栈局部变量窗口:通过该按钮,显示Call Stack+Locals窗口,显示当前函数的局部变量 及其值,方便查看。
观察窗口:MDK5提供2个观察窗口(下拉选择),该按钮按下,会弹出一个显示变量的窗 口,输入你所想要观察的变量/表达式,即可查看其值,是很常用的一个调试窗口。
内存查看窗口:MDK5提供4个内存查看窗口(下拉选择),该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况。是很常用 的一个调试窗口 串口打印窗口:MDK5提供4个串口打印窗口(下拉选择),该按钮按下,会弹出一个类似 串口调试助手界面的窗口,用来显示从串口打印出来的内容。
逻辑分析窗口:该图标下面有3个选项(下拉选择),我们一般用第一个,也就是逻辑分析 窗口(Logic Analyzer),点击即可调出该窗口,通过SETUP按钮新建一些IO口,就可以观察这 些IO口的电平变化情况,以多种形式显示出来,比较直观。
系统查看窗口:该按钮可以提供各种外设寄存器的查看窗口(通过下拉选择),选择对应外设,即可调出该外设的相关寄存器表,并显示这些寄存器的值,方便查看设置的是否正确。
2.3 基础调试步骤
该调试步骤是笔者个人总结的,仅供参考。首先点击调试,进入调试界面后,此时程序会执行到main函数处,这是因为我们勾选了run to main。
先点击单步调试,点击执行进去或者是点击执行过去,通常点击执行过去可加快调试速度。目的是检查main函数中的各个硬件初始化函数是否正常运行,看有没有卡在哪个初始化函数无法继续往下执行。注意:通常在第一步出现程序卡住的问题大概率是硬件初始化函数的顺序不对,比如说在lcd初始化函数里边调用了串口的printf函数,但是串口初始化函数在lcd初始化函数后边调用,这个时候就会出现程序卡住的情况。
如果需要快速执行到某个地方,可以添加断点,再点击执行到断点处即可。也可以选择不添加断点,直接点击执行到断点处,此时程序会全速运行,此时你看通过stlink连接的板子显示的现象是否与你预期的一致,如果不一致或者是没现象,代表程序卡住了。此时,点击停止,程序会自动定位到代码卡住的地方,方便快速纠错。
2.4 持续更新中....
ps:如有需要MCU+RTOS项目的同学,请联系1840813505@qq.com,备注CSDN。