玩过单片机的都知道,Keil是一款收费软件,虽然有相应的方法可以正常使用,但还是少不了很多麻烦,并且keil的界面对于我们开发者来说非常不友好。那么这时VSCode的出现就很好的解决了这一问题。今天我们就来使用VSCode搭建STM32的开发环境。
老样子,后台回复“stm32”领取本节相关文件。
工具下载及环境配置
1、STM32CubeMX, ST官方的初始化代码生成工具
2、Visual Studio Code,代码编辑器
3、MingGW,gcc,主要用于make
4、GNU Arm Embedded Toolchain,交叉编译工具链
5、OpenOCD,烧录工具
其中MingGW,GNU Arm Embedded Toolchain,openocd需要将其解压后的bin目录添加要path环境变量
MingGW中需要进入到x:\mingw64\bin目录下(x代表解压后的存放盘符),将mingw32-make.exe复制一份,修改为make.exe
添加完成后通过命令行测试是否成功
make -v
arm-none-eabi-gcc -v
openocd -v
如配置正确,将会得到相应的版本信息。
VSCode插件安装
1、C/C++ Extension Pack
2、Cortex-Debug
3、One Dark Pro(主题插件)
4、vscode-icons(文件图标插件)
5、Rainbow Brackets(彩虹括号插件)
其中前两个为必须安装,后三个强烈建议,但可不用
#使用STM32CubeMX生成初始化代码
在Project Manager中的Toolchain/IDE选择Makefile(如下图),其余时钟外设等该怎么配置就怎么配置,配置好后点GENERATE CODE 生成。
使用VSCode开发
生成后使用VSCode打开文件夹,文件如下
这时我们打开Makefile,可以看到宏定义,以及头文件和源文件
我们随机打开一个.c文件,可以看到有非常多波浪线的错误提示,虽然不影响编译,但是看着总是有点不舒服,只是因为VSCode不知去哪里索引。这时我们按下ctrl+shift+p快捷键,输入 c/c++自动弹出
我们点击编辑配置(JSON),会在.vscode下自动创建一个c_cpp_properties.json文件,将Makefile中的两个宏定义添加到c_cpp_properties.json文件的defines处,删去前面的-D,同时核对自己的compilerPath路径是否正确,此为MinGW的gcc路径,最后修改后的如下所示
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE",
"USE_HAL_DRIVER",
"STM32L475xx"
],
"windowsSdkVersion": "10.0.19041.0",
"compilerPath": "D:/mingw64/bin/gcc.exe",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-arm",
"configurationProvider": "ms-vscode.makefile-tools"
}
],
"version": 4
}
之后打开终端,输入make即可编译,成功生成bin和hex文件,如果觉得输出的信息太乱,可以设置为静默编译,修改Makefile文件,在命令前加@,同时echo当前编译的文件
$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)
@echo "build $<"
@$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)
@echo "build $<"
@$(AS) -c $(CFLAGS) $< -o $@
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
@echo "build $<"
@$(CC) $(OBJECTS) $(LDFLAGS) -o $@
$(SZ) $@
最后的效果如下图所示
由于window并不支持-rm -fR命令,所以需要将Makefile文件中的clean命令做相应修改
clean:
del /Q $(BUILD_DIR)
之后我们可以通过命令make clean测试一下,发现成功删除编译生成的文件。
使用openocd烧写代码
目录openocd-20211118\OpenOCD-20211118-0.11.0\share\openocd\scripts\interface 下载器的配置文件
目录openocd-20211118\OpenOCD-20211118-0.11.0\share\openocd\scripts\target 芯片的配置文件
在以上两个目录中找到你所使用的烧写器的配置文件和芯片配置文件,我使用的是stlinkv2和stm32l475
将他们复制到你的工程目录下
在前面的编译中,敲命令的方式多少有点繁琐,所以我们将其添加为一个任务,通过点击这个任务按钮完成编译及下载等操作。
在VSCode中的终端->运行任务->添加配置任务->使用模板创建tasks.json文件->others,编辑tasks.json文件
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "make",
"args": [
],
"group": "build"
},
{
"label": "download",
"type": "shell",
"command": "openocd",
"args": [
"-f",
"stlink-v2.cfg",
"-f",
"stm32l4x.cfg",
"-c",
"program build/Test_L475.elf verify reset exit"
],
"group": "build"
}
]
}
之后可以在终端->运行任务中多出build和download两个选项,点击即可相应的构建及下载代码。
配置单步调试
在最左侧的debug标签点击创建launch.json文件,选择Cortex Debug会生成一个初始模板。
点击添加配置,选择Cortex Debug:OPENOCD会自动添加一个代码修改模板,对它的参数进行修改。
{
"version": "0.2.0",
"configurations": [
{
"cwd": "${workspaceRoot}",
"executable": "./build/Test_L475.elf",
"name": "Debug with OpenOCD",
"request": "launch",
"type": "cortex-debug",
"servertype": "openocd",
"configFiles": [
"stlink-v2.cfg",
"stm32l4x.cfg"
],
"showDevDebugOutput": "none"
// "svdFile": "./STM32L4x5.svd" //此为片上外设寄存器文件,可不添加
}
]
}
配置完后,设置断点,按F5进入调试模式,即可调试自己的程序。
完成以上所有配置后,即可完全摆脱keil,使用VSCode开发STM32
注意事项
在gcc里面重定向用的不是fputc,重定向函数为
int _write(int file, char *ptr, int len)
{
HAL_UART_Transmit(&huart1, (uint8_t *)ptr, len, 0xFFFF);
return len;
}
添加后即可使用串口打印