[其他ST产品] VSCode搭建STM32开发环境(极简自我搭建&懒人直接使用插件)

[复制链接]
8586|56
 楼主| 无法去污粉 发表于 2023-1-31 16:54 | 显示全部楼层
注意"terminal.integrated.defaultProfile.windows"和"terminal.integrated.profiles.windows"可能不在同一行。

后者是终端配置,包含名称,路径(path),参数(args),图标(icon)。路径也可以不用path用source,这样它会自己寻找路径,比如我图里的PowerShell。

此外,名称里不能有空格,别被第二个Command Prompt骗了。如果有空格的话,这个配置不会被识别,在terminal.integrated.defaultProfile.windows填上也会报警告。
 楼主| 无法去污粉 发表于 2023-1-31 16:55 | 显示全部楼层
如果打算用Bash作为默认终端的话就像我图里一样把对应的路径写上就行了。

前者是默认的终端是哪个配置,值就是终端配置的名称,比如我这里是PowerShell。

然后,只要ctrl+shift+P然后输入terminal,选择默认配置文件,然后选择对应的就可以了。
 楼主| 无法去污粉 发表于 2023-1-31 16:55 | 显示全部楼层
9545963d8d7785b5ad.png
4883263d8d77d233a6.png
就算配置文件里没有写任何配置,Command Prompt和PowerShell也是会存在的,可选的,但如果配置里名称有空格,是不可选的。至于我图里那个带空格的Command Prompt为啥会在我也不是很懂。
 楼主| 无法去污粉 发表于 2023-1-31 16:56 | 显示全部楼层
这样选择终端配置文件,是全局的默认终端。仅在对应文件夹下的默认终端,可以通过文件夹下添加settings.json来实现,只需添加"terminal.integrated.profiles.windows"项即可,如:
    "terminal.integrated.defaultProfile.windows": "Git-Bash"
 楼主| 无法去污粉 发表于 2023-1-31 16:57 | 显示全部楼层
配置tasks.json
tasks.json配置的是任务。对于使用PowerShell和Git-Bash,从这个地方就有些不同了。
 楼主| 无法去污粉 发表于 2023-1-31 17:00 | 显示全部楼层
自动生成的大致是这样:
  1. {
  2.     "tasks": [
  3.         {
  4.             "type": "cppbuild",
  5.             "label": "C/C++: gcc.exe 生成活动文件",
  6.             "command": "D:\\Programming\\mingw64\\bin\\gcc.exe",
  7.             "args": [
  8.                 "-g",
  9.                 "${file}",
  10.                 "-o",
  11.                 "${fileDirname}\\${fileBasenameNoExtension}.exe"
  12.             ],
  13.             "options": {
  14.                 "cwd": "${workspaceFolder}"
  15.             },
  16.             "problemMatcher": [
  17.                 "$gcc"
  18.             ],
  19.             "group": {
  20.                 "kind": "build",
  21.                 "isDefault": true
  22.             },
  23.             "detail": "调试器生成的任务。"
  24.         }
  25.     ],
  26.     "version": "2.0.0"
  27. }
 楼主| 无法去污粉 发表于 2023-1-31 17:01 | 显示全部楼层
"tasks"里是包含的任务。

"label"顾名思义标签,可以理解为任务的名称。

"type"是表明任务是作为一个进程运行还是在shell中作为命令运行。

"command"即命令。

"args"是命令的参数,即arguments。

"options"是其他命令选项,可以删掉不管。

"problemMatcher"和"group"是问题匹配程序和分组用的,也不用管,删掉就行。

"detail"顾名思义是细节描述。

