Keil5-debug仿真教程
一、学习目的
Debug 是指在软件开发过程中,通过识别和解决问题来调试程序的过程。通常需要找出程序中的错误、异常或潜在问题,并修复它们以确保程序的正确性和稳定性。
常见的debug方法有三种:
==硬件调试==:通过LED灯、蜂鸣器等能使人员感知到的器件,利用其交互性进行调试。
==打印调试==:使用串口(Printf),能将数据信息发送的方式,追踪程序运行状态。
==调速器调试==:利用设备支持的硬件内部运行状态追踪功能调试,大部分单片机都支持调试器调试,如STM32配合ST-Link,DAP-Link,fireDAP等调试工具。
目的: 众所周知,硬件调试过于复杂,需要单独写一段初始化代码,所以不经常使用;而打印调试需要在源代码中加入大量 <printf>,极易引起代码混乱。以上两者方法调试效率低下,因此作为一名嵌入式工程师掌握调试器调试必不可少。
二、keil5-debug 步骤
(1)正确连接烧录器
DAP-Link | ST-Link | Stm32单片机 |
---|---|---|
SCK | SWCLK | SCK |
SWD | SWDIO | DIO |
3V3 (5V) | 3V3 (5V) | VCC (5V) |
GND | GND | GND |
(2)设置 keil5-Options-Debug选项
- 选择ST-link或者DAP-Link;
- 勾选“Load Application at Startup” 和 Run to main();
- 打开“Setting”并确定。
- 检查SWDIO是否连接成功;
- “Port” 设置为 “SW”,“Connect” 设置为 “Normal”,“Reset” 设置为 SYSRESETREQ(Default);
- Max Clock 设置低于10M;
- 点击确定。
- 选择Flash DownLoad 中的 “Reset and Run”;
- 检查是否添加Flash编程算法;
- Utilities 选择 “St-link Debugger” 或者 “DAP-Link Dabugger”,勾选 “Update Target before Debugger”;
- 设置完毕后点击确定。
(3)开始调试
单击窗口上的调试按钮快捷图标(上图红色框内图标),进入到软件模拟调试模式。
(4)调试工具栏介绍
1 | 复位 | 对程序进行复位操作,根据烧录器不同的复位方式配置会触发不同的复位类型 |
---|---|---|
2 | 全速运行 | 使当前程序开始正常全速运行,直到程序遇到断点时停止 |
3 | 单步调试 | 根据当前调试的窗口的语言,执行单条语句。如果遇到函数,则会进入函数内部。如果是在反汇编窗口中,则只执行一条汇编指令 |
4 | 单步跳过调试 | 如果是在C语言窗口中,则是按单条语句执行,与单步调试不同的是,遇到函数不会进入函数内部,而是直接全速运行函数,并跳到下一条语句 |
5 | 单步返回调试 | 如果是在C语言窗口中,则是按单条语句执行,与单步调试不同的是,遇到函数不会进入函数内部,而是直接全速运行函数,并跳到下一条语句 |
6 | 运行到当前光标 | 程序直接运行至当前光标所在行 |
7 | 插入/移除断点 | 如果当前光标所在行未有断点,则插入断点,在有断点的情况下则是移除断点,插入断点后,当前行前面会有个红圆表示断点位置。(断点最多只能打7个) |
8 | 使能/禁止断点 | 开启或禁止当前光标所在行的断点。禁止后红圆变成白圆。 |
9 | 禁止所有断点 | 禁止当前所有的断点 |
10 | 删除所有断点 | 删除所有断点 |
停止全速运行(上图红色框内图标),全速运行程序时激活该按钮,用来停止正全速运行的程序。
(5)全局变量查看(Watch1 和 Watch2)
通过”View->Watch Windows->Watch1、Watch2”可以选择打开Watch窗口,也可以在工具栏打开。
通过选中一个变量,右键添加入对应的Watch窗口,可以追踪查看当前变量的变化状态。注意,只有全局变量可以全程监视,临时变量只有在进入当前函数中才可监视到其数据,用static关键词修饰的变量无法监视。
如果当前变量没有实时更新,则需要点击”View->Periodic Window Update”将其勾选上。
(6)局部变量查看(Call Stack Window)
这个窗口可以查看函数内部局部变量的栈空间,也可以查看当前程序调度关系,当出现有进入硬件错误异常调试时可以快速定位到是哪里触发的异常。
(6)逻辑分析窗口(Analysis Windows)
这个窗口只能在软件模拟仿真中使用,如果使用硬件调试,需要硬件支持,如下是逻辑分析窗口介绍。
(7)内存查看窗口(Memory)
通过”View->Memory Windows->Memory1/2/3/4”打开Memory窗口,也可以通过工具栏打开。此窗口可以用来查看各变量的内存地址和RAM地址。
(8)寄存器窗口(Register Window)
![image.gif]
这个窗口用于查看当前内核的相关寄存器,如汇编里常说的15个通用寄存器。
(9)断点调试
- 设置断点;
- 点击全速运行;
- 查看代码光标是否运行到断点位置,如果运行至断点结束则说明前面代码正常运行;
- 如果代码无法运行至断点则说明前面代码出现卡死现象异常或者断点设置异常;
- 接着从最有可能卡停位置进行单步调试,适当观察全局变量和局部变量是否正常改变,直至找到bug;
- 也可以利用逻辑分析仪观察对应IO口的电平变化,从而了解问题所在。