前言

书接上回,上篇文章我们说完了如何使用CMake来构建整个工程,并且成功编译完成,得到了我们想要的文件,这篇文章,我们来搞定如何通过OpenOCD来进行STM32程序的下载和调试。

文章中所有的安装包以及测试代码可以在这里找到:[【昕某人の网盘-VSCode开发STM32的开发环境】](文件分享 - 外链分享 - 大伙云 - Powered by kodbox (xinmouren.cn))

openocd安装

openocd是一个调试工具,能够按照不同的调试器连接不同的芯片,以达到下载软件和调试的目的。

openocd的安装比较简单,只需要下载openocd的安装包,解压后添加环境变量即可。

其实直接用jlink的驱动程序也可以,后面会出一个详细的jlink官方驱动的使用教程

替换Jlink驱动

这里需要说明的是,openocd只把Jlink当作普通的USB设备进行处理,但是类似MDK的软件是需要识别Jlink的驱动程序的,也就是说,如果你之前使用MDK能够正常工作,那么openocd是找不到jlink的。

打开“设备管理器”可以看到目前的Jlink驱动程序如下:

image-20240202164754179

这里可以看到上面的图片中的Jlink,为通用串行总线控制器,在这里,能够被openocd正常识别的调试器是xx,而上面的Jlink只会被MDK等IDE识别(其实就是jlink的官方驱动程序)。

想要修改USB设备的类型,可以使用zadig来实现。

首先打开zadig,选择上面的Options,并且按照下图的模式进行配置:

image-20240202164921965

接着选择Jlink设备(与设备管理器看到的名字一样),点击替换即可:

image-20240202164942176

等待替换完成:

image-20240202165112798

替换完成后打开设备管理器就能看到jlink替换后的位置:

image-20240202165126267

openocd的使用

openocd的使用比较简单,它只需要3个比较简单的参数:

  • 调试器类型,包括ST-Link、J-Link等等,主要看你所使用的调试器类型
  • 芯片类型:如STM32F4、STM32F1等等
  • 要下载的文件:即编译后的Hex文件

烧录程序

首先打开openocd安装(解压后)的路径,打开share->openocd->scripts目录:

image-20240202165149981

在这个目录下我们能够看到很多的子目录,这些目录中,我们只需关注两个即可:

image-20240202165211225

这两个目录分别存放着各个调试器所用的文件和各个芯片所用的文件。

interface目录下都是一些调试器的配置文件:

image-20240202165218572

而target目录下都是各个芯片的配置文件:

image-20240202165228735

我们将需要的调试器文件拷贝到工程目录下:

并且修改jlink.cfg中的配置,在jlink.cfg中添加一行,声明使用的是SWD的接口:

transport select swd

image-20240202165515916

然后打开终端,输入下面的指令即可完成下载:

openocd -f jlink.cfg -f stm32f4x.cfg -c "program Build/TestProject.hex verify reset exit"

注意引号!

image-20240202165843370

此时我们可以看到开发板的流水灯效果!

使用task.json配置自动下载

我们当然不希望每次下载程序都输入那么长一大串的指令,所以可以借助VSCode的“任务”来实现一键下载。

在VSCode中上方菜单的终端,选择配置默认生成任务。

image-20240202165911192

此时可以看到VSCode为我们生成了一个默认的任务,这个配置文件放在工程目录下的.vscode中,文件名为tasks.json。

然后将下面的内容复制并完全替换默认生成的任务配置文件。

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "下载程序",
            "type": "shell",
            "command": "openocd",
            "args": [
                "-f",
                "jlink.cfg",
                "-f",
                "stm32f4x.cfg",
                "-c",
                "program Build/TestProject.hex verify reset exit"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "reveal": "silent"
            },
            "problemMatcher": "$gcc"
        },
        {
            "label": "生成MakeFile",
            "type": "shell",
            "command": "cmake",
            "args": [
                "-G",
                "'MinGW Makefiles'",
                ".",
                "-B",
                "Build"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "reveal": "silent"
            },
            "problemMatcher": "$gcc"
        }
    ]
}

上面的文件中配置了两个任务,一个为烧录程序,一个为生成MakeFIle文件,其实就是将命令写好,当执行的时候VSCode就按照设置的命令和参数进行编译和烧录。

然后我们就可以终端->运行生成任务中(或者按下Ctrl+Shift+B)来选择任务并执行。

image-20240202170000610

如果你打算直接用cmake tool插件来执行编译动作,那么选择编译链的时候要选择MinGW。

启动调试

接下来我们要配置使用openocd来进行Debug调试。

调试之前请保证生成的elf文件为Debug模式下生成的!

下载插件

首先需要下载Cortex-Debug插件。

image-20240202170314071

配置调试任务

点击运行->添加配置,然后随便选择一个,VSCode会自动生成一个Debug的配置文件,名字为launch.json。

将下面的内容全部复制并替换原有的launch.json:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Cortex Debug",
            "cwd": "${workspaceFolder}",
            "executable": "./Build/TestProject.elf",
            "request": "launch",
            "type": "cortex-debug",
            "runToEntryPoint": "main",
            "servertype": "openocd",
            "device": "STM32F407VG",
            "interface": "swd",
            "configFiles": [
                "jlink.cfg",
                "stm32f4x.cfg"
            ],
            "svdFile": "./STM32F407.svd"
        }
    ]
}

上面的配置文件也比较好理解,需要注意的是最后的svd文件,如果你不需要查看外设寄存器的值,那么这个可以不进行配置。各个芯片的svd文件可以在上面提供的下载链接中找到。

注意:任何VSCode的配置文件请注意路径以及生成文件名称的问题!

配置好后,我们直接点击F5(或者运行->启动调试)即可。

然后我们就可以愉快的调试了!

image-20240202170414825

结束

至此,我们一套支持跨平台的STM32编译与调试系统就搭建完成了,VSCode给我的调试体验还是蛮不错的,如果你有任何的疑问,都可以在下面留言,我会在最晚半个小时内给你答复!