Stm32_vscode移植教程
教程原由
本人是在 OS 平台上开发 stm32 , 虽然有SW4这样的IDE, 也可以使用模拟器运行 keil 等开发软件, 但是 vscode 强大功能且漂亮的界面实在是吸引我, 于是产生了用 vscode 进行 stm32 开发的冲动.
查了点资料之后确定可行. 于是开始了折腾, 原以为比较简单的移植, 实际上花了我不少功夫, 这方面的教程偏少且不够详细或者缺少了debug或是下载能力, 整合之后让vscode拥有完整不差于keil的编译能力又有vscode的强大的编辑能力.
成品展示
- Debug 界面
友情提醒
教程有一定难度, 为了缩短文章长度, 有的东西不会细讲.
个人水平有限, 如有错误还望指正.
软件 & 硬件
- 软件
- vscode
- GCC 编译环境
- 硬件
- stm32f407ve
- st-link
安装必要的环境
推荐使用命令行安装
- 安装 st-link 驱动
brew install stlink
- 安装 openOCD
brew install open-ocd
- 下载 GCC arm 相关C语言编译文件, 选择对应的系统版本, 并配置为环境变量(其实不配置也可以, 放一个固定位置就行), 这一步这里就不详细说明, 放上一张成功图示:
当这些都搞定了, 其实你的电脑已经具备编译和下载调试 stm32 的能力了! 但是, 如何让这些在 vscode 上运行起来呢? 教程主要内容就是在这了!
vscode的准备
在vscode的插件中搜索
-
ARM: 支持汇编语言和 ARM
-
C/C++: 支持C/C++语言编辑和调试
-
Cortex-Debug: 支持 Cortex 的 debug
到目前为止, 基本上所有 vscode 需要的插件以及软件已经就绪.
移植开始!
因为我是使用正点原子的教程入门, 所以对于正点原子的那一套文件架构有所偏爱. 所以接下来的移植基于正点原子的文件架构进行改造.
startup文件更换
因为编译方式改为了 gcc 编译, 所以对应的 startup 文件, 文件在官方的库文件具体路径为CMSIS/Device/ST/STM32XXX/Source/Template/gcc
找到对应的 startup 文件, 但是为了保留原工程对于 keil 的兼容性, 我们将文件名修改为startup_stm32f407xx.s
:
sys.c文件改写
因为原sys.c
源码中有C语言内连汇编的语句, 在不同编译器下, 表示汇编的方式略有不同, 这里直接贴上修改完成的sys.c
图片:
以上, 对于原来文件的修改已经完成. 接下来就是移植的难点和折腾点了!
Makefile & .ld & .cfg & .svd
vscode 实质上只是一个文本编辑器, 只是对于代码编辑的能力做了特化, 所以编译就交给我们安装的 arm_gcc 编译环境, 但是我们需要一个文件来告诉 gcc 编译器, 要怎么编译我们的源码, 这个文件就是Makefile
Makefile & .ld
Makefile 的编写实在让人头疼, 但是 stm 官方给出 cubemx 这个工具, 可以在里面选好芯片型号并选择Toolchain/IDE
为 Makefile 并生成工程:
其中 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
, 例: -
C_INCLUDE
就是C语言的头文件地址, 组要在目录前加上
-I
, 例:
恭喜你, 现在你已经创建好了一个可以使用的 Makefile, 用指令试试吧!
cd /YourPath/Template # cd到 Makefile 所在的目录
make all # 编译全部文件
如果编译成功, 你可以在./OBJ
文件夹下找到对应的 .bin, .hex, .elf 文件
vscode中C的配置
vscode 会在它的工作目录下新建文件夹.vscode
, 里面存放了vscode的配置文件, 我们将c_cpp_properties.json
中的includePath和defines修改为:
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"USE_STDPERIPH_DRIVER",
"STM32F40_41xxx"
],
这里其实就是让编辑器知道我们定义的全局宏和源码存放位置, 这里我们选择了让他搜索目录下所有文件, 现在, 你已经可以在vscode里happy的coding了
.cfg & .svd
.cfg 和 .svd 都是申明文件, 都是为了 debug 功能而准备, 对 debug 功能没有需求的可以不用看这里
先去这两个网站上找到你的板子的 .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的改写和一些更细节的设置, 这里篇幅有限就不例出, 想折腾的朋友自己去折腾吧, 我那天有时间再补全.