视频:
Acfun:VSCode开发STM32,并支持C++ - AcFun弹幕视频网 - 认真你就输啦 (?ω?)ノ- ( ゜- ゜)つロ
STM32CubeMX生成工程模板,VSCode编辑和调试程序,Make启动编译,ARM GCC编译程序,OpenOCD连接调试器。
VSCode安装C/C++插件。
安装STM32CubeMX,在这之前要先安装java,https://www.java.com/zh_CN/download/windows-64bit.jsp;再安装STM32CubeMXhttps://www.st.com/zh/development-tools/stm32cubemx.html。
安装ARM GCC,Downloads | GNU Arm Embedded Toolchain Downloads – Arm Developer。把bin文件夹加到环境变量。运行arm-none-eabi-gcc -v,测试环境变量是否正常。
安装OpenOCD,Download OpenOCD for Windows。将bin目录添加到环境变量。运行openocd -v,测试环境变量是否正常。
安装Make,Make for Windows。下载文件选择Complete package, except sources。将bin目录加到环境变量。运行make -v,测试环境变量是否正常。
使用STM32CubeMX生成一个Makefile工程。
VSCode里添加工程文件夹到工作区,写个Led闪烁的程序。
添加配置文件,这些文件在.vscode文件夹下,可直接创建同名文件。
c_cpp_properties.json文件,宏定义的芯片型号在Drivers\CMSIS\Device\ST\STM32F1xx\Include里:
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE",
"STM32F103xB"
],
"compilerPath": "bin\\gcc.exe", // 这里不完整,实际上是 arm gcc 的 gcc.exe 的路径
"intelliSenseMode": "gcc-x64"
}
],
"version": 4
}
launch.json文件:
{
"version": "0.2.0",
"configurations": [
{
"name": "ARM",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/${workspaceRootFolderName}.elf",
"cwd": "${workspaceFolder}",
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerPath": "D:/9 2019-q4-major/bin/arm-none-eabi-gdb.exe",
"setupCommands": [
{"text": "cd ${workspaceFolder}/build"},
{"text": "file ${workspaceRootFolderName}.elf"},
{"text": "target remote localhost:3333"},
{"text": "monitor reset"},
{"text": "monitor halt"},
{"text": "load"}
],
"preLaunchTask": "start",
"postDebugTask": "stop"
}
]
}
tasks.json文件,msys2等类Linux终端需要在make -j4前加上echo compile exeover&。
{
"version": "2.0.0",
"tasks": [
{
"label": "start",
"type": "shell",
"command": "make -j4; openocd -f interface/cmsis-dap.cfg -c 'transport select swd' -f target/stm32f1x.cfg",
"isBackground": true,
"problemMatcher": {
"pattern": {
"regexp": "."
},
"background": {
"activeOnStart": true,
"beginsPattern": ".",
"endsPattern": "."
}
}
},
{
"label": "stop",
"command": "echo ${input:terminate}",
"type": "shell",
}
],
"inputs": [
{
"id": "terminate",
"type": "command",
"command": "workbench.action.tasks.terminate",
"args": "terminateAll"
}
]
}
直接启动调试即可,启动调试时会自动编译并打开OpenOCD服务。调试结束后会自动关闭任务的终端,以便再次使用。
调试时会在停在主函数开头,并提示出现异常,这是个断点,在调试控制台上输出有Breakpoint 1, main ()字样。
添加需编译的文件:在Makefiel文件里,c文件在C_SOURCES下照着其它文件的路径格式写,h文件在C_INCLUDES下照着其它文件的路径格式写。
去除需编译的文件:把Makefiel文件里的头文件和源文件路径删掉,再把生成的build文件夹删掉,再重新编译。
使Makefile支持C++:
Makefile文件更改如下:
增加:
CXX_SOURCES = \
Src/File.cpp #所有的cpp文件都写在这
增加:CXX = $(GCC_PATH)/$(PREFIX)g++和CXX = $(PREFIX)g++
增加:CXXFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections
增加:CXXFLAGS += -g -gdwarf-2
增加:CXXFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"
修改:LDFLAGS = $(MCU) -specs=nano.specs -specs=nosys.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections #在-specs=nano.specs后面加-specs=nosys.specs。删除-specs=nano.specs可使用异常捕获等语法,但会使RAM增加约2KB,ROM增加约54KB
增加:
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(CXX_SOURCES:.cpp=.o)))
vpath %.cpp $(sort $(dir $(CXX_SOURCES)))
增加:
$(BUILD_DIR)/%.o: %.cpp Makefile | $(BUILD_DIR)
$(CXX) -c $(CXXFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.cpp=.lst)) $< -o $@
修改:
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
$(CXX) $(OBJECTS) $(LDFLAGS) -o $@ #用CXX替换原来的CC
$(SZ) $@
main.c不用改成main.cpp,只需把main.c要用的cpp文件里的函数改成C接口,在main.c里用extern void F(void);声明函数后即可使用。这些在cpp文件里被设为C接口的函数不能在cpp文件的h文件里直接声明。