当前位置: 首页 > article >正文

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


http://www.kler.cn/a/505119.html

相关文章:

  • C++并发编程之std::async的异常安全性
  • 【Vim Masterclass 笔记13】第 7 章:Vim 核心操作之——文本对象与宏操作 + S07L28:Vim 文本对象
  • Python编程与在线医疗平台数据挖掘与数据应用交互性研究
  • 深入浅出 OpenResty
  • MySQL 中删除重复数据 SQL 写法
  • 【Rust】控制流
  • Spring官网构建Springboot工程
  • 【llama_factory】qwen2_vl训练与批量推理
  • DAMA GDPA 备考笔记(二)
  • 3.flask蓝图使用
  • 【优选算法篇】--双指针篇
  • C# PDF下载地址转图片(Base64 编码)
  • Ubuntu/centOS 如何安装 OpenGL
  • Web前端------HTML多媒体标签之图片标签
  • 开始使用Panuon开源界面库环境配置并手写VS2019高仿界面
  • 网安——计算机网络基础
  • 【HTML+CSS+JS+VUE】web前端教程-35-字体图标
  • 【AI】【RAG】如何通过WebUI部署与优化RAG问答系统
  • 深度探索:Go 语言日志增强工具 Devslog 的全面解析
  • 配置Kubernetes从节点与集群Calico网络
  • Java算法 数据结构 栈 单调栈实战 模版题 [洛谷-P5788]
  • WOA-CNN-LSTM-Attention、CNN-LSTM-Attention、WOA-CNN-LSTM、CNN-LSTM四模型对比多变量时序预测
  • Android 播放SMB共享视频
  • ImageSharp图形库学习
  • Docker 部署 Typecho
  • 期权懂|场内期权合约行权价格是如何设定制度的?