对于编译工作,我们使用的是make工具,MinGW-w64自带的名叫mingw32-make.exe,ctrl+`呼出终端输入"mingw32-make"回车执行,便可以编译。
 楼主| 无法去污粉 发表于 2023-1-31 19:39 | 显示全部楼层
但是

使用gitbash是可以的,而使用PowerShell直接调用会报错:

4618763d8fe0198d82.png

使用PowerShell需要我们自己先在目录中建一个build文件夹才行。但是用bash的话,它会自动建一个,这和shell自己本身有关吧。
 楼主| 无法去污粉 发表于 2023-1-31 19:41 | 显示全部楼层
当然每次都输指令还是很麻烦,因此将这个操作编入tasks即可。

那么"type"填"shell","command"填"mingw32-make","args"可以填"-j"提高编译速度,至于"label"和"detail"随意填就好。

如果使用PowerShell的话,就像我刚才说的,需要预先新建build文件夹,所以要加上一个"dependsOn"指定其依赖的其他任务。不过要用powershell的条件判断语句判断是否已经存在build文件夹,否则已经存在build文件夹的情况下mkdir会返回错误,而若每次都在新建build前先将build删除,那么每次都需要重新编译所有文件,效率是很低的。

此外,还可以添加一个Clean任务,用来清除编译文件。
 楼主| 无法去污粉 发表于 2023-1-31 19:44 | 显示全部楼层
[color=rgb(85, 87, 112) !important]Cloud IDE [color=rgb(85, 87, 112) !important]VSCode搭建STM32开发环境(极简自我搭建&懒人直接使用插件)
VSCode搭建STM32开发环境(极简自我搭建&懒人直接使用插件)

VSCode搭建STM32开发环境

[url=] 1_ben_black.jpg ben_black[/url]  · 2020-11-24 00:11:27

[color=var(--md-editor-text-color-active)]目录


[color=var(--md-editor-text-color-active)]VSCode搭建STM32开发环境(极简自我搭建&懒人直接使用插件)

[color=var(--md-editor-text-color-active)]写在前面:

[color=var(--md-editor-text-color-active)]方法一:arm工具链+OpenOCD烧录

[color=var(--md-editor-text-color-active)]1.大致思路

[color=var(--md-editor-text-color-active)]2.准备工具

[color=var(--md-editor-text-color-active)]2.1安装工具

[color=var(--md-editor-text-color-active)]2.2补充说明

[color=var(--md-editor-text-color-active)]3.使用STM32CubeMX创建工程

[color=var(--md-editor-text-color-active)]4.VSCode内部配置

[color=var(--md-editor-text-color-active)]4.1添加并配置c_cpp_properties.json

[color=var(--md-editor-text-color-active)]4.2添加settings.json

[color=var(--md-editor-text-color-active)]4.3配置tasks.json

[color=var(--md-editor-text-color-active)]4.4配置launch.json

[color=var(--md-editor-text-color-active)]4.5重定向printf

[color=var(--md-editor-text-color-active)]4.6引入其他库

[color=var(--md-editor-text-color-active)]5.总结

[color=var(--md-editor-text-color-active)]方法二:直接使用插件ioT Link

[color=var(--md-editor-text-color-active)]1.准备工具

[color=var(--md-editor-text-color-active)]2.创建工程

[color=var(--md-editor-text-color-active)]3.其他事项(一些坑)



VSCode搭建STM32开发环境(极简自我搭建&懒人直接使用插件)

[color=var(--md-editor-text-color-active)]一开始是用STM32CubeMX+Keil进行STM32的学习和开发,但是keil的界面属实有点丑。。最开始甚至有点把我劝退。抛开颜值不说,这货的代码补全功能有点菜,很多时候都不显示keyword的提示,至少在我的电脑上是这样,极个别时候倒是还反应挺快。

[color=var(--md-editor-text-color-active)]于是便想要用颜值高而且代码补全功能比较强大的vscode来进行STM32的开发。而且无论何种开发都用一个工具也比较方便。看了一些别人的博客,在这里汇总一下,也算做个笔记。

[color=var(--md-editor-text-color-active)]本教程思路为:使用STM32CubeMX生成Makefile工程(STM32CubeMX自动进行初始化配置实在太香了,应该也是目前stm32开发的主流),然后使用vscode对工程进行编写,编译和烧录。

[color=var(--md-editor-text-color-active)]总算抽出时间写完了,累死了...


写在前面:

[color=var(--md-editor-text-color-active)]方法二所使用的使用ioT Link插件的方法已经不推荐使用,因为方法二是我很久以前写的,已经太久没有维护,不知道现在是个什么状况,事实上在我写完这篇文章的方法二部分之后我就再也没用过这个方法了。。

[color=var(--md-editor-text-color-active)]其次我个人也更倾向于使用方法一,因为方法一尽可能少的使用VSCode插件,仅仅利用VSCode的强大编辑功能,再通过VSCode调用简单的命令行命令去完成后续的编译烧录等,事实上和方法二的内在原理是一样的,只不过方法二会自动帮你下载需要的工具,也会帮助你调用它们。我觉得方法一比方法二要优雅的多,但不可否认的是方法二确实对新手更友好一些,不过方法一每一步的配置过程和内在的原理我已经写的很清楚了,还是希望大家即便是新手也尽可能使用方法一吧,方法二的内容我就先不删除了,虽然很可能已经过失,但或许也能给各位一些帮助。

方法一:arm工具链+OpenOCD烧录1.大致思路

[color=var(--md-editor-text-color-active)]使用STM32CubeMX生成工程,生成时选项选择生成Makefile,通过make调用arm工具链编译,然后通过OpenOCD烧录。

[color=var(--md-editor-text-color-active)]通过写c_cpp_properties.json可以利用VSCode牛X的IntelliSense,可以很爽的写代码。通过task.json方便的完成编译和烧录功能,通过写launch.json以正确进入调试。

[color=var(--md-editor-text-color-active)]此外,也可以正常生成MDK或其他工程,然后vscode只写c_cpp_properties.json,这样的目的是用vscode写代码,用MDK编译和烧录,防止玄学问题发生。

[color=var(--md-editor-text-color-active)]比如我目前没有解决的一个问题是H7的dma问题。看了其他人的博客,是因为dma使用了不该它使用的内存地址,但是用MDK的话官方生成的工程已经帮你把地址规定好了,是可以正常使用的,用arm工具链编译的话我还不清楚在哪里修改这个地址,仅在代码里定向这个地址的话又不好使....有小伙伴解决了的话欢迎评论区或私信告诉我一下;)

2.准备工具

[color=var(--md-editor-text-color-active)](1)VSCode

[color=var(--md-editor-text-color-active)](2)STM32CubeMX

[color=var(--md-editor-text-color-active)](3)MinGW-w64

[color=var(--md-editor-text-color-active)](4)arm-none-eabi-gcc

[color=var(--md-editor-text-color-active)](5)OpenOCD

[color=var(--md-editor-text-color-active)](6)Git(可选)

2.1安装工具

[color=var(--md-editor-text-color-active)]安装不细说了,记得把MinGW-w64,OpenOCD,arm-none-eabi-gcc,Git添加到环境变量。

[color=var(--md-editor-text-color-active)]桌面右键点击此电脑->属性->高级系统设置->环境变量->Path->编辑->新建->浏览,选择对应的路径(到bin文件夹),最后应用->确定。

[color=var(--md-editor-text-color-active)]参考图:

[color=var(--md-editor-text-color-active)] 20210315203733513.png


2.2补充说明

[color=var(--md-editor-text-color-active)](3)MinGW-w64:Version版本号,选最新即可;Architecture架构跟操作系统有关,64位系统选择x86_64,32位系统选择i686;Threads线程标准windows开发选win32,其他选posix;Exception异常处理模型,x86_64可选为seh和sjlj,i686为dwarf和sjlj,一般选seh和dwarf就可;Build revision构建版本号,选择最大就可。详细可看这篇帖子

[color=var(--md-editor-text-color-active)](6)Git:原本以为不能用powershell。。。虽然自己也觉得这不可能,但是一开始确实遇到了问题,不过现在姑且已经解决了。用git-bash的话方便一些,powershell的话有些地方要改一下,而且不如用gitbash快,主要体现在执行task时会卡一卡。关于这个地方其实我也不是很懂,不知道有没有其他方法解决,有的话欢迎评论区或私信提醒。:)

[color=var(--md-editor-text-color-active)](6)Git:后面文章已经彻底改成使用windows的powershell了,本文的宗旨是尽可能减少额外的操作,能用原生的就不下载新的。

3.使用STM32CubeMX创建工程

[color=var(--md-editor-text-color-active)]前面选芯片,配置外设时钟等等正常配就好,要生成工程前点击Project Manager,在Toolchain/IDE处选择Makefile。

[color=var(--md-editor-text-color-active)] 20210315202922108.png

[color=var(--md-editor-text-color-active)]然后直接GENERATE CODE。

4.VSCode内部配置

[color=var(--md-editor-text-color-active)]首先在VSCode中打开刚才的工程文件夹。

[color=var(--md-editor-text-color-active)]直接按F5,选择C++(GDB/LLDB)->gcc.exe生成活动调试文件,然后会自动生成.vscode文件夹,当然啦,会报错,点中止就可以了。

[color=var(--md-editor-text-color-active)] 20210315204042714.png

[color=var(--md-editor-text-color-active)] 20210315204022463.png

4.1添加并配置c_cpp_properties.json

[color=var(--md-editor-text-color-active)](1)在.vscode文件夹中添加c_cpp_properties.json文件,配置了这个,VSCode才能找到includePath,写代码的时候才不会一堆红波浪线。它的基本格式是这样的:

{    "configurations": [        {            "name": "Win32",            "browse": {                "path": [                ],                "limitSymbolsToIncludedHeaders": true            },            "includePath": [            ],            "defines": [             ],            "compilerPath": " ",            "cStandard": "c11",            "cppStandard": "c++17",            "intelliSenseMode": "gcc-x64"        }    ],    "version": 4}

[color=var(--md-editor-text-color-active)]把鼠标放在对应的参数上可以看到vscode对其的解释,比如把鼠标放在path上:

[color=var(--md-editor-text-color-active)] watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVuX2JsYWNr,size_17,color_FFFFFF,t_70,g_se,x_16.jpg


[color=var(--md-editor-text-color-active)]首先我们看"defines",这个是告诉VSCode你预先定义了哪些宏,怎么知道这里应该填什么呢?打开目录下的Makefile文件便可以看到:

[color=var(--md-editor-text-color-active)] 20210315204850635.png

[color=var(--md-editor-text-color-active)]忽略前面的-D,我们便可以知道预先定义的宏是"USE_HAL_DRIVER"和"STM32F407XX"。(一般来说一定是这两个,其中第二个就是你的芯片)

[color=var(--md-editor-text-color-active)]再看"includePath",这个是告诉VSCode去哪些目录里找头文件,怎么知道这里应该填什么呢?同样,打开目录下的Makefile寻找:

[color=var(--md-editor-text-color-active)] 20210315205210228.png

[color=var(--md-editor-text-color-active)]忽略前面的-I,将后面的路径填入即可。(或者可以直接偷懒填"${workspaceFolder}/**",其中workspaceFolder表示当前目录,**表示该目录下递归遍历所有文件)

[color=var(--md-editor-text-color-active)]至于"path",似乎不是很重要,和上面的"includePath"填一样的或者填"${workspaceFolder}/"即可。

[color=var(--md-editor-text-color-active)]最后是"compilerPath",显然是填编译器路径,把MinGW-w64下的gcc的路径填进去就可以了,例如我的是这样:"D:\\Programming\\mingw64\\bin\\gcc.exe"。

[color=var(--md-editor-text-color-active)]至此,至少VSCode智能提示和代码补全功能就工作正常了,可以正常的写代码。虽然还不能编译烧录和调试,不过VSCode编辑+Keil编译烧录调试也是不错的选择(毕竟Keil的编辑功能实在是不好用,界面也丑)。

[color=var(--md-editor-text-color-active)]最后大致是这个样子:

{    "configurations": [        {            "name": "Win32",            "browse": {                "path": [                    "${workspaceFolder}/"                ],                "limitSymbolsToIncludedHeaders": true            },            "includePath": [                "${workspaceFolder}/**"            ],            "defines": [                "USE_HAL_DRIVER",                "STM32F407xx"            ],            "compilerPath": "D:\\Programming\\mingw64\\bin\\gcc.exe",//编译器路径            "cStandard": "c11",            "cppStandard": "c++17",            "intelliSenseMode": "gcc-x64"        }    ],    "version": 4}4.2添加settings.json

[color=var(--md-editor-text-color-active)]在.vscode文件夹中添加settings.json文件,添加:

{    "terminal.integrated.shell.windows": "D:\\Programming\\Git\\bin\\bash.exe"}

[color=var(--md-editor-text-color-active)]这样便指定了该文件夹下默认shell是bash,出现提示的时候选择允许改变即可。


[color=var(--md-editor-text-color-active)]vscode更新后已经不推荐使用这种方法

[color=var(--md-editor-text-color-active)] watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVuX2JsYWNr,size_20,color_FFFFFF,t_70,g_se,x_16.jpg

[color=var(--md-editor-text-color-active)] 目前虽然会警告,但仍然可以使用,而且比新方法优先级更高,也就是说目前继续使用此方法不会有任何问题,暂时

[color=var(--md-editor-text-color-active)]新方法如下:

[color=var(--md-editor-text-color-active)]点击左下角小齿轮进入设置,在上方搜索栏搜索terminal default,然后点在settings.json中编辑

[color=var(--md-editor-text-color-active)] watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVuX2JsYWNr,size_20,color_FFFFFF,t_70,g_se,x_16.jpg

[color=var(--md-editor-text-color-active)] 总之只要能把全局的settings.json打开就行。

[color=var(--md-editor-text-color-active)]到这个位置:

[color=var(--md-editor-text-color-active)] watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVuX2JsYWNr,size_20,color_FFFFFF,t_70,g_se,x_16.jpg

[color=var(--md-editor-text-color-active)] 注意"terminal.integrated.defaultProfile.windows""terminal.integrated.profiles.windows"可能不在同一行。

[color=var(--md-editor-text-color-active)]后者是终端配置,包含名称,路径(path),参数(args),图标(icon)。路径也可以不用path用source,这样它会自己寻找路径,比如我图里的PowerShell。

[color=var(--md-editor-text-color-active)]此外,名称里不能有空格,别被第二个Command Prompt骗了。如果有空格的话,这个配置不会被识别,在terminal.integrated.defaultProfile.windows填上也会报警告。

[color=var(--md-editor-text-color-active)]如果打算用Bash作为默认终端的话就像我图里一样把对应的路径写上就行了。

[color=var(--md-editor-text-color-active)]前者是默认的终端是哪个配置,值就是终端配置的名称,比如我这里是PowerShell。

[color=var(--md-editor-text-color-active)]然后,只要ctrl+shift+P然后输入terminal,选择默认配置文件,然后选择对应的就可以了。

[color=var(--md-editor-text-color-active)] watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVuX2JsYWNr,size_19,color_FFFFFF,t_70,g_se,x_16.jpg

[color=var(--md-editor-text-color-active)] watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVuX2JsYWNr,size_20,color_FFFFFF,t_70,g_se,x_16.jpg

[color=var(--md-editor-text-color-active)]就算配置文件里没有写任何配置,Command Prompt和PowerShell也是会存在的,可选的,但如果配置里名称有空格,是不可选的。至于我图里那个带空格的Command Prompt为啥会在我也不是很懂。= =

[color=var(--md-editor-text-color-active)]这样选择终端配置文件,是全局的默认终端。仅在对应文件夹下的默认终端,可以通过文件夹下添加settings.json来实现,只需添加"terminal.integrated.profiles.windows"项即可,如:

    "terminal.integrated.defaultProfile.windows": "Git-Bash"4.3配置tasks.json

[color=var(--md-editor-text-color-active)]tasks.json配置的是任务。对于使用PowerShell和Git-Bash,从这个地方就有些不同了。

[color=var(--md-editor-text-color-active)]自动生成的大致是这样:

{    "tasks": [        {            "type": "cppbuild",            "label": "C/C++: gcc.exe 生成活动文件",            "command": "D:\\Programming\\mingw64\\bin\\gcc.exe",            "args": [                "-g",                "${file}",                "-o",                "${fileDirname}\\${fileBasenameNoExtension}.exe"            ],            "options": {                "cwd": "${workspaceFolder}"            },            "problemMatcher": [                "$gcc"            ],            "group": {                "kind": "build",                "isDefault": true            },            "detail": "调试器生成的任务。"        }    ],    "version": "2.0.0"}

[color=var(--md-editor-text-color-active)]"tasks"里是包含的任务。

[color=var(--md-editor-text-color-active)]"label"顾名思义标签,可以理解为任务的名称。

[color=var(--md-editor-text-color-active)]"type"是表明任务是作为一个进程运行还是在shell中作为命令运行。

[color=var(--md-editor-text-color-active)]"command"即命令。

[color=var(--md-editor-text-color-active)]"args"是命令的参数,即arguments。

[color=var(--md-editor-text-color-active)]"options"是其他命令选项,可以删掉不管。

[color=var(--md-editor-text-color-active)]"problemMatcher"和"group"是问题匹配程序和分组用的,也不用管,删掉就行。

[color=var(--md-editor-text-color-active)]"detail"顾名思义是细节描述。


[color=var(--md-editor-text-color-active)]对于编译工作,我们使用的是make工具,MinGW-w64自带的名叫mingw32-make.exe,ctrl+`呼出终端输入"mingw32-make"回车执行,便可以编译。

