前面的章节讲解了STM32的新建工程到编译下载,接下来将讲解STM32的调试。
6 OpenOCD
OpenOCD是用于对STM32进行下载仿真的工具,是一个开源软件包。
OpenOCD下载地址
6.1 OpenOCD安装
下载后解压即可。
打开share/openocd/scripts,里面有很多提前写好的配置文件:
其中interface目录下都是接口相关配置文件,例如jlink.cfg,stlink.cfg;target目录下都是芯片相关的配置文件,例如stm32f1x.cfg。
然后配置下环境变量:
然后在命令窗口中输入下面的命令验证安装是否成功:
然后在命令窗口中输入下面的命令验证安装是否成功:
6.2 OpenOCD配置
6.2.1 launch.json文件
在vscode文件夹中新建一个launch.json,该文件是调试的入口文件。内容如下:
{
"version": "0.2.0",
"configurations": [
{
"cwd": "${workspaceRoot}",
"type": "cortex-debug",
"request": "launch",
"name": "Cortex Debug",
"interface": "swd",
"servertype": "openocd",
"executable": "./build/YS_STM32.elf",
"runToMain": true,
"device": "STM32F103ZE",
"svdFile": "./STM32F103xx.svd",//svd文件,有这个文件才能查看寄存器的值
"configFiles": [
"${workspaceRoot}/openocd.cfg"
],
"preLaunchTask": "build",
"armToolchainPath": "D:/gcc/gcc-arm-none-eabi-10.3-2021.07/bin/"
}
]
}
executable:编译出的二进制文件,也就是最终烧录到单片机中的,这里是elf文件。根据芯片的不同,可能产生不同的名称和后缀(例如TI的TM4C123芯片编译出来的名称是"main.axf")
request:可以选launch或attach。launch是指启动调试时同时开始执行程序;attcah是指程序已经在运行了,然后开始调试。我没测试过attach。
type:调试的类型,选cortex-debug,这是我们装的插件。其实也可以填cppdbg之类的,但是那样我们就得自己配置gdb了,配置起来将会非常麻烦。
device:目标芯片。如果你使用J-LINK GDB Server时必须要设置这个选项。
svdFile:svd文件的路径,每个MCU的各不相同。
servertype:要选择的gdb server。我这里用openocd。
configFiles:gdb的配置文件路径。openocd会自动读当前目录下的openocd.cfg文件,这个选项不填也行。但是如果你想把openocd.cfg放在别处,就可以用这个选项指定配置文件的路径。
preLaunchTask:在启动调试前,预先执行的任务。
armToolchainPath:工具链的路径。
launch.json参考
6.2.2 openocd.cfg文件
在项目文件夹下新建一个openocd.cfg文件,用于配置调具体的调试器。内容如下:
# 选择调试器为jlink
#source [find interface/jlink.cfg]
source [find interface/stlink.cfg]
# 选择接口为SWD
#transport select swd
# 选择目标芯片
source [find target/stm32f1x.cfg]
我这里选择使用ST-Link,SWD接口,目标芯片为stm32f1x。
【注】使用J-link调试也是一样的,只需将openocd.cfg文件配置成J-link调试即可。
6.2.3 svd文件
用于寻找STM32F1的svd文件。CMSIS-SVD是CMSIS的一个组件,它包含完整微控制器系统(包括外设)的程序员视图的系统视图描述 XML 文件。VS Code可以通过它来知道外设寄存器的地址分布,从而把寄存器内容展示到窗口中。
svd文件地址
将下载好的STM32F103xx.svd文件放在项目文件夹根目录即可。
6.3 Cortex-Debug调试
直接按F5,openocd启动时,会自动在当前目录下寻找名为openocd.cfg的文件作为配置文件。调试界面如下:
界面左边可以看到变量窗口、调用堆栈等。窗口中间就是单步调试的各个按钮。这个就没啥好说的了,赶紧去玩起来吧。
【注】调试STM32报错init mode failed解决方法
错误提示:
Error: init mode failed (unable to connect to the target)......OpenOCD init failed 解决办法:
将 Debug Mode 重新选择为 Serial Wire,如下图所示。
6.4 GDB调试
除了使用Visual Studio Code自带的调试工具外,还可以使用GDB调试,
首先在终端输入一下命令:
#openocd -f interface/stlink.cfg -f target/stm32f1x.cfg
【注】如果不带参数启动,openocd就会自动查找当前目录下有没有名为openocd.cfg的文件,并把它作为配置文件来启动。
【注】openocd默认TCP/IP的3333端口作为gdb端口,4444作为telnet端口。在连接gdb之前,我们可以先用telnet连上试用一下。
如果你的电脑没有开启telnet功能,需要打开“启用或关闭Windows功能”,然后在里面找到“telnet客户端”,启动即可。
openocd运行时,这个终端就被占用了因此还需要再开一个终端。
GDB也属于GNU项目的一部分,跟在Linux上调试是一样的,只是这里使用的是交叉编译工具中的GDB。
# arm-none-eabi-gdb build/YS_STM32.elf GDB常用命令如表所示。
关于GDB的使用请看笔者文章:
https://bruceou.blog.csdn.net/article/details/88634967
接下来需要连接openocd服务,openocd给GDB的TCP/IP端口是3333。
# target remote localhost:3333 接下来和在Linux中调试一样。
在 gdb 中键入"l"(list)就可以查看所载入的文件,如下所示。
自行参考笔者关于GDB的博文去调试吧。
【注】J-link调试须知
在使用J-link调试之前,需要将J-link的驱动改为libu***,否则openocd无法连接到J-link。这里使用的工具是U***DriverTool。
U***DriverTool下载地址
使用功能方法如下:
前面的章节讲解了STM32的新建工程到编译下载,接下来将讲解STM32的调试。
6 OpenOCD
OpenOCD是用于对STM32进行下载仿真的工具,是一个开源软件包。
OpenOCD下载地址
6.1 OpenOCD安装
下载后解压即可。
打开share/openocd/scripts,里面有很多提前写好的配置文件:
其中interface目录下都是接口相关配置文件,例如jlink.cfg,stlink.cfg;target目录下都是芯片相关的配置文件,例如stm32f1x.cfg。
然后配置下环境变量:
然后在命令窗口中输入下面的命令验证安装是否成功:
然后在命令窗口中输入下面的命令验证安装是否成功:
6.2 OpenOCD配置
6.2.1 launch.json文件
在vscode文件夹中新建一个launch.json,该文件是调试的入口文件。内容如下:
{
"version": "0.2.0",
"configurations": [
{
"cwd": "${workspaceRoot}",
"type": "cortex-debug",
"request": "launch",
"name": "Cortex Debug",
"interface": "swd",
"servertype": "openocd",
"executable": "./build/YS_STM32.elf",
"runToMain": true,
"device": "STM32F103ZE",
"svdFile": "./STM32F103xx.svd",//svd文件,有这个文件才能查看寄存器的值
"configFiles": [
"${workspaceRoot}/openocd.cfg"
],
"preLaunchTask": "build",
"armToolchainPath": "D:/gcc/gcc-arm-none-eabi-10.3-2021.07/bin/"
}
]
}
executable:编译出的二进制文件,也就是最终烧录到单片机中的,这里是elf文件。根据芯片的不同,可能产生不同的名称和后缀(例如TI的TM4C123芯片编译出来的名称是"main.axf")
request:可以选launch或attach。launch是指启动调试时同时开始执行程序;attcah是指程序已经在运行了,然后开始调试。我没测试过attach。
type:调试的类型,选cortex-debug,这是我们装的插件。其实也可以填cppdbg之类的,但是那样我们就得自己配置gdb了,配置起来将会非常麻烦。
device:目标芯片。如果你使用J-LINK GDB Server时必须要设置这个选项。
svdFile:svd文件的路径,每个MCU的各不相同。
servertype:要选择的gdb server。我这里用openocd。
configFiles:gdb的配置文件路径。openocd会自动读当前目录下的openocd.cfg文件,这个选项不填也行。但是如果你想把openocd.cfg放在别处,就可以用这个选项指定配置文件的路径。
preLaunchTask:在启动调试前,预先执行的任务。
armToolchainPath:工具链的路径。
launch.json参考
6.2.2 openocd.cfg文件
在项目文件夹下新建一个openocd.cfg文件,用于配置调具体的调试器。内容如下:
# 选择调试器为jlink
#source [find interface/jlink.cfg]
source [find interface/stlink.cfg]
# 选择接口为SWD
#transport select swd
# 选择目标芯片
source [find target/stm32f1x.cfg]
我这里选择使用ST-Link,SWD接口,目标芯片为stm32f1x。
【注】使用J-link调试也是一样的,只需将openocd.cfg文件配置成J-link调试即可。
6.2.3 svd文件
用于寻找STM32F1的svd文件。CMSIS-SVD是CMSIS的一个组件,它包含完整微控制器系统(包括外设)的程序员视图的系统视图描述 XML 文件。VS Code可以通过它来知道外设寄存器的地址分布,从而把寄存器内容展示到窗口中。
svd文件地址
将下载好的STM32F103xx.svd文件放在项目文件夹根目录即可。
6.3 Cortex-Debug调试
直接按F5,openocd启动时,会自动在当前目录下寻找名为openocd.cfg的文件作为配置文件。调试界面如下:
界面左边可以看到变量窗口、调用堆栈等。窗口中间就是单步调试的各个按钮。这个就没啥好说的了,赶紧去玩起来吧。
【注】调试STM32报错init mode failed解决方法
错误提示:
Error: init mode failed (unable to connect to the target)......OpenOCD init failed 解决办法:
将 Debug Mode 重新选择为 Serial Wire,如下图所示。
6.4 GDB调试
除了使用Visual Studio Code自带的调试工具外,还可以使用GDB调试,
首先在终端输入一下命令:
#openocd -f interface/stlink.cfg -f target/stm32f1x.cfg
【注】如果不带参数启动,openocd就会自动查找当前目录下有没有名为openocd.cfg的文件,并把它作为配置文件来启动。
【注】openocd默认TCP/IP的3333端口作为gdb端口,4444作为telnet端口。在连接gdb之前,我们可以先用telnet连上试用一下。
如果你的电脑没有开启telnet功能,需要打开“启用或关闭Windows功能”,然后在里面找到“telnet客户端”,启动即可。
openocd运行时,这个终端就被占用了因此还需要再开一个终端。
GDB也属于GNU项目的一部分,跟在Linux上调试是一样的,只是这里使用的是交叉编译工具中的GDB。
# arm-none-eabi-gdb build/YS_STM32.elf GDB常用命令如表所示。
关于GDB的使用请看笔者文章:
https://bruceou.blog.csdn.net/article/details/88634967
接下来需要连接openocd服务,openocd给GDB的TCP/IP端口是3333。
# target remote localhost:3333 接下来和在Linux中调试一样。
在 gdb 中键入"l"(list)就可以查看所载入的文件,如下所示。
自行参考笔者关于GDB的博文去调试吧。
【注】J-link调试须知
在使用J-link调试之前,需要将J-link的驱动改为libu***,否则openocd无法连接到J-link。这里使用的工具是U***DriverTool。
U***DriverTool下载地址
使用功能方法如下:
举报