系列文章目录
文章目录
1. 打开调试
在Keil中有两种调试模式:在线调试和调试器仿真(ST-Link)。如果不了解如何使用ST-Link,可以看一下下面的文章:
首先先点击魔术棒,点击Debug,这里要注意,左边的Use Simulator 是在线仿真,不需要连接ST-Link 和STM32,图片中勾选的就是在线仿真。如果想使用实物ST-Link进行调试,勾选右边的Use。
接着点击Debug按钮进入调试模式(Ctrl + F5)
接着就会加入调试仿真界面
2. 调试界面
进入调试界面后,会看到下面的画面
-
菜单栏和工具栏:提供了各种命令和工具的快速访问,包括编译、构建、调试控制(如启动、停止、单步执行等)以及访问Keil的各种功能。
-
主界面窗口设置:包含打开和关闭各种窗口,下面会详细解释。
-
调试模式的启动/关闭
-
断点设置:设置、取消、关闭、删除所有断点等操作。在这个区域,你可以设置、删除或禁用断点。断点是调试过程中的一个关键部分,允许你停止程序的执行以检查变量的值或程序的行为。
-
寄存器窗口:显示当前CPU寄存器的值,这些寄存器包含了执行状态、指针、地址和一些重要的硬件信息。
-
C代码对应的汇编程序窗口:代码左侧灰色部分代码已编译部分,可设置断点(此部分可以查看代码是否编译或者是否被编辑器优化)
-
代码窗口:工程C语言源代码
-
Command窗口:调试命令行,可通过设置命令执行所有调试操作,如断点设置、变量寄存器访问、数据转换、基本计算等功能。通常也显示编译器或调试器的输出信息,比如错误消息、警告和打印输出。
-
调用栈和局部变量窗口:显示了当前函数调用的层次结构和调用栈,以及当前函数中局部变量的值。
3. 调试操作
从左到右依次是:
复位 - 全速运行 - 停止 - 单步运行 - 单行运行 - 跳出函数体 - 运行到光标处 - 跳转PC指针
-
复位按钮:用于重置微控制器。点击这个按钮会使目标硬件复位,通常相当于硬件上的复位按钮或者电源重启。
-
全速运行/继续执行:开始或继续执行程序。如果程序已经停在一个断点上,点击这个按钮将继续执行程序直到遇到下一个断点或程序结束。也就是说如果没有断点,程序会一直运行。
-
停止执行:停止程序执行。这个按钮将中止当前正在运行的程序。
-
单步执行:执行程序中的下一行代码。如果当前行调用了函数,IDE将进入该函数内部。
-
单步跳过:执行下一行代码,但是不进入函数内部。如果当前行调用了函数,IDE将执行整个函数,然后停在下一行。也就是说,如果在主函数中使用这个功能,会一直停留在主函数页面运行每一行代码,不会调转到其他函数中去。
-
单步退出:当运行在函数内部时,这个按钮将执行完当前函数的剩余代码,并停在返回点之后的下一行。
-
运行到光标位置 :程序执行将继续进行,直到到达当前代码编辑器中光标所在的行。
-
跳转PC指针:这个按钮允许你在调用栈中上移一级,这对于检查函数调用的历史和来龙去脉很有用。
4. 窗口功能
从左到右依次是:
命令行 - 反汇编窗口 - 符号窗口 - 内核寄存器 - 回调栈及局部变量 - 变量显示 - 内存窗口 - 虚拟串口 - 系统分析窗口 - TRACE窗口 - 外设寄存器
- 命令行:它显示与调试会话相关的信息,包括用户输入的调试命令和由调试器返回的消息。它允许用户直接输入命令,例如管理断点、控制程序执行等。
- 反汇编窗口:显示当前执行的汇编代码,与源代码视图同步,有助于理解C/C++代码是如何转换为处理器指令的,以及在调试时实际执行的指令。
- 符号窗口:列出了所有编译后的符号,包括函数、变量和类型定义。这个窗口让你可以确认是否有符号未定义或检查变量的地址和值。
- 内核寄存器:显示处理器内核的寄存器值。有助于理解程序的当前状态和执行流程,尤其是在硬件层面的调试中。
- 回调部变量:当调试时停留在断点时,这里会显示函数的调用关系,以及压进的变量值,可以在这里看到函数的调用关系和传递给函数的参数值。这个一般和断点配合,反推异常调用以及查看局部变量,无需使用变量查看串口。
- 变量显示:用于查看单片机中某个变量的值,一般多用于查看全局变量以及外设寄存器数值、表达式显示变量,也可直接操作变量值。
- 内存窗口:显示内存地址以及地址处内存的数据,一般可查看变量以及寄存器数据、函数地址等
- 虚拟串口窗口:如果程序使用了串口(例如USART),此窗口将显示由模拟器重定向的串口输出。
- 系统分析窗口:提供高级的代码性能分析功能,例如代码覆盖率、执行时间分析等。软件逻辑分析仪功能也包含在这里。
- TRACE窗口:如果硬件支持,此功能允许实时跟踪指令执行,以及程序的行为和性能分析。
- 外设寄存器窗口:显示和控制单片机外设寄存器的状态,可以在这里查看和修改外设寄存器的值,如定时器、串口等的配置和状态。
5. 实时查看变量值
选择需要查看的变量,例如这里选择temp变量。
右击选中“Add 'temp[0]' to... ”的变量, 接着选择watch1,watch2都可以。
右上方会自动打开窗口,窗口中的值为当前变量值,后面一列是变量的数据类型。
在窗口中右击,可以选择显示类型是十进制还是十六进制,图片中没有勾选Hex显示(16进制禁止) ,就是以十进制显示。
如果想查看数据的实时值,在上方菜单栏中找到view,如图所示,选中Periodic Window Update(实时显示串口)。
5. 寄存器查看与操作
这里注意,有三种方法使用这个功能:
网上大多数的方法是进入调试界面后, 点击"Peripherals" 然后在System Viewer中打开想要查看的寄存器,但如果只有一个"core Peripherals", 没有其他寄存器,就是一些后面两个方法。
1. 点击"Peripherals",然后选择要查看的寄存器名称。
2. 在上方菜单栏点击"View->System Viewer", 然后选择要查看的寄存器名称。
3. 点击"View->Watch Windows",如下图所示:打开watch1 watch2 都可以
想查看谁的数值就直接在第一列输入就可以,例如还是想查看 Temp 的值,输入Temp就可以了。
6. 断点详解
Keil5中调试断点有三种类型:存取断点,执行断点,条件断点。
存取断点:某一个变量度或者写操作时执行断点操作。
执行断点:执行到代码某个位置时产生断点操作。一般直接在代码左侧打的断点就是此类断点。
条件断点:当满足某个表达式时,如某个变量==0x01时执行断点。
除了执行断点是直接在代码左侧设置执行断点外,其余断点需要通过断点管理窗口来实现。在上方菜单栏点击Debug,再点击Breakpoints (Ctrl + B)
打开后看到下面的窗口:
Current Breakpoints:这里显示目前所有的断点。
Expression:表达式为某个函数地址时为执行断点。无论是存取断点还是条件断点,都需要设置。
Count:表示执行次数,无论是存取断点还是条件断点,都需要设置。
Command:输入条件指令。这部分为条件断点,如变量等于或大于某个值时,执行printf指令打印变量值。注意此处的printf仅输出到调试界面的Command窗口。command指令的执行并不会使程序中断停止,相当于此处为软件断点。
Access:Size表示存取变量的字节大小,Bytes与Objects的区别在于单一变量与结构体的不同。这部分为存取断点,当存取某个变量或者结构体中某个成员时使用Bytes,存取某个结构体时使用Objects。