Keil调试技巧

发布时间:2026/7/16 9:24:20
Keil调试技巧 一、调试前的准备使用ST-Link将PC和单片机连接以STM32入门教程中的“读写内部FLASH”实验为例使用Keil打开该工程按照下图所示的步骤进行操作如果使用ST-Link仿真器则在第三步选择ST-Link Debugger按照下图所示的步骤进行操作输出选项卡需要勾选调试信息按照下图所示的步骤进行操作代码生成的优化选项中优化等级需要选为0否则Keil在编译程序的过程中可能会过度优化导致编译得到的二进制机器码和C语言代码不是等价的在调试过程中会引起代码执行顺序错乱完成以上步骤后编译程序然后将其下载到单片机中二、Keil调试界面1、调试界面的进入完成上一节的操作后点击下图所示的Debug图标即可进入Keil调试界面2、调试界面介绍1Register栏显示的是单片机核心寄存器的状态。2Disassembly栏显示的是所编译程序对应的汇编代码。3Command是命令行窗口部分特殊操作需要通过命令行实现。4右下角窗口用于显示变量及内存的存储值有多个选项卡供切换。三、程序执行控制1、程序执行控制键1Reset控制单片机回到上电复位的状态并在Reser_Handler处停止运行。2Run控制单片机从当前停止点对应的C代码开始运行程序直到触发停止运行的条件或手动停止运行。3Stop控制单片机停止运行程序代码浏览页面会跳转到停止点。4Step控制单片机从当前停止点对应的C代码开始运行程序并停止在下一条C代码也即只运行一条C代码如果遇到函数调用会转入函数中停在函数开头。5Step Over控制单片机从当前停止点对应的C代码开始运行程序并停止在下一条C代码也即只运行一条C代码如果遇到函数调用会一步跳过不会转入函数即使在执行函数的时候触发了断点。6Step Out控制单片机从当前停止点对应的C代码开始运行程序直到从当前运行的函数中转出或触发停止运行的条件单片机停止运行程序。7Run to cursor line控制单片机从当前停止点对应的C代码开始运行程序直到运行到蓝色光标所指的C代码或触发停止运行的条件单片机停止运行程序。①黄色光标所指的C代码是单片机当前运行的C代码。②蓝色光标所指的C代码是调试员在代码浏览界面选中的C代码。8Show Next Statement将代码浏览界面切换至当前单片机停止处的C代码也即黄色光标所指的C代码只能在内核停止时使用。2、程序断点1在代码浏览区的左侧有一些灰色的区域鼠标左键点击即可在区域对应的代码打上断点当单片机运行到这些代码的时候会触发停止运行的条件。2如果需要取消断点鼠标左键点击它对应的红色圆圈即可取消断点。3按下CTRLB可查看当前在窗口中设置的所有断点。①点击对应的断点代码浏览界面会切换至所点击断点对应的代码处。②Count选项可配置次数当单片机运行断点代码的次数达到Count指定次数后才会触发停止条件这在调试带循环结构的代码块时比较实用。3、访问断点1访问断点它是针对变量而言的如果一个变量被设置了访问断点那么当程序对该变量进行访问时会触发停止条件。2设置全局变量/静态变量访问断点的步骤①在变量查看窗口中右键选中需要设置断点的变量选择“Set Access Breakpoint at ‘变量名’”。②在弹出的断点配置窗口中表达式已经自动生成如果希望在写访问时触发停止条件则勾选“Write”如果希望在读访问时触发停止条件则勾选“Read”选项可以是多选的然后点击“Define”即可。3设置局部变量访问断点的步骤①运行程序使其停止在局部变量所在函数的入口。②在命令行窗口输入“局部变量名”获取局部变量的地址。有时候编译器会将局部变量优化导致的操作数无效也即不存在这个局部变量为了避免这种情况发生在定义局部变量时可以使用volatile关键字强制编译器为其分配内存地址③在弹出的断点配置窗口中表达式输入“变量地址”如果希望在写访问时触发停止条件则勾选“Write”如果希望在读访问时触发停止条件则勾选“Read”选项可以是多选的然后点击“Define”即可。④函数返回后非静态局部变量会被销毁对应内存空间释放相应地访问断点也要删除至少要禁用。4、条件断点1条件断点它也是针对变量而言的如果一个变量被设置了条件断点那么当这个变量等于某个值时会触发停止条件。2设置全局变量/静态变量条件断点的步骤①在变量查看窗口中右键选中需要设置断点的变量选择“Set Access Breakpoint at ‘变量名’”。②在弹出的断点配置窗口中表达式已经自动生成在表达式后面加上“ 停止值”然后勾选“Write”点击“Define”即可这样当变量被写成停止值时内核就会停止运行。3设置局部变量条件断点的步骤①运行程序使其停止在局部变量所在函数的入口。②在命令行窗口输入“局部变量名”获取局部变量的地址。有时候编译器会将局部变量优化导致的操作数无效也即不存在这个局部变量为了避免这种情况发生在定义局部变量时可以使用volatile关键字强制编译器为其分配内存地址③在弹出的断点配置窗口中表达式输入“*(局部变量类型 *)变量地址 停止值”相当于对局部变量地址解引用访问局部变量然后勾选“Write”点击“Define”即可这样当变量被写成停止值时内核就会停止运行。④函数返回后非静态局部变量会被销毁对应内存空间释放相应地条件断点也要删除至少要禁用。四、变量和内存的查看1、局部变量的查看1变量和内存的查看窗口中Call Stack Locals选项卡可以查看整个程序的调用栈可以查看对应函数中的局部变量如果局部变量是结构体变量还能展开查看各个成员的值。2双击局部变量或局部结构体变量成员的值可以对其进行修改按下回车后修改将同步至单片机。2、全局变量的查看1右键选择想要查看的全局变量可以将其添加进对应的窗口中如果窗口不存在则会自动新建如果全局变量是结构体变量还能展开查看各个成员的值。2双击全局变量或全局结构体变量成员的值可以对其进行修改按下回车后修改将同步至单片机。3、内存的查看变量和内存的查看窗口中Memory选项卡可以查看某一块内存的具体情况在输入栏输入想要查看内存的起始地址然后按下回车即可五、逻辑分析仪1、硬件配置1使用Keil的逻辑分析仪功能需要仿真调试器支持TDO/SWO引脚接口部分仿真器可能只有基础的调试引脚并不具备完整的20Pin。2对于STM32F10xxx来说其TDO/SWO引脚的引脚号为PB3其它型号的芯片具体可参考数据手册。2、Debug配置本节使用J-Link连接单片机与PC需要在Keil中按照下图所示进行配置3、Debug的逻辑分析仪1点击Debug图标进入Keil调试界面然后点击逻辑分析仪图标“Logic Analyzer”即可打开逻辑分析仪。2逻辑分析仪只可观测全局变量和静态变量在代码浏览界面中右键选择想要查看的变量可以将其添加进逻辑分析仪窗口中。3点击“Setup..”可以设置示波器的最大值、最小值。