仿真与调试

Keil作为一个有很大潜力的仿真软件功能,可以通过debug可以很快的解决代码运行出现的问题,以及确定问题所出现的位置,查看很多硬件相关的寄存器,通过观察这些寄存器值的变化可以知道代码有没有正常运行。这样可以避免频繁下载程序,延长单片机Flash寿命。

本教程使用STLINK来仿真,如果没有硬件设备,需要自行购买。

Keil5基本的仿真调试操作分两步:

一、软件配置

点击魔法棒,选择Device中的STM32F103RC型号芯片

image-2023031600001

选择Debug中的仿真器,我使用的是STLINK,如果使用JLINK或其他仿真器可以自行更换。

image-2023031600002

点击Setting之后,到设置界面选择SW模式,如果硬件正常,接线也没问题的情况下,会自动识别出一个设备号。

image-2023031600003

上诉配置完成后点击确认,就可以开始debug。

二:debug操作

image-2023031600004

Debug工具条介绍,介绍顺序自左向右:

image-2023031600005

1:复位

复位顾名思义便是重新、从头开始呗,其功能等同于硬件上按复位按钮,相当于实现了一次硬复位。按下该按钮后,代码会重新从头开始执行。

2:执行到断点处

按下该按钮可以快速执行到断点处,有时候并不需要观看每步是如何执行的,仅仅想快速执行到程序的某个地方看结果,按下这个按钮就可以满足你的愿望,当然前提是已在查看的地方设置了断点。

3:停止运行

该按钮在程序一直执行的时候才变为有效,可以使程序停止下来进入到单步调试状态。瞬间使程序为停止状态。

4:单步调试(进入函数)

简单来说,该按钮是进入到某个函数中去,当然在没有函数的情况下相当于执行过去按钮。

5:逐步调试(跳过函数)

在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数单步执行。简而言之,就是跳过该函数不执行。

6:跳出调试(跳出函数)

该按钮是进入了函数单步调试的时候,有时候可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数回到函数被调用的位置。

7:执行到光标处

该按钮可以迅速使程序运行到光标处,与执行到断点处按钮功能类似。

8:显示正在执行的代码行

以下为调试模式增加菜单

9:命令显示窗口

10:反汇编窗口

通过该按钮可以查看汇编代码,这对分析程序很有用。

11:模块窗口

12:寄存器窗口

13:被调用函数堆栈窗口

通过该按钮可以显示Call Stack+Locals窗口,显示当前函数的局部变量及其值,方便查看。

14:查看(变量)窗口

MDK5提供2个观察窗口(下拉选择),该按钮按下则弹出一个显示变量的窗口。输入想观察的变量或表达式,即可查看其值,是很常用的调试窗口。

15:内存窗口

MDK5提供4个内存查看窗口,按下按钮,则弹出一个内存查看窗口,可以在里面输入要查看的内存地址,然后观察这一片内存的变化情况。

16:串行UART窗口

MDK5提供4个串口打印窗口。按下该按钮,则弹出一个类似串口调试助手界面的窗口,用来显示从串口打印出来的内容。

17:逻辑分析仪窗口

该图标下面有3个选项,一般用第一个,也就是逻辑分析窗口。通过SETUP按钮新建一些IO口,于是可以观察这些IO的电平变化情况,并以多种形式显示出来,比较直观。

18:跟踪窗口

19:系统(外围IO、USART、TIM等)窗口

该按钮可以提供各种外设寄存器的查看窗口(通过下拉选择),选择对应外设即可调出该外设的相关寄存器表,并显示这些寄存器的值,方便查看设置是否正确。

20:工具箱窗口

常见调试操作:

1.添加观察窗口

为所观察的变量添加观察窗口(光标定位到变量上,右键选择Add"start_flag to..."------>Watch1)

image-2023031600006

2.设置断点

设置断点后可以单步调试,观察程序运行结果

image-2023031600007

一般程序运行不报错,但是没有下载后没有观察到对应的效果,可以从主函数的开始设置断点,看有没有按照预期效果,执行到对应的函数,变量的变化是否和预期一致,更多调试的方法可以百度学习。