欢迎来到代码驿站!

C代码

当前位置:首页 > 软件编程 > C代码

使用VSCode和VS2017编译调试STM32程序的实现

时间:2020-10-12 19:23:44|栏目:C代码|点击:

近两年,微软越来越拥抱开源支持跨平台,win10搭载Linux子系统,开源VSCode作为跨平台编辑器,VS2017官方支持了Linux和嵌入式开发功能。

ST也是,近两年开发的软件工具基本都是跨平台(基于Java)的,比如STM32CubeMX,MCUFinder,STM32CubeProgrammer等。17年年底收购了truestudio的开发公司-Atollic。这个公司的IDE就是基于Eclipse使用GNU套装的。

官方都支持了,那我们有必要了解一下。要是好用,说不定就可以淘汰老旧的Keil了。

必要软件

VSCode或者VS2017。

GNU ARM Embedded ToolchainJLink或者STLink

STM32CubeMX。这个一般开发STM32的都会装。

使用思路

编译就不说了,有makefile,有gcc就可以了。

调试的话,整体的流程图如下:

  • 前端 。这里VSCode和VS2017就是封装了GDB的图形前端,这样我们使用GDB调试的时候就不需要再在命令行窗口敲指令了。
  • GDB Client。arm-none-eabi-gdb
  • GDB Server。JLink官方SEGGER提供了一个GDB server。STLink在github也有一个开源的项目。这里演示使用JLink。如果不嫌麻烦的话,也可以使用openOCD。
  • 调试器这里使用JLink,接口使用SWD。
  • 目标板芯片型号为STM32F103RCT6

VS2017

这里使用VSCode举例,但是VS2017实际上也是支持的,可以参考官方博客。这里本人做了一下尝试,发现官方还未完善。文档有多处错误,所以暂不考虑。

VSCode基本配置

这个现代化的编辑器,好处就不多说了,对比keil谁用谁知道,网上也能搜到一堆的关于它的介绍。

必要插件

C/C++为必要插件,否则无法调试。

建议安装插件

  • crustify。用来格式化代码, shift+alt+f,非常方便。缺点是代码中有Unicode可能会导致乱码,然后配置文件有点多。
  • Bracket Pair Colorizer。不同颜色高亮显示匹配括号,爱护视力必备。
  • C/C++ Clang Command Adapter。用来补全和诊断,需要同时安装Clang,参考官方文档。

JLink安装

安装完成后,目录下应该有下列文件

GNU ARM Embedded Toolchain安装

下载后,安装或者解压即可。目录下有一个bin的文件夹,可以看到有下列文件:

安装完成后,将bin文件夹路径添加到环境变量。不过这不是必要的,只是方便在命令行中使用,在vscode中使用是不需要的。

使用cube生成代码以及makefile

这里需要注意,cube的版本至少要是4.23.0。否则没有生成makefile的选项,这里使用4.24.0。在配置完成后,设置选项需要选择Makefile,如下图:

点击生成后文件目录如下:

在main.c中添加两行闪灯的代码:

 while (1)
 {
  HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
  HAL_Delay(500);
  Counter++;

 /* USER CODE END WHILE */
 /* USER CODE BEGIN 3 */

 }

至此,整个工程就搭建好了。

编译

官方生成了makefile,那么只要执行make就可以了。makefile的语法,网上可以找到很多的教程,这里不细说。

就目前的工程,想要make成功,改一句话即可使用,即指定gcc的路径。我的路径如下:

BINPATH = D:/GNU_ARM_TOOLS/2016q3_Version_5_6/bin

修改后,打开命令行,输入make即可。如果,提示make不是内部或者外部命令,那你还需要安装GNU make,这个可自行搜索下载。

如果配置成功,应该能看到下面的画面:

这样,在build目录下面可以找到blink.hex,blink.elf,blink.bin这几个文件。至此,编译成功。
其实,即使不使用cube生成Makefile,我们也可以自己写一个,或者使用CMake。但是,使用官方的文件,会统一大家的程序结构,以后移植或者开源也更容易。

而且,官方的Makefile结构比较清晰,熟悉Keil工程配置的人,其实很容易接受。

下载

可以使用JFlash直接烧录

如果没什么问题的话,复位之后,目标板的led应该已经开始闪烁了。

