目录
[1. 仿真方式](#1. 仿真方式)
[2. 编译](#2. 编译)
[3. 调试](#3. 调试)
[3.1 控制程序运行](#3.1 控制程序运行)
[3.2 窗口](#3.2 窗口)
[3.3 菜单栏](#3.3 菜单栏)
[3.4 其他](#3.4 其他)
一、Keil调试模式
大家之后遇到一些复杂的问题,可以考虑一下这个Keil调试模式,说不定就能很方便的解决你的问题。
换一个【3-1 LED闪烁】的工程作为例子。
右键main.c关闭其余窗口。

1. 仿真方式
点击工程选项。

Debug这里可以对调试选项进行配置。这里默认是选择右边ST-Link这一项,这个是在硬件上在线仿真。需要我们把ST-Link和STM32都连接好。

如果你不想连接硬件,也可以选择左边的使用仿真器这个选项。这样就是电脑模拟STM32的运行了。

在此,我们选择右边的硬件在线仿真。然后点击OK。

2. 编译
首先在进入调试模式之前,需要先连接好STM32,之后编译一下,确保工程没有问题。
编译。

编译是没有问题的。

插上ST-LINK。
3. 调试
然后点击这里的放大镜里面带一个d的图标,进入调试模式。


在这个界面里,主窗口就是我们的c语言程序。

上面这个窗口就是c语言翻译成的汇编程序。感兴趣的话,可以对照这里看一下每句c语言实际上都执行了哪些操作。

左边窗口是寄存器组和状态标志位等信息。这个是单片机硬件底层很重要的东西。如果用汇编编程的话,这些东西都是必须要非常清楚的。但如果用的是c语言,那这些东西就不用管了。

3.1 控制程序运行
左上角这部分是控制程序运行的。

第一个是复位。
第二个是全速运行。
第三个是停止全速运行。
第四个单步运行。
第五个跳过当前行单步运行。
第六个跳出当前函数单步运行。
第七个跳到光标指定行单步运行。
我们可以试一下,这个黄色箭头指示的就是下一句将要执行的代码。当前的程序就是从main函数开始的。

我们点一下:单步运行。

那它就执行到了下一行代码。

再点击:单步运行。

就进到了RCC这个函数里面来了。

点击:跳出函数。

就可以跳到函数外面来了。

点击这一行(第27行)。

再点击:运行到光标指定行。

程序就运行到第27行这个位置了。

点击程序左边这里深灰色的区域,设置断点。

然后点击:全速运行,程序就会一直运行,直到断点停下。


消掉断点,再点击:全速运行,程序就不会自动停下。需要点击停止按钮,程序就会停下来了。

目前程序停在了Delay_us函数里面。

点击RST复位。程序就会回到最开始的地方。

现在程序是在启动文件的复位中断函数里,说明复位后,程序是从这里开始执行的。

点击:单步运行。


再次点击:单步运行。

首先程序会跳到SystemInit函数里。

再次点击:单步运行。


点击:跳出函数。


点击:单步运行。


点击:单步运行。

应该就会执行main函数。

但它突然停不下来了。

点击:停止。

点击:复位。

指定的main函数。

点击:直接运行到当前行。

程序执行到了这一行,然后停下来了。

这就是调试模式下控制程序运行的方法。这个方法可以精确追踪我们的程序是如何运行的,如果你不清楚程序是如何一步步运行的,那在这个调试模式里单步运行探索一下,相信你对程序的运行逻辑就会有更深的理解。
当然这只是调试模式下的一小部分功能,调试模式还有更强大的功能。
3.2 窗口
接着我们来看一下上面的这一堆功能。

第一个是命令窗口,点击它可以打开和关闭命令窗口。(最下面)

第二个是反汇编窗口,也是可以打开和关闭的。(最上面)

第三个是符号窗口,在这里我们可以实时查看程序中所有变量的值。(最右边)

把符号窗口拉开。

比如我想看一下这个GPIO_InitStructure结构体的值,那就可以在这个符号窗口里找一下。main函数这里就可以看到这个GPIO_InitStructure结构体变量,里面可以看到结构体的三个成员。

如果想看一下GPIO_InitStructure结构体值的变化,可以在GPIO_InitStructure上右键,添加到Watch 1窗口。

右下角出现Watch 1窗口。

拉开Watch 1窗口,在这里就能看到结构体的值了。

点击:跳过当前行单步运行。

就能看到这个变量值的变化了。


点击:跳过当前行单步运行。



点击:跳过当前行单步运行。



点击:跳过当前行单步运行。



点击:跳过当前行单步运行。



串口显示、
逻辑分析仪等等。这些工具的功能也都是非常强大的,大家可以自行了解一下。
3.3 菜单栏
点击菜单栏中的外设------系统资源查看。这里就可以看到所有的外设寄存器。

比如我们选择GPIOA。

右边会显示GPIOA外设的所有寄存器。

程序是固定交替设置 PA0 为低电平(亮灯)和高电平(灭灯)。

我们就可以看一下ODR寄存器,选择ODR0,这个就是PA0 的输出数据寄存器。

点击:全速运行。

可以看到,这个ODR0是实时显示输出寄存器的变化的。一闪一闪的。

我们在面包板上插上一个LED。观察LED灯珠的内部电极,较小的一端通常是正极。LED正极与电源正极相连,LED负极与PA0相连。

可以看到STM32也是在实时执行程序的。
STM32实时执行程序
我们点停止。

STM32的程序停止运行。


点击:全速运行。

STM32程序继续执行。虽说实时变化会有一些延迟,但这个在线调试的功能还是非常强大的。
STM32实时执行程序,Keil软件实时显示外设寄存器状态,还能随时控制程序的开始、停止、单步运行。所以以后遇到一个比较难调的程序,比如不清楚程序是如何执行的,或者想要看一大堆变量却不方便显示的,或者想看一下计算器是不是配置正确了,都可以考虑一下使用这个Keil软件自带的调试模式。
最后再说明一下,如果你想修改程序的话,是不能直接在这个调试模式下修改的。修改程序得先退出调试模式。点击调试按钮,退出调试模式,修改程序。

重新编译,再进入调试模式。
3.4 其他
这个软件更多的功能还得需要大家自己慢慢探索了。探索的方法:
(1)浏览器搜索一下各个功能是怎么用的;
(2)点菜单栏的Help的第一项。

这里可以打开Keil软件的官方帮助文档,这个帮助文档里有对这整个软件最权威最细致的介绍。
如果你对某个功能不熟悉的话,可以在这里找一找。