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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/954562.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32 物联网智能家居 (三) 输入子系统

STM32 物联网智能家居 (三) 输入子系统 下面是物联网智能家居的输入子系统&#xff0c;见下图&#xff0c;在输入子系统中会实现按键输入、网络输入、标准输入Scanf&#xff0c;其中的网络输入放入到网络子系统中进行讲解。 一、输入子系统核心功能 STM32 物联网智能家居输入…

Windows 正确配置android adb调试的方法

下载适用于 Windows 的 SDK Platform-Tools https://developer.android.google.cn/tools/releases/platform-tools?hlzh-cn 设置系统变量&#xff0c;路径为platform-tools文件夹的绝对路径 点击Path添加环境变量 %adb%打开终端输入adb shell 这就成功了&#xff01;

【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理

【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理 项目背景项目实现推理过程训练过程 项目展望写在最后项目下载链接 本文为原创文章&#xff0c;若需要转载&#xff0c;请注明出处。 原文地址&#xff1a;https://blog.csdn.net/qq_30270773/article…

线性回归超详解

目录 一、回归问题 vs 分类问题 二、线性回归 1、一句话理解 2、数学推导 2.1 线性函数表示 2.2 损失函数 2.3 梯度下降 2.3.1 什么是梯度 2.3.2 梯度下降目标 2.3.3 过程 2.3.4 迭代公式 3、特征预处理 3.1 为什么要预处理 3.2 数据归一化方法 1&#xff09;最小…

docker 部署 Kafka 单机和集群

一、准备工作 安装 Docker 确保本机已安装 Docker。可以通过以下命令检查 Docker 是否已安装&#xff1a;docker --version如果未安装&#xff0c;可以访问 Docker 官网下载并安装 Docker Desktop&#xff08;Windows 和 Mac&#xff09;或使用包管理器安装&#xff08;Linux&…

Uniapp开发安卓App,配置第一次打开软件出现的弹窗-隐私政策提示框

这里是直接使用的uniapp官方所提供的“原生隐私政策提示框”&#xff0c;废话不多说&#xff0c;直接上教程&#xff01; 1.manifest.json—>安卓/IOS启动界面配置—>勾选“使用原生隐私政策提示框”2.勾选后&#xff0c;在你的项目下就会出现一个文件&#xff0c;andro…

微信小程序:播放音频

在小程序开发中&#xff0c;音频播放是一个重要的功能。本文将详细介绍小程序音频播放的相关知识点&#xff0c;帮助开发者更好地掌握小程序音频播放的实现方法。 一、小程序音频播放的基本流程 在小程序中&#xff0c;音频播放的基本流程如下&#xff1a; 获取音频数据&#…

Unity解决滑动条的value值的滑动条消失问题

在这里我们看到原本的value的滑动条消失了 解决办法 把编辑器的边框往外面拉一下就可以了&#xff08;之前遇到这个问题还重启了几次unity没想到居然是这个问题&#xff09;

Mac上安装Label Studio

在Mac上安装Anaconda并随后安装Label Studio&#xff0c;可以按照以下步骤进行&#xff1a; 1. 在Mac上安装Anaconda 首先&#xff0c;你需要从Anaconda的官方网站下载适用于Mac的安装程序。访问Anaconda官网&#xff0c;点击“Download Anaconda”按钮&#xff0c;选择适合M…

微软震撼发布:Phi-4语言模型登陆Hugging Face

近日&#xff0c;微软公司在Hugging Face平台上正式发布了其最新的语言模型Phi-4&#xff0c;这一发布标志着人工智能技术的又一重要进步。Phi-4模型以其140亿参数的高效配置&#xff0c;在复杂推理任务中表现出色&#xff0c;特别是在数学领域&#xff0c;更是展现出了卓越的能…

使用WebdriverIO和Appium测试App