[color=var(--md-editor-text-color-active)]但是

[color=var(--md-editor-text-color-active)]使用gitbash是可以的,而使用PowerShell直接调用会报错:

[color=var(--md-editor-text-color-active)] watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVuX2JsYWNr,size_12,color_FFFFFF,t_70,g_se,x_16.jpg

[color=var(--md-editor-text-color-active)]使用PowerShell需要我们自己先在目录中建一个build文件夹才行。但是用bash的话,它会自动建一个,这和shell自己本身有关吧。


[color=var(--md-editor-text-color-active)]当然每次都输指令还是很麻烦,因此将这个操作编入tasks即可。

[color=var(--md-editor-text-color-active)]那么"type"填"shell","command"填"mingw32-make","args"可以填"-j"提高编译速度,至于"label"和"detail"随意填就好。

[color=var(--md-editor-text-color-active)]如果使用PowerShell的话,就像我刚才说的,需要预先新建build文件夹,所以要加上一个"dependsOn"指定其依赖的其他任务。不过要用powershell的条件判断语句判断是否已经存在build文件夹,否则已经存在build文件夹的情况下mkdir会返回错误,而若每次都在新建build前先将build删除,那么每次都需要重新编译所有文件,效率是很低的。

[color=var(--md-editor-text-color-active)]此外,还可以添加一个Clean任务,用来清除编译文件。

