Windows10下用vscode开发stm32

Posted by 婷 on February 13, 2021 本文总阅读量

前言

本文主要是介绍在win10的环境下,利用cubemxopenocdvscode软件以及烧录工具stlink来实现stm32的开发。(主要是去实习了,公司要求换个环境开发)

安装清单

  • vscode
  • MinGw
  • 交叉编译工具链
  • openocd
  • cubemx
  • stlink驱动

安装vscode

直接去官网下载安装程序即可,或者可以参考这篇博客

安装MinGW

来到sourceforge网站下载,选择红框的压缩包,点击下载

1.png

下载后解压缩运行,最终在桌面可以看到下面MinGW的在线安装器的图标(如果在桌面看不到就去开始菜单搜索)。这只是个安装器,需要在线下载真正的安装内容,所以速度不会快。

2.png

点击图标,跳出下面这个界面,点击这些组件旁边的框框,点击mark for install

3.png

选择下面这些需要的组件,有的可能已经先帮你安装好了。

4.png

5.png

6

7

选择完毕后点击Installation

8

等待安装成功后,要进行环境变量的设置。右键我的电脑属性,点击高级系统设置。然后按照下图的操作,记得添加之后要一路点击确定

9

10

点击Path

11

我的安装路径是 C:\MinGW,但是那些可执行文件在bin文件夹内,所以记得路径要包括到bin

12

最后一路点击确定

安装vscode常用插件

  • ARM:使的ARM汇编代码获得语法高亮,这里主要用在启动文件上。

  • C/C++:使VScode获得对C/C++语言的支持,包括智能提示,调试等。

  • Chinese (Simplified) Language Pack for Visual Studio Code:VScode中文语言包。

  • C++ Intellisense:提供C++智能感知功能。

  • Cortex-Debug:对ARM Cortex-M内核的单片机提供调试支持。

  • Cortex-Debug: Device Support Pack - STM32F1(F4,L1):这三个芯片包分别对Cortex-Debug提供三款芯片的设备支持。

  • GBKtoUTF8:因为平时的Keil的STM32工程文件大部分都是GB2312编码的,这个扩展可以自动将GB2312 转换为UTF-8编码。

  • LLVM :代码补全。

13

14

15

16

17

18

19

20

21

安装交叉编译工具链

来到官网往下拉就能看到2019的版本,点击这个红框,选择这个版本。

63

然后下载zip压缩包。

64

解压后如下图所示。

62

此处可以看到我的路径是E:\gcc-arm-none-eabi-9-2019-q4-major-win32,添加环境变量,这次也要将路径拓展到\bin

61

60

设置之后,打开命令行,输入arm-none-eabi-gcc -v,如果看得到版本信息就说明设置成功啦。

59

安装OpenOcd

来到官网,如下图所示,选择的是windows的版本。点击红框下载压缩包。

22

解压之后如下所示。

23

同样添加环境变量,也要包括到bin。我的路径是E:\openocd-20201228\OpenOCD-20201228-0.10.0\bin

24

设置之后,打开命令行输入openocd -v查看是否设置成功。

25

安装stlink驱动

来到官网,然后点击获取软件,之后会让你填个邮箱,在邮箱给出的链接下载软件就行了。

26

下载后解压,选择红框的exe

27

安装完成后就是这样的。

28

当电脑连接stlink时,如果安装成功,就可以在设备管理器看到下图红框的提示。

image-20210127155105481

stm32cubemx新建工程

新建一个cube的工程

67

选择对应的芯片

68

选择外部晶振

69

用的是stlink-sw下载的模式

80

配置时钟树

75

选择makefile

76

勾上这两个选项

77

然后点击上方的Generate Code,即可生成需要的外设配置代码

78

打开文件夹如下所示

79

这里有个很方便的小技巧,参考这个链接,可以实现右键选择需要用vscode打开的文件。

编译

配置c_cpp_properties.json

按下Ctrl+Shift+P打开命令行,输入edit configurations(json)。他会在工程文件夹下生成一个.vscode文件夹并在其中创建一个c_cpp_properties.json的配置文件。其中include路径和宏定义可以参照makefile添加。

31

这是默认的vscode给的模板。

32

接下来根据我们从cubemx生成的makefile来进行修改。打开maikefile,找到个宏定义处,

将这两个宏定义添加到自己的c_cpp_properties.json文件。(记得把开头的D去掉)

33

修改后的内容如下所示。

34

完整的代码。

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE",
                "USE_HAL_DRIVER" ,
                "STM32F103xB"
            ],
            "compilerPath": "C:\\MinGW\\bin\\gcc.exe",
            "cStandard": "gnu11",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x86"
        }
    ],
    "version": 4
}

方法(一)

直接手动在中断输入make命令,或者make -j4等。如果提示下列错误,找到自己安装的MinGW路径,来到bin 文件夹。将mingw32-make修改为make

41

42

43

如下图所示,编译成功。

44

方法(二)

按下Ctrl+Shift+P打开命令行,输入task。点击配置任务

45

点击使用模板创建tasks.json文件。

46

点击Others,然后就会生成一个默认模板。

47

默认模板如下:

48

我们配置这个任务是为了编译,所以将label修改成编译代码

49

原代码如下:

{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "shell",
			"label": "编译代码",
			"command": "make",
			"args": [
				"-j4"
			],
			"problemMatcher":[
				"$gcc"
			],
			"group": "build",
		}
	]
}

配置完成后,点击终端,点击运行任务,就会出现我们配置好的编译代码的任务,点击之后其执行内容就相当于之前执行的make命令。执行这个任务的时候会再打开一个终端

50

51

52

下载

再次配置task.json文件。

55

最终的task.json文件如下所示。

{
    "version": "2.0.0",
    "tasks": [
     {
      "type": "shell",
      "label": "编译代码",
      "command": "make",
      "args": [
        "-j4"
      ],
      "problemMatcher":[
       "$gcc"
      ],
      "group": "build",
     },

     {
        "type": "shell",
        "label": "下载",
        "command": "openocd",
        "args": [
         "-f",
         "E:/openocd-20201228/OpenOCD-20201228-0.10.0/share/openocd/scripts/interface/stlink.cfg",
         "-f",
         "E:/openocd-20201228/OpenOCD-20201228-0.10.0/share/openocd/scripts/target/stm32f1x.cfg",
         "-c",
         "program build/test.elf verify reset exit"
        ],
        "problemMatcher":[
         "$gcc"
        ],
        "group": "build",
      }
   ]
}

配置过程也跟上一步配置编译的任务差不多,但是需要注意的就是openocd的路径以及生成的.elf目标文件的名字。

下面是openocd的路径

53

54

跟上一步一样,打开终端,点击运行任务,点击下载的任务。

30

调试

这部分需要做的工作是配置launch.json文件以及在task.json添加任务。

launch.json

点击左边的Debug图标,如果第一次设置的话,会让你创建一个launch.json文件。

35

选择红框的选项。

36

接下来选择默认配置

37

生成的默认的配置文件如下。然后红框的部分就根据自己实际工程来修改。

39

修改后的配置文件:红色部分根据自己makefile要生成的target来修改,gdb路径根据自己的电脑路径来设置。绿色部分是因为我们使用的是openocd工具而增加的配置文件。注意增加部分的file test.elf

70

最后修改完成的launch.json文件的内容:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/test.elf",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "arm-none-eabi-gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {"text": "cd ${workspaceFolder}/build"},
                {"text": "file test.elf"},
                {"text": "target remote localhost:3333"},
                {"text": "monitor reset"},
                {"text": "monitor halt"},
                {"text": "load"},
            ]
        }
    ]
}

task.json

其实只是增加了一个启动下载调试器的任务,文件内容如下

{
    "version": "2.0.0",
    "tasks": [
     {
      "type": "shell",
      "label": "编译代码",
      "command": "make",
      "args": [
        "-j4"
      ],
      "problemMatcher":[
       "$gcc"
      ],
      "group": "build",
     },

     {
        "type": "shell",
        "label": "下载",
        "command": "openocd",
        "args": [
         "-f",
         "E:/openocd-20201228/OpenOCD-20201228-0.10.0/share/openocd/scripts/interface/stlink.cfg",
         "-f",
         "E:/openocd-20201228/OpenOCD-20201228-0.10.0/share/openocd/scripts/target/stm32f1x.cfg",
         "-c",
         "program build/test.elf verify reset exit"
        ],
        "problemMatcher":[
         "$gcc"
        ],
        "group": "build",
       },
        
        
        {
			"label": "启动调试器下载",
			"type": "shell",
			"command":"openocd -f interface/stlink.cfg -f target/stm32f1x.cfg"
		}
        
    ]
}

启动

打开终端,执行启动调试器下载任务。

71

72

当任务开启完成后,点击Debug图标,点击(gdb)启动

73

当出现下面的界面时说明配置成功,可以开始debug

74

注意

  • 有时候需要在cube工程重新配置一些外设,生成需要的代码,在进行编译的时候可能会出现这种错误,这是因为cube会在makefile文件的包含路径重复增加,所以直接在makefile那里直接把多余的路径删除就可以了。

    57

56

  • 如果要增加自己的一些源文件,记得在makefileC_SOURCES增加必要的说明。

    65

  • 在下载交叉编译工具链的时候可能因为下载的是新版本,所以导致了某些路径的冲突,导致环境一直安装不成功。

总结跟改进

  • vscode来开发的话,比起MDK来说还是没有那么方便,需要添加一些配置,不过好处就是编译和下载的速度会稍微快点。但是debug功能还是没有MDK的香。

  • 写新工程重新添加配置的时候,可能会因为生成的目标文件名字不同,所以有时候需要注意修改,后边如果有空可以研究写个脚本,直接把makefile要生成的target用一个统一的变量表示,以后就不用写新工程的时候去注意修改目标文件的名字。

  • windows环境下,vscode有一个非常方便的插件iotlink使用教程也十分简单。这个插件直接帮你把编译下载调试等功能设置好了,也会帮你把需要的工具链等等自动下载。不过这只限于windows

  • 有空也想在linux环境下配置一下。

参考链接

模板工程

Github链接