调试

这里是重点。

1.运行GDB server

我这里是在windows平台下,JLink提供的GDB server有一个图形客户端。Linux平台下使用命令行版本,也是一样的。

打开JLinkGDBServer.exe,配置连接好后,应该看到下面的界面

这个server一直开着就行,注意上面的端口号2331,后面要用到。

2.测试GDB

由于VSCode的配置文件中使用了较多的GDB指令,这里使用命令行先演示一下,方便理解,也刚好测试GDB是否正确安装。

在命令行输入arm-none-eabi-gdb,应该看到如下画面,否则你的GNU套装没安装好,或者没添加到环境变量

继续输入下面的指令:

此时,应该也看到led灯在闪烁了。

简单解释这几个指令,详细的可以自行搜索gdb的教程,或者查看GNU套件安装目录下的文档。

  • target remote :2331 :连接到GDB server。
  • file : 载入目标文件到gdb。
  • load : 下载文件到目标板。
  • c : 运行到下一个断点,如果没有断点,会一直运行
  • monitor reset : 传递命令reset给JLink GDB server。

monitor 后面的参数不是gdb的指令,而是gdb server的(这里就是JLink Server的),这里参考JLink的文档(在安装目录下有),可以接受如下指令

常用的也就是reset了。

3.配置VSCode调试

在vscode的窗口按下F5,弹出来的窗口选择gdb

官方给了默认配置,需要修改成我们自己的。这里改动比较多,具体的配置参数需要参考两个地方,一个是vscode的官网
,一个是cpp插件的github文档

最终我们的配置如下:

{
  // 使用 IntelliSense 了解相关属性。 
  // 悬停以查看现有属性的描述。
  // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [

    {
      "name": "blink Launch",
      "type": "cppdbg",
      "request": "launch",
      "targetArchitecture": "arm",//虽然官方说弃用了,但实际上必须指明
      "program": "blink", // 采用了自定义的设置,这里没啥用了
      "args": [""],
      "stopAtEntry": true,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": true,
      "MIMode": "gdb",
      "miDebuggerPath": "D:/GNU_ARM_TOOLS/2016q3_Version_5_6/bin/arm-none-eabi-gdb.exe",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ],
      "launchCompleteCommand": "None",
      "miDebuggerServerAddress": "localhost:2331",
      "customLaunchSetupCommands": [
        {
          "text": "target remote :2331",
          "description": "connect to server",
          "ignoreFailures": false
        },
        {
          "text": "file F:/STM32/led/blink/build/blink.elf",
          "description": "load file to gdb",
          "ignoreFailures": false
        },
        {
          "text": "load",
          "description": "download file to MCU",
          "ignoreFailures": false
        },
        {
          "text": "monitor reset",
          "description": "reset MCU",
          "ignoreFailures": false
        },
        {
          "text": "b main",
          "description": "set breakpoints at main",
          "ignoreFailures": false
        },
      ]
    }
  ]
}

再次按下F5后,效果如图:

这个配置中,最重要的就是customLaunchSetupCommands中的设置,有了上面gdb再命令行的演示,就很容易理解了。

总结

这里只是搭建了一个最简单的功能,使用上确实比Keil繁琐很多,而且有些实用功能没有实现,比如说live watch,比如说查看寄存器内容。如果有人专门针对VScode或者VS2017开发一个插件,那么最终的调试功能就和Keil一样强大了。
加上VScode强大的编辑能力,那么Keil除了ARMCC还可以让人留恋一下,其他部分就都可以抛弃了。

提升

想要在实际工程中使用vscode + GNU的组合,还需要提升几部分:

  • makefile。需要增加更多功能,比如下载,比如分开release和debug等,比如增量编译等。
  • 使用task。vscode的task功能是很强大的,不用浪费。
  • 开发插件。如上所提,调试功能还是差keil不少。

在github上已经有了一个插件的开源项目,实现了类似keil的部分功能,名字叫做cortex-debug,不过功能还不够完善,先关注着。

上一篇:堆排序算法(选择排序改进)

栏    目:C代码

下一篇:使用C/C++语言生成一个随机迷宫游戏

本文标题:使用VSCode和VS2017编译调试STM32程序的实现

本文地址:http://www.codeinn.net/misctech/10500.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有