Stm32_vscode移植教程

Stm32在vscode上折腾记

Posted by Hehesheng on August 10, 2018

Stm32_vscode移植教程

教程原由

​ 本人是在 OS 平台上开发 stm32 , 虽然有SW4这样的IDE, 也可以使用模拟器运行 keil 等开发软件, 但是 vscode 强大功能且漂亮的界面实在是吸引我, 于是产生了用 vscode 进行 stm32 开发的冲动.

​ 查了点资料之后确定可行. 于是开始了折腾, 原以为比较简单的移植, 实际上花了我不少功夫, 这方面的教程偏少且不够详细或者缺少了debug或是下载能力, 整合之后让vscode拥有完整不差于keil的编译能力又有vscode的强大的编辑能力.

成品展示

  • Debug 界面

image-20180808034302110

友情提醒

​ 教程有一定难度, 为了缩短文章长度, 有的东西不会细讲.

​ 个人水平有限, 如有错误还望指正.

软件 & 硬件

  • 软件
    • vscode
    • GCC 编译环境
  • 硬件
    • stm32f407ve
    • st-link

安装必要的环境

推荐使用命令行安装

  • 安装 st-link 驱动
brew install stlink
  • 安装 openOCD
brew install open-ocd
  • 下载 GCC arm 相关C语言编译文件, 选择对应的系统版本, 并配置为环境变量(其实不配置也可以, 放一个固定位置就行), 这一步这里就不详细说明, 放上一张成功图示:image-20180808040457653

当这些都搞定了, 其实你的电脑已经具备编译和下载调试 stm32 的能力了! 但是, 如何让这些在 vscode 上运行起来呢? 教程主要内容就是在这了!

vscode的准备

在vscode的插件中搜索

  • ARM: 支持汇编语言和 ARM

    image-20180808040719251

  • C/C++: 支持C/C++语言编辑和调试

    image-20180808040917257

  • Cortex-Debug: 支持 Cortex 的 debug

    image-20180808041012930

到目前为止, 基本上所有 vscode 需要的插件以及软件已经就绪.

移植开始!

​ 因为我是使用正点原子的教程入门, 所以对于正点原子的那一套文件架构有所偏爱. 所以接下来的移植基于正点原子的文件架构进行改造.

startup文件更换

​ 因为编译方式改为了 gcc 编译, 所以对应的 startup 文件, 文件在官方的库文件具体路径为CMSIS/Device/ST/STM32XXX/Source/Template/gcc找到对应的 startup 文件, 但是为了保留原工程对于 keil 的兼容性, 我们将文件名修改为startup_stm32f407xx.s: image-20180809001813598

sys.c文件改写

​ 因为原sys.c源码中有C语言内连汇编的语句, 在不同编译器下, 表示汇编的方式略有不同, 这里直接贴上修改完成的sys.c图片: image-20180809004141564

以上, 对于原来文件的修改已经完成. 接下来就是移植的难点和折腾点了!

Makefile & .ld & .cfg & .svd

​ vscode 实质上只是一个文本编辑器, 只是对于代码编辑的能力做了特化, 所以编译就交给我们安装的 arm_gcc 编译环境, 但是我们需要一个文件来告诉 gcc 编译器, 要怎么编译我们的源码, 这个文件就是Makefile

Makefile & .ld

​ Makefile 的编写实在让人头疼, 但是 stm 官方给出 cubemx 这个工具, 可以在里面选好芯片型号并选择Toolchain/IDE为 Makefile 并生成工程: image-20180808042702544

image-20180809005646423

其中 Makefile 和 .ld 的文件就是我们需要的, 将他们复制到我们的工程文件夹下.

Makefile 中将会引用 .ld 文件, 这个文件可以声明芯片的 RAM, flash, 堆栈等等的大小, 这和 keil 中的编译的设置是非常相像的, 至于如何更改只需要将文件以文本方式打开即可, 对于熟悉单片机开发开发的人来说, 怎么修改该文件在打开的时候已经能了解大概了. 不熟悉的没关系, 一般我们也不会去随意更改那个文件. (Ps: 图中的VGT的407和我实际不同, 是我为了延时随便创建的一个新的工程, 正确应为…VETx…)

我们用 vscode 打开 Makefile 其中有几个变量需要我们自己填写

  • TARGET

    这个是你的工程名称最后将会生成TARGET.bin, TARGET.hex, TARGET.elf这三个文件名, 我们给 Template

  • BUILD_DIR

    这个变量就是编译后文件的存放目录, 我们给 OBJ

  • C_SOURCES

    就是源码 .c 文件, 我们将我们的源文件全部添加进去

  • ASM_SOURCE

    这是你的汇编原码, 也就是我们startup.s文件放得位置

  • BINPATH

    就是我们之前下载的gcc编译器的目录, 即为/YourPath/gcc-arm-none-eabi-xxxx/bin

  • C_DEFS

    在这里添加你的C语言全局宏定义, 需要在目录前加上-D, 例: image-20180809013619016

  • C_INCLUDE

    就是C语言的头文件地址, 组要在目录前加上-I, 例: image-20180809013750716

恭喜你, 现在你已经创建好了一个可以使用的 Makefile, 用指令试试吧!

cd /YourPath/Template	# cd到 Makefile 所在的目录
make all				# 编译全部文件

如果编译成功, 你可以在./OBJ文件夹下找到对应的 .bin, .hex, .elf 文件

vscode中C的配置

​ vscode 会在它的工作目录下新建文件夹.vscode, 里面存放了vscode的配置文件, 我们将c_cpp_properties.json中的includePathdefines修改为:

"includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "USE_STDPERIPH_DRIVER",
                "STM32F40_41xxx"
            ],

这里其实就是让编辑器知道我们定义的全局宏和源码存放位置, 这里我们选择了让他搜索目录下所有文件, 现在, 你已经可以在vscode里happy的coding了

.cfg & .svd

.cfg 和 .svd 都是申明文件, 都是为了 debug 功能而准备, 对 debug 功能没有需求的可以不用看这里

cfg_files

svd_files

先去这两个网站上找到你的板子的 .cfg 和 .svd 文件, 下载下来放在工程的根目录

点开这个debug_setting, 找到openocd的配置方法

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "cortex-debug",
            "request": "launch",
            "servertype": "openocd",
            "cwd": "${workspaceRoot}",
            "executable": "./firmware.elf",
            "name": "Debug (OpenOCD)",
            "device": "STM32F103RB",
            "configFiles": [
                "board/st_nucleo_f103rb.cfg"
            ]
        }
    ]
}

将它复制, 稍加修改改为

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "cortex-debug",
            "request": "launch",
            "servertype": "openocd",
            "cwd": "${workspaceRoot}",
            "executable": "./OBJ/Template.elf",
            "name": "Debug (OpenOCD)",
            "interface": "swd",
            "device": "STM32F407VE",
            "svdFile": "/YourPath/Template/STM32F40x.svd",
            "configFiles": [
                "./stm32f4x.cfg"
            ]
        }
    ]
}

其中注意一点, svdFile 对应的是 .svd 文件的绝对地址, 而不是相对地址, 否则在你 debug 的时候你将看不到你的寄存器

结语

​ 至此, 你已经完全的完成了移植, 还有一些细节性的东西以及扩展性的, 如printf的改写和一些更细节的设置, 这里篇幅有限就不例出, 想折腾的朋友自己去折腾吧, 我那天有时间再补全.