使用VSCode编辑STM32工程

使用VSCode编辑STM32工程(目前仅支持HAL库)

为什么要使用VSCode

肯定是能够提供一些好处了

  1. 更加漂亮的界面(好看的界面是第二生产力,第一生产力是DDL,虽然Keil也能配出不错的配色
  2. 更加优秀的代码提示,这个是VSCode的最大优势,特别是配上clang之后
  3. 这套工具链可以完美的移植到Linux,只要下载对应的Linux版本文件即可
  4. 在配置的过程中能够更加深入的了解整个工程的组成和原理,从源码到烧录再到调试的整个过程究竟是如何进行的,Keil又究竟完成了哪些工作。
    • 其实这一点才是能够带来最大收获的

但也有缺点

  1. 无法在调试的时候实时显示变量值
  2. 当使用汇编指令进行修改的时候会有些BUG,比如正点原子的sys.c当中,就必须修改一部分才能正常编译
  3. 似乎无法正确处理头文件的嵌套调用问题,但这个问题仅仅在查看hal库源代码的头文件时会出现,所以基本不影响正常使用
  4. ~~ 当include string.h这种东西的时候会报错,但是不影响正常的编译~~
    • 解决方法 在makefile中增加对arm-non-eabi中include文件夹的包含,如D:/Program Files/GUN_ARM/9_2020-q2-update/arm-none-eabi/include

      找到解决办法的过程我附到最后

软件环境

  1. VSCode 不用说,肯定需要
  2. STM32CubeMx 用于生成Makefile
  3. MinGW-w64 用于对Makefile进行编译
  4. arm-none-eabi 用于进行交叉编译
  5. openOCD 用于对ST-Link的调试(不用应该也有替代方案,暂时来看这个还是比较方便的)
  6. STM32CubeProgrammer 用于非调试条件下的Reset和下载
  7. python 需要使用pip安装compiledb
  8. clang 用于C语言的代码补全(其实理论上不用这个也是可以的,但我没有尝试成功,而且这个的代码补全比VSCode自带的插件好用的多,用了就再也不想回去了)
  9. git 主要用它的git-bash,而且最好用的代码管理软件不考虑下吗?

软件安装

重要提示:以下所有软件安装时一定记好自己的安装路径,后面可能还需要找自己去找

  1. VSCode 直接去官网下载安装包进行安装 ,安装路径随意
  2. STM32CubeMX 去官网下载,只留一个邮箱就行,会把下载连接发到邮箱里
  3. MinGW-w64 去官网下载(这个是官网给出的下载链接,直接拉到底选择MinGW-W64-install.exe)
    • 安装完成之后测试方式:打开命令行(cmd,powershell或者git-bash都行),输入mingw32-make -v,如果能够正常输出版本信息则安装成功
    • 安装完成后需要进行一步操作进入安装路径,将mingw32-make.exe,复制粘贴到原位置,命名为make.exe
  4. arm-none-eabi 去官网下下载Windows平台的
    • 安装完成之后测试方式:打开命令行(cmd,powershell或者git-bash都行),输入arm-none-eabi-gcc -v,如果能够正常输出版本信息则安装成功
  5. STM32CubeProgrammer 去官网下,和STM32CubeMX一个方法
    • 安装完成之后测试方式:打开命令行(cmd,powershell或者git-bash都行),输入STM32_Programmer_CLI --version,如果能够正常输出版本信息则安装成功
    • 这个好像需要手动加入到环境变量中才行
  6. python 去官网
    • 安装完成之后测试方式:打开命令行(cmd,powershell或者git-bash都行),输入python --version,如果能够正常输出版本信息则安装成功
  7. clang 去官网下,这是官方的github链接
    • 安装完成之后测试方式:打开命令行(cmd,powershell或者git-bash都行),输入clang -v,如果能够正常输出版本信息则安装成功
    • 也可以在使用vscode的clangd插件时让它自己下载,但是如果网不好就很尴尬。
  8. OpenOCD 去官网给出的SourceForge网站下载
  9. 如果不好翻墙的同学可以从国内很多网站下载。而且,搜索引擎搜索“软件名+安装+windows ”,就能找到较为详尽的安装方式,所以不再详细叙述
  10. 如果测试不过,可以试试将对应的安装目录下的执行文件所在的路径加入到环境变量中(具体方式可以上网搜)

配置方法

  1. VSCode安装以下插件

    1. C/C++ 提供C/C++的语法高亮和基础的代码提示和跳转,后面会把代码提示功能禁用并使用clangd代替(好像不用这个也行?但是这个是官方提供的插件,还是装一下吧,以后随便用VSCode写C/C++又懒得配clang的时候也还是好用的)
    2. clangd 通过clang提供代码补全,比C/C++好多了,但是需要的配置更加复杂(启动时也许会让你安装clangd,这个默认装在VSCode的插件路径下,如果你已经提前装好了,那么不需要让它再装一遍了就)
    3. Cortex-Debug 通过调用OpenOCD来实现各种调试器的调试,也就是Debug
    • 以上为必须插件,以下为推荐插件,可以优化使用体验
    1. Bracket Pair Colorizer 2 :彩虹花括号
    2. Chinese(simplified):简体中文语言包
    3. GBKtoUTF8:解决编码问题
  2. 使用CubeMX生成Makefile文件(后续会尝试使用keil工程直接生成makefile,敬请期待)

    • 如果是之前生成过的话直接在CubeMX里的IDE选择那里选择Makefile重新生成一遍就好
  3. 对Makefile进行修改(等效于在Keil中加入自己的代码和头文件时设置包含路径和加入工程

    1. 使用记事本/VSCode打开Makefile
    2. 找到C_SOURCES并在最后加入自己的文件,注意最后的反斜杠 \
    3. 找到C_INCLUDES并在最后加入自己的包含路径,注意最前面的-I和最后的反斜杠 \(不知道是不是BUG,生成的包含路径最后一个是重复的,可以删除掉)
    4. 其他的不要动
  4. 在命令行中输入make -j,尝试进行编译,如果无法正常编译,则返回检查makefile是否出错,或者各种软件安装是否出错。

    • 如果能够编译出elf和hex文件就没问题,如果最后给出error或者fail则有问题
  5. 安装compiledb:使用pip安装,在命令行中输入pip install compiledb(如果无法安装可以尝试pip更换国内源,具体方法可以搜索引擎搜索)

  6. 使用compiledb从makefile生成Clang所需要的compile_commands.json,在命令行中输入compiledb -n make,将会在该目录下自动生成compile_commands.json文件。

  7. 接下来配置vscode的settings.json(VSCode的所有设置,包括拓展的设置都会以settings.json的形式存在,并且分为用户和工作区两部分)

    1. 首先确定自己在正确的路径下打开的VSCode(即对应的工程所在的文件夹,直接在该文件夹下点击鼠标右键,选择在VSCode中打开即可)
    2. Clangd拓展
      1. 在拓展中点击Clangd的小齿轮,并选择拓展设置
      2. 找到clangd:path项,将自己的clang路径填入(或者也可以根据提示让它自己安装)
    3. Cortex-Debug拓展
      1. 在拓展中点击Cortex-Debug的小齿轮,并选择拓展设置
      2. 找到第一项cortex-debug.armToolchainPath并点击在settings.json中编辑,此时应该会弹出一个settings.json并在文件结尾处自动生成一个"cortex-debug.armToolchainPath": "",将自己的arm-none-eabi路径填入,应该与以下格式类似"D:\\Program Files\\GUN_ARM\\9_2020-q2-update\\bin",即填写到bin文件夹即可。
      3. 返回设置界面,找到cortex-debug.openocdPath,同上操作,不过此次填入的是OpenOCD的路径,应该与以下格式类似"D:\\Program Files\\OpenOCD-20200701-0.10.0\\bin\\openocd.exe"
    4. 全局设置只设置一次即可,全局设置完成,接下来就是工作区的设置。切换到工作区的目的是保证不影响VSCode的其他功能,并且每个工程作为一个工作区,所以每次都要重新设置。
      1. 在VSCode中按Ctrl+,调出设置,切换到工作区,然后搜索termina windows,找到Terminal>Intergrated>Shell:Windows项。点击下方的在settings.json中编辑。此时会自动在该目录下生成.vscode文件夹,并在其中生成settings.json,且在settings.json中自动写入"terminal.integrated.shell.windows":""
      2. 在后面的引号中填入Git的bash路径,应该与以下路径类似E:/Program Files/Git/bin/bash.exe,注意路径中的反斜杠需要修改成正斜杠或者进行转义
      3. 并顺道在下面填入以下内容 "C_Cpp.intelliSenseEngine": "Disabled",应该注意的是与上一条之间应该有逗号隔离(就是标准的json格式)
  8. 然后在.vscode文件夹下新建一个名为launch.json的文件,用于调试

    1. 填入以下内容

      {
          "version": "0.2.0",
          "configurations": [
              {
                  "name": "ARM Debug",
                  "type": "cortex-debug",
                  "request": "launch",
                  "cwd": "${workspaceFolder}",
                  "servertype": "openocd",
                  "configFiles": [
                      "interface/stlink.cfg",
                      "target/stm32f1x.cfg"
                  ],
                  "executable": ".\\build\\VSCodeTest.elf",
                  "runToMain": true,
                  "svdFile": "D:\\Program Files\\Keil_MDK5\\Packs\\Keil\\STM32F1xx_DFP\\2.3.0\\SVD\\STM32F103xx.svd",
                  "postDebugTask": "reset"
              }
          ]
      }
      
    2. 其中configFiles中的interface/stlink.cfg与target/stm32fx.cfg是所用的调试器类型和芯片类型,需要从openocd的安装路径中找,路径应与以下路径类似D:\Program Files\OpenOCD-20200701-0.10.0\share\openocd\scripts\target

    3. 其中executable的路径是可执行文件elf,应该是build文件夹下的唯一一个elf文件,并且与工程同名,找到并修改接口

    4. 其中的svdFile路径是芯片的外设描述,如果不设置也是可以的,只是在调试时无法查看对应寄存器的值而已(变量还是可以看的)。如果想要设置,请将路径替换为keil安装路径中的对应芯片的svd

    5. 其中的postDebugTask是,指退出调试时所执行的task,我们后面会进行设置

  9. 然后在.vscode 文件夹下新建一个文件名为tasks.json,用于方便执行build等命令(等于帮你敲一段代码)

    1. 填入以下内容

      {
      	"version": "2.0.0",
      	"tasks": [
      		{
      			"type": "shell",
      			"label": "Build",
      			"command": "make",
      			"args": [
      				"-j"
      			],
      			"detail": "Build with mingw32-make.exe",
      			"problemMatcher": [],
      			"group": {
      				"kind": "build",
      				"isDefault": true
      			}
      		},
      		{
      			"type": "shell",
      			"label": "Rebuild",
      			"command": "make clean && make -j",
      			"detail": "Rebuild with mingw32-make.exe",
      			"problemMatcher": []
      		},
      		{
      			"type": "shell",
      			"label": "Burn",
      			"command": "openocd",
      			"args": [
      				"-f",
      				"interface/stlink.cfg",
      				"-f",
      				"target/stm32f1x.cfg",
      				"-c",
      				"program build/VSCodeTest.bin verify reset exit 0x08000000"
      			],
      			"detail": "Burn with OpenOCD",
      			"problemMatcher": []
      		},
      		{
      			"label": "Build&Burn",
      			"type": "shell",
      			"command": "openocd",
      			"args": [
      				"-f",
      				"interface/stlink.cfg",
      				"-f",
      				"target/stm32f1x.cfg",
      				"-c",
      				"program build/VSCodeTest.bin verify reset exit 0x08000000"
      			],
      			"dependsOn": [
      				"Build"
      			],
      			"detail": "Build then Burn with OpenOCD",
      			"problemMatcher": []
      		},
      		{
      			"label": "reset",
      			"type": "shell",
      			"command": "STM32_Programmer_CLI",
      			"args": [
      				"-c",
      				"port=SWD",
      				"-hardRst"
      			],
      			"detail": "Reset target device",
      			"problemMatcher": []
      		}
      	]
      }
      
    2. 注意需要将其中所有的** .cfg文件换成对应的文件,同时将.bin文件**换成对应的

    3. 然后点击VSCode左下角的齿轮选择键盘快捷方式,搜索task,给“任务:运行任务”,设置好对应的快捷键,就可以使用快捷键进行相应task的执行。

    4. 此处的reset就是前面提到的postDebugTask

  10. 进行验证

    1. 在任意函数中输入HAL库的函数/宏定义,看是否能够正常补全
    2. 鼠标停留在对应的函数上,看是否能够正常显示相关定义
    3. 按下快捷键Ctrl+Shift+B 看是否能够正常编译
    4. 按下上面自己设定的快捷键,测试各个task是否能够起到对应的作用
    5. 按下快捷键F5,看能否正常启动调试
  11. 后续内容

    1. 如果想要新增新的文件和包含路径,请修改对应的Makefile,并使用compiledb重新生成compile_commands.json
  12. 前面提到的解决办法过程(只想看结果的可以不看了)

    • 这个我TM找了半天,最后返璞归真,直接加个include就好了
      - 先是试图直接加入到Makefile里一个标准库,于是选定了mingw的库,没有效果
      - 于是直接把string.h复制到工程文件夹下,结果因为包含另外的头文件导致继续报错
      - 最后找到Keil下有个ARM/CLANG的文件夹下有相应的文件,并且没有头文件的嵌套,能够解决报错问题,但是无法正常编译
      - 然后尝试通过设定clangd的方式进行操作,找到GitHub的issues里有些人和我有相似的问题,一番搜索后,找到clangd有关交叉编译的问题,于是尝试使用--query-driver=/path/to/mygcc(来自clangd官网的故障排除)。在setting中设置args没有效果(这个方法也来自于GitHub的issues),根据描述,应该是仅有没有compile_commands.json时此设置才有效
      - 然后尝试在compile_commands.json中直接设置--query-driver=/path/to/mygcc,但是提示不支持
      - 然后在bing搜索相关内容,得到--isysroot=<path>设置,尝试在compile_commands.json中直接设置,但是没有效果
      - 最后根据以上信息整合,再加上推测,直接在compile_commands.json中设置include到交叉编译的编译器自带的标准库中,成功解决问题
      - 然后测试将include设置到makefile中,能够起到相同的作用,但是要注意空格的问题
      - 最后测试,加入与否并不影响正常编译,速度也没有下降,得到最终解
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值