1.新建项目 打开Webstorm新建项目 打开终端输入命令 npm init -y npm install wdio/cli allure-commandline --save-dev npx wdio config 然后在终端依次选择如下&#xff1a; 然后在终端输入命令&#xff1a; npm install wdio/local-runnerlatest wdio/mocha-frameworkla…

【opencv】第7章 图像变换

7.1 基 于OpenCV 的 边 缘 检 测 本节中&#xff0c;我们将一起学习OpenCV 中边缘检测的各种算子和滤波器——Canny 算子、Sobel 算 子 、Laplacian 算子以及Scharr 滤波器。 7.1.1 边缘检测的一般步骤 在具体介绍之前&#xff0c;先来一起看看边缘检测的一般步骤。 1.【第…

浙江安吉成新照明电器:Acrel-1000DP 分布式光伏监控系统应用探索

安科瑞吕梦怡 18706162527 摘 要&#xff1a;分布式光伏发电站是指将光伏发电组件安装在用户的建筑物屋顶、空地或其他适合的场地上&#xff0c;利用太阳能进行发电的一种可再生能源利用方式&#xff0c;与传统的大型集中式光伏电站相比&#xff0c;分布式光伏发电具有更灵活…

Linux检查磁盘占用情况

1.检查使用情况 df -h发现是/dev/vda1占用很高 2.查看/dev/vda1文件夹 cd /dev/vda1发现不是文件夹 3.继续查看使用情况 df -h *4.原因可能是文件已经删除但是进程还在&#xff0c;没有释放空间 5.查看删除操作的进程 lsof -n | grep deleted6.杀死进程 kill -9 PID

向量数据库Milvus详解

向量数据库Milvus详解 0. 什么是向量数据库? 在现实世界中,并非所有数据都可以整齐地放到行和列中。在处理图像、视频和自然语言等复杂的非结构化数据时尤其如此。这就是向量数据库的用武之地。 向量数据库是一种以高维向量的形式来存储数据的数据库,这些向量本质上是表示…

海豚调度DolphinScheduler-3.1.9配置windows本地开发环境

源代码下载地址https://dolphinscheduler.apache.org/zh-cn/docs/3.1.9 1.Zookeeper安装与使用 如图下载解压zookeeper安装包&#xff0c;并创建data和log目录 下载地址 https://archive.apache.org/dist/zookeeper/zookeeper-3.6.4/apache-zookeeper-3.6.4-bin.tar.gz 进入…

springCloudGateway+nacos自定义负载均衡-通过IP隔离开发环境

先说一下想法&#xff0c;小公司开发项目&#xff0c;参考若依框架使用的spring-cloud-starter-gateway和spring-cloud-starter-alibaba-nacos, 用到了nacos的配置中心和注册中心&#xff0c;有多个模块&#xff08;每个模块都是一个服务&#xff09;。 想本地开发&#xff0c;…

大模型训练_硬件微调知识增强

目录 关键硬件 大模型类型 垂域训练技术 微调技术 领域大模型训练trick 知识增强 关键硬件 GPU GPU擅长处理图形渲染和数据并行任务&#xff0c;可以同时处理大量的矩阵运算&#xff0c;在科学计算、人工智能、游戏开发等领域应用广泛。 显卡 显卡是一种完整的硬件设…

linux分配磁盘空间命令

使用命令lsblk查询linux磁盘空间时&#xff0c;发现空间并没有被分配完 如图&#xff0c;600G&#xff0c;但实际分配了一共199G&#xff0c;剩余500G&#xff0c;我们需要通过命令进行剩余存储的分配。 思路&#xff1a;创建新的分区->更新内核分区表->初始化新分区作…

【运维自动化-作业平台】魔法变量到底如何使用之主机列表类型

蓝鲸作业平台&#xff0c;以下简称作业平台或JOB平台 魔法变量&#xff1a;JOB平台执行引擎提供的特有的变量能力用法 脚本中使用&#xff0c;并且需要事先声明&#xff1a;job_import {{变量名}} 声明后&#xff0c;同样是使用 dollar 符 大括号&#xff1a;${变量名}来取值…