[STM32]从零开始的STM32 DEBUG问题讲解及解决办法
一、前言
最近也是重装了一次keil,想着也是重装了,也是去官网下载了一个5.41的最新版,在安装和配置编译器和别的版本keil都没太大的区别,但是在调试时,遇到问题了,在我Debug的System Viewer窗口中没有GPIO,IIC,SPI等寄存器。刚遇到的时候还是比较疑惑的,然后去网上找了比较多的资料,发现大部分的办法都是将魔术棒下的Target下方的“Use Custom File”打勾,然后选择一个SFR,听起来是非常简单,但是,我根本就没这个SFR文件啊!当然,这是遇到的第一个Debug中的问题,然后就是,我每次调试一步,箭头走过的地方就变成绿色,代码也会跑到奇怪的地方去。最后就是,代码卡死在汇编的“BX R0”处。以上就是我在使用Debug时遇到的问题,在本次教程中,我会教大家如何一一解决上面的问题,如果你准备好了,那就让我们开始吧!
二、谁适合本次教程
在我之前的教程中,应该告诉过大家,优秀的代码是通过反复的调试得来的,只盯着代码看是很难看出问题的。所以,在嵌入式开发中,调试可以说是一个非常重要的技能。如果你是一名嵌入式小白,你仍然可以收藏本文章,以备不时之需。如果你是一名嵌入式大佬,也可以通过这篇文章拓宽自己的知识面。所以,总的来说,不管你嵌入式基础如何,都可以观看本篇文章,在以后遇到这样的问题以后能够自己进行解决。
三、Debug相关问题及解决方案
上面我也提到了我在调试的时候遇到的三个问题。现在我们就一一来说明问题并且解决问题吧!
1.System Viewer不显示外设寄存器
这个问题是出现在我使用寄存器去配置GPIO口时出现的,因为最近在准备一篇讲解GPIO相关寄存器的文章,我在调试时就发现,我无法在System Viewer窗口找到我要调试的寄存器,具体页面如下:
可以看到,我的System Viewer窗口中只有“Core Peripherals”并没有其它的寄存器,这就非常奇怪。在网络上的方法都是将下面图中的“Use Custom File”的勾上:
然后选择一个SFR文件。我在选择SFR文件的时候,发现我连别的文章中描述的路径都没有更别说这个文件了。后面找了半天,找到了一些svd文件。将这些文件选中以后,发现也不行。
这里从我自己的角度出发,推断问题的话,我认为是我的keil版本太高了所以不存在其它文章中描述的路径和文件。当然,问题已经出了,现在最主要的就是解决问题。现在我们就一起来看看吧!
在寻找了大量的方法之后,找到了一个有效的方法,因为我们不是没有SFR文件吗?那就索性自己生成一个文件。这里生成SFR文件会用到keil内部的一个工具,这里我们先去到keil的安装路径,可以看到以下文件和文件夹:
这里我们是使用原本的SVD文件来生成一个SFR文件,这里先带大家找一下SVD文件在哪儿,这里我们先进入keil安装目录下的“Keil”文件夹:
进来以后,就能看到我们已经安装的芯片包对应的文件夹:
这里每种芯片包对应的调试文件不一样,所以这里大家要找到自己要调试的芯片的文件夹,这里我调试的是STM32F1系列的芯片,所以,我就进入“STM32F1xx_DFP”,进入以后,就能看到一个版本号的文件夹:
进入这个版本号的文件夹就能看到下面的文件和文件夹了:
这里我们进入这个文件夹下的SVD文件夹:
进入以后,就能看到许多SVD为后缀的文件了,并且还分了芯片的型号,这就是我们要找的SVD文件了,后面我们就用这些SVD文件来生成SFR文件:
这里大家记住这个文件夹的路径,等会儿会用到。
然后我们去找生成SFR文件的工具,这里我们去到keil安装目录下的“UV4”文件夹:
进入UV4文件夹以后,我们往下滑找到“SVDConv.exe”文件:
这就是我们用来生成SFR文件的可执行文件了。下面我们来生成以下SFR文件。这里我们就在“SVDConv.exe”文件所在的目录右键打开终端:
这里我们需要在终端中使用“SVDConv.exe”文件。
我们在终端中输入下面的命令:
./SVDConv.exe D:\MDK-ARM\Keil\STM32F1xx_DFP\2.3.0\SVD\STM32F103xx.svd --generate=sfr
这里的“D:\MDK-ARM\Keil\STM32F1xx_DFP\2.3.0\SVD\STM32F103xx.svd”是我SVD文件的路径,大家换成自己的即可。这里要注意“SVDConv.exe”前面的“./”不可缺少。
输入命令回车以后,我们就可以看到一堆日志过去了:
最后我们看到没有错误,就表示转换已经完成了:
我们这里再次回到UV4文件夹中,我们可以看到,相关的SFR文件已经生成在UV4文件夹中了:
为了方便,我们将其剪切到原本存放SVD文件的文件夹中,如图所示:
完成上面的步骤以后,我们启动我们要调试的工程,然后点击魔术棒:
在魔术棒中,我们将“Use Custom File”打勾:
然后在路径选项中,我们将刚刚生成的SFR文件选中进来:
最后点击OK即可:
然后我们启动调试,就能看到“System Viewer”下已经有寄存器了:
这样,我们System Viewer下没有寄存器的问题就解决了。
2.调试箭头走过后框框变为绿色
下面这个问题就是,当我们调试时,箭头走过一个地方以后,我们的箭头一栏的框框变为了绿色,并且代码运行逻辑混乱。这里我们直接看效果:
这里我们可以看到,代码运行过去以后,我们的箭头一栏就变为绿色了而且也不知道代码跑到哪儿去了。
这里的解决办法也比较简单,我们这里还是点击魔术棒:
然后点击“Debug”:
这里我们点击“Use”:
完成上面的步骤以后,我们再次调试就没有问题了:
这样,框框变为绿色的问题我们就解决了。
3.调试时程序卡死在BX R0处
这个问题是我在调试中点击了复位以后遇到的。假如说,我进入调试,然后第一遍将下面的代码调试到了while处:
然后点击“RST”:
代码回到起始,继续调试,就发现代码调试到“BX R0”处就不动了:
我们点击这个“x”,就出现了非常神奇的现象,箭头指向了while:
这就非常神奇了。但是解决办法非常简单。我们结束调试。然后点击“魔术棒”:
这里我们将魔术棒中的“Use MicroLIB”打上勾即可。
最后点击“OK”:
完成上面的步骤以后,我们将代码重新全局编译,然后下载到单片机中。我们再次开始调试,发现就没有上面的问题了,不管我们按几次“RST”代码都可以正常运行:
这样,我们程序卡死的问题就解决了。
四、结语
以前我的教程都比较偏向教程向,但是随着学习的知识越多,遇到的问题也越多,偶尔用自己的文章来记录自己遇到问题以及解决问题的过程,当然,我也希望我的文章能够帮助到大家,那么最后,感谢大家的观看!