VSCode开发STM32,并支持C++

视频:

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文件里直接声明。

### 配置 VSCode 进行 STM32 开发 #### 安装必要的扩展 为了使 VSCode 成为强大的 STM32 开发平台,安装一系列特定的扩展是必不可少的操作。这些扩展可以增强编辑器的功能,提供诸如语法高亮、调试支持等功能[^1]。 对于 Ubuntu 用户来说,除了上述提到的基础设置外,还需要确保系统已经安装了 `gcc-arm-none-eabi` 编译链以及其他依赖项来构建和烧录程序到目标设备上[^2]。 #### 创建新的项目结构 当一切准备就绪之后,可以通过创建一个新的文件夹作为项目的根目录,在此基础上建立所需的子文件夹用于存放源码(.c/.h)和其他资源文件。此外还需编写 Makefile 来定义编译规则以便于后续操作[^3]。 ```makefile # 示例 Makefile 片段 CC = arm-mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb LDFLAGS = -T$(LDSCRIPT) OBJS = main.o system_stm32f4xx.o ... all: $(PROJECT).elf clean: rm -rf *.o *~ $(PROJECT).elf ``` #### 初始化 C/C++ 扩展配置 通过 `.vscode/settings.json` 文件自定义工作区内的 IntelliSense 设置,例如指定包含路径、宏定义等参数以适应当前硬件平台的需求。 ```json { "configurations": [ { "name": "STM32", "includePath": ["${workspaceFolder}/**", "/usr/local/include"], "defines": [], "compilerPath": "/path/to/gcc-arm-none-eabi/bin/arm-none-eabi-gcc" } ], "version": 4 } ``` #### 添加启动脚本 (launch.json) 为了让开发者能够在 IDE 内直接运行和调试应用程序,应该利用 launch.json 文件中的预设模板完成 GDB 调试会话的相关设定。 ```json { "version": "0.2.0", "configurations": [ { "type": "cppdbg", "request": "launch", "program": "${workspaceRoot}/${TARGET}.elf", "miDebuggerPath": "/path/to/gdb-multiarch", "setupCommands": [ { "text": "-enable-pretty-printing" }, { "text": "target extended-remote :3333" } // 假定使用 ST-Link V2 探针连接至目标板卡上的 SWD 接口 ] } ] } ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值