[color=var(--md-editor-text-color-active)]Makefile里的clean操作是这样定义的,其实就是删除build文件夹及其子文件:

[color=var(--md-editor-text-color-active)] watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmVuX2JsYWNr,size_20,color_FFFFFF,t_70,g_se,x_16.jpg

[color=var(--md-editor-text-color-active)] 对于gitbash可以直接使用"mingw32-make clean",但是对于PowerShell是没有-fR这个参数的,总之用不了,会报和前面类似的错误。所以不用这个clean,在"commands"直接填"rm -r build"即可。





 楼主| 无法去污粉 发表于 2023-1-31 19:46 | 显示全部楼层
那么对于烧录工作,我们使用的是OpenOCD工具。ctrl+`呼出终端输入"openocd -h"查看帮助可以看到,用选项-f来指定配置文件,用选项-c来运行指令。
7909963d8ff8d31618.png
 楼主| 无法去污粉 发表于 2023-1-31 19:46 | 显示全部楼层
那么思路就是:-f来指定调试器类型和芯片型号等,-c进行烧录。

在目录"...\OpenOCD\share\openocd\scripts"下可以看到有很多写好的配置文件:
4730163d8ffa58ae79.png
 楼主| 无法去污粉 发表于 2023-1-31 19:49 | 显示全部楼层
可以在interface中指定调试器,target中选择芯片型号。比如我的是stm32f407discovery的板子且板载stlink-v2,那么就可以写"-f interface/stlink-v2.cfg -f target/stm32f4x.cfg"。如果是官方板也可以直接在board里找。比如"-f board/stm32f4discovery.cfg".

而-c的参数既然是烧录操作的指令那么就是:"program build/_NAME_.bin verify reset exit 0x08000000"。其中_NAME_是你的工程的名字。
 楼主| 无法去污粉 发表于 2023-1-31 19:49 | 显示全部楼层
那么总结一下tasks.json可以这样写:
  1. {
  2.         "version": "2.0.0",
  3.         "tasks": [
  4.                 {
  5.                         "type": "shell",
  6.                         "label": "Create BUILD-DIR",
  7.                         "command": "if (!(Test-Path build)) {mkdir build}",
  8.                         "detail": "Create new folder "build""
  9.                 },
  10.                 {
  11.                         "type":"shell",
  12.                         "label": "Build",
  13.                         "command": "mingw32-make",
  14.                         "dependsOn": "Create BUILD-DIR",
  15.                         "args": [
  16.                                 "-j"
  17.                         ],
  18.                         "detail": "Build with mingw32-make.exe"
  19.                 },
  20.                 {
  21.                         "type":"shell",
  22.                         "label": "Clean",
  23.                         "command": "rm",
  24.                         "args": [
  25.                                 "-r",
  26.                                 "build"
  27.                         ],
  28.                         "detail": "Delete folder "build" and its content"
  29.                 },

  30.                 {
  31.                         "type": "shell",
  32.                         "label": "Burn",
  33.                         "command": "openocd",
  34.                         "args": [
  35.                                 "-f",
  36.                                 "interface/stlink-v2.cfg",
  37.                                 "-f",
  38.                                 "target/stm32f4x.cfg",//target
  39.                                 "-c",
  40.                                 "program build/_NAME_.bin verify reset exit 0x08000000"
  41.                         ],
  42.                         "detail": "Burn with OpenOCD"
  43.                 },
  44.                 {
  45.                         "type": "shell",
  46.                         "label": "OpenOCD",
  47.                         "command": "openocd",
  48.                         "args": [
  49.                                 "-f",
  50.                                 "interface/stlink-v2.cfg",
  51.                                 "-f",
  52.                                 "target/stm32f4x.cfg"//target
  53.                         ],
  54.                         "detail": "start OpenOCD and wait for gdb"
  55.                 }
  56.         ]
  57. }
 楼主| 无法去污粉 发表于 2023-1-31 19:50 | 显示全部楼层
每个工程的工程名肯定不同,所以_NAME_肯定每次都需要修改。可以复制好工程名之后ctrl+f搜索_NAME_进行全部替换,后文的launch.json同理。工程名可以到Makefile的这个地方直接复制:
401463d900675c472.png
 楼主| 无法去污粉 发表于 2023-1-31 19:56 | 显示全部楼层

[color=var(--md-editor-text-color-active)]由于调试的时候需要用OpenOCD连接gdb,因此此处多加一个仅用OpenOCD连接设备,不烧录的task。

[color=var(--md-editor-text-color-active)]按下F1选择运行任务,就可以了,label和detail的具体效果如下:

[color=var(--md-editor-text-color-active)] 20210319183225108.png

[color=var(--md-editor-text-color-active)]可以看到label的内容可以算是标题或者名称,而detail显示为label下的灰字描述。


 楼主| 无法去污粉 发表于 2023-1-31 19:57 | 显示全部楼层
配置launch.json
默认的launch.json大概是这样子:

6250363d902136d859.png
我们要修改的是"program"项,指定可执行文件的路径,如图所示,改到build下,对应的elf文件,"miDebuggerPath"项,指定调试程序的路径,如图所示,改到arm-none-eabi-gdb.exe,以及"setupCommands",指定执行的命令。里面的"description"是描述信息,填不填都行,"text"是执行的命令,"ignoreFailures"是否忽略错误。
 楼主| 无法去污粉 发表于 2023-1-31 20:00 | 显示全部楼层
调试的整个过程是,因为是调试stm32,要通过调试器,因此首先启动OpenOCD任务,OpenOCD会开放3333端口供gdb连接,然后F5启动调试,为gdb选择文件,然后连接到3333端口,reset和halt之后,烧录文件,就可以开始调试了,最后launch.json大概长这样:
  1. {
  2.     // 使用 IntelliSense 了解相关属性。
  3.     // 悬停以查看现有属性的描述。
  4.     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
  5.     "version": "0.2.0",
  6.     "configurations": [
  7.         {
  8.             "name": "调试",
  9.             "type": "cppdbg",
  10.             "request": "launch",
  11.             "program": "${workspaceFolder}\\build\\_NAME_.elf",
  12.             "args": [],
  13.             "stopAtEntry": false,
  14.             "cwd": "${workspaceFolder}",
  15.             "environment": [],
  16.             "externalConsole": false,
  17.             "MIMode": "gdb",
  18.             "miDebuggerPath": "D:\\Programming\\arm-none-eabi\\bin\\arm-none-eabi-gdb.exe",
  19.             "setupCommands": [
  20.                 {
  21.                     "description": "为 gdb 启用整齐打印",
  22.                     "text": "-enable-pretty-printing",
  23.                     "ignoreFailures": false,
  24.                 },
  25.                 {
  26.                     "description": "select .elf to gdb",
  27.                     "text": "file D:/MyDocuments/Programming/STM32/Projects/F407DISC/_NAME_/build/_NAME_.elf",
  28.                     "ignoreFailures": false,
  29.                 },
  30.                 {
  31.                     "description": "connect gdb server",
  32.                     "text": "target remote localhost:3333",
  33.                     "ignoreFailures": false,
  34.                 },
  35.                 {
  36.                     "description": "Reset MCU",
  37.                     "text": "monitor reset",
  38.                     "ignoreFailures": false,
  39.                 },
  40.                 {
  41.                     "description": "Halt",
  42.                     "text": "monitor Halt",
  43.                     "ignoreFailures": false,
  44.                 },
  45.                 {
  46.                     "description": "Burn",
  47.                     "text": "load",
  48.                     "ignoreFailures": false,
  49.                 },
  50.             ],
  51.             "preLaunchTask": "Build"
  52.         }
  53.     ]
  54. }
 楼主| 无法去污粉 发表于 2023-1-31 20:01 | 显示全部楼层
"preLaunchTask"是调试前执行的任务,因此不用预先调用Build任务。
 楼主| 无法去污粉 发表于 2023-1-31 20:02 | 显示全部楼层
重定向printf
在HAL库的Projects下有一些板子例程,有的板子的Examples里的UART里会有UART_Printf例程,这个就是官方的重定向printf的示例。keil的例程如下:
7725763d9034d5f161.png

4446863d90353c6c39.png
可以看到,官方定义了PUTCHAR_PROTOTYPE为输出一个字符的原型,后面再对输出一个字符的原型进行改动,改成对应的串口输出。由于keil的AC5编译器对输出一个字符原型的名字不一样,所以使用了条件编译#ifdef。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部