嵌入式开发环境Vscode开发STM32单片机程序

news2025/1/11 5:44:24

    STM32单片机非常强大,大多数教程都是使用 keil 编译器,keil 是收费的而 gcc 是开源免费的。这里介绍一些使用 gcc + vscode 开发单片机程序的经验。(这里不解释 gcc 是什么)。

​第一:环境准备

gcc

  1. ARM 开发者官网 

    https://developer.arm.com/

我有个习惯:尽量使用免安装版软件,直接解压到软件安装目录中,添加环境变量即可使用,这样即使重装系统也不必重装软件。

把 arm-none-eabi-gcc 的 bin/ 目录添加到环境变量 Path 中就算安装完成了。打开命令行执行

arm-none-eabi-gcc -v

显示出版本信息就说明 arm-none-eabi-gcc 可以使用了。

​第二:make

我使用的 make 是从 mingw-w64 中复制出来的。

http://mingw-w64.yaxm.org/doku.php

方便单独下载 make:

https://download.csdn.net/download/qq_33523299/33634450

下载的 make 工具同样添加到环境变量 Path 中即可使用。

​第三:vscode

vscode 仅仅是个文本编辑器,没有它也能开发(txt 写代码,命令行编译)。

https://code.visualstudio.com/#alt-downloads

又是免安装版:

软件目录下新建文件夹 data/ 可以使 vscode 完全不使用 C 盘空间,所有的缓存文件都会生成在 data/ 内。

​第四:编译链接过程

Makefile 告诉 make 要干点什么,要编译谁,具体怎么编译;

make 生成相应的命令调用各个工具执行动作;

gcc 负责把 c 源文件编译成汇编;

​as 负责把 编译器生成的汇编文件和秃头程序员手撸的汇编文件都转换成二进制指令,输出到可重定位目标文件 ( *.o );

​(gcc 也可以一次完成 编译和汇编的动作, 直接用 .c 文件生成 .o 文件)

​.ld 文件是链接脚本, 告诉链接器哪段地址是内存 RAM, 哪段地址是 Flash, 哪些 RAM 分配给了栈, 哪些地址分配给了堆...

链接器把所有 .o 文件组合起来, 静态变量的地址, 函数的地址都会在这里确定, 调用函数的函数名会被替换成函数的地址...最后生成一个 elf 文件;

​虽然 elf 是可执行文件, 但裸机是没法解析 elf 文件的, 所以需要 objcopy 导出纯二进制代码, 这个二进制文件就可以直接烧录到单片机运行了, 这一步也可以输出 hex 文件;

​如果有需要还可以用 objdump 反汇编二进制文件, 也可以反汇编 elf 文件, 反汇编 .o 文件, 帮助调试.

​创建空工程

一个 ".vscode" 文件夹装一些配置,"boot" 装启动单片机的汇编文件,"cmsis" 装官方提供的源文件,"inc" 装头文件,"src" 装源文件,"output" 装输出文件,再来一个 makefile 一个链接脚本就完成了。完全没有多余的东西(txt 写代码,命令行编译的话可以删掉".vscode")。

在 makefile 所在的目录执行 "make" 就编译好了。

https://github.com/bfuxd/stm32f103EmptyProject

这是完整工程(去掉了空文件夹,去掉了输出目录),其中的 makefile 支持 windows 和 linux 。

https://github.com/bfuxd/stm32f1Template

是模板工程,添加了一些基本功能。

J-Link烧录和调试

.vscode/launch.json 里写入

{  // 使用 IntelliSense 了解相关属性。   // 悬停以查看现有属性的描述。  // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387  "version": "0.2.0",  "configurations": [    {      "name": "Cortex Debug",      "type": "cortex-debug",      "cwd": "${workspaceRoot}",      "executable": "${workspaceFolder}\\output\\template.elf",      "request": "launch",      "servertype": "jlink",      "device": "STM32F103ZE",      "interface": "swd",      "preLaunchTask": "Compile"    }  ],}

.vscode/tasks.json 里写入

{    "version": "2.0.0",    //每次执行都不启动一个新的控制台    "presentation": {        "reveal": "always",        "panel": "shared", //"new",        "echo": true    },    //设置环境变量    "options": {        "env": {            //"Path": "%Path%;D:\\ProgramFiles\\MinGW64\\bin",            "LOCAL_SRC_HOME": "${workspaceRoot}"        }    },    //任务列表    "tasks": [        {            "label": "Compile",            "command": "make",            "args": [],            "group": {                "kind": "build",                "isDefault": true            }        }    ]}

安装 J-Link 驱动后,把 J-Link 添加到环境变量 Path 中,点击 F5 就能仿真了。

还可以监视指定内存、变量、寄存器,反汇编指定函数 ……

仿真时点击 " Ctrl + Shift + P " 输入 Cortex-debug: Show disassembly 回车输入函数名, 即可在汇编中执行指定函数,  " Ctrl + Shift + P " 输入 Cortex-debug: View Memory 回车输入起始地址和数据长度, 即可查看内存中指定区域的数据.

彻底告别 keil。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创新视界论坛项目测试报告

目录 一、项目背景 1.1 项目简介 1.2 核心功能 1.3 项目要点 二、测试计划 2.1 测试环境 2.2 测试用例编写 2.2.1 功能测试 2.2.2 非功能测试 2.3 功能测试操作步骤 2.3.1 对注册页面进行测试 2.3.2 对登录页面进行测试 2.3.3 对首页页面进行测试 2.3.4 对帖子发…

SpringBoot调用ChatGPT-API实现智能对话

目录 一、说明 二、代码 2.1、对话测试 2.2、单次对话 2.3、连续对话 2.4、AI绘画 一、说明 我们在登录chatgpt官网进行对话是不收费的,但需要魔法。在调用官网的API时,在代码层面上使用,通过API KEY进行对话是收费的,不过刚…

企业架构LNMP学习笔记52

Redis安全限制: IP限制登录: 打开配置IP限制: 注意,如果有防火墙,先关闭防火墙,或者开启端口限制。 重启服务,检测是否启动成功。 远程连接测试: 密码验证: 修改配置…

成集云 | 金蝶云星辰集成聚水潭ERP(金蝶云星辰主管库存)| 解决方案

源系统成集云目标系统 方案介绍 金蝶云星辰是金蝶旗下的一款企业级SaaS管理云,其目标是帮助企业拓客开源、智能管理和实时决策。为了实现这一目标,它为企业提供了多种SaaS服务,包括财务云、税务云、进销存云、生产云、零售云、电商…

java调用天地图api获取地理信息

目录 1、注册账号登录 2、创建应用,获取key 3、查看接口示例 4、调用接口 4.1地理编码查询 4.2逆地理编码查询 天地图网址:天地图API 1、注册账号登录 2、创建应用,获取key 3、查看接口示例 4、调用接口 4.1地理编码查询 public cla…

Cesium 测量距离

Cesium 测量距离 需求分析第一种方式:使用测距 Measure第二中方式:使用 distance,自己封装第三种方式:自己封装(样式不太好) 需求 实际开发中我们经常需要用到量测工具,而Cesium没有直接提供量…

【AD操作】【原理图标注配置器】批量更新原理图的元件标签

原理图标注配置器 快捷键 T-A-A 1.调整编号顺序 2.设置起始编号 3.更新 和 执行变更 对 学习笔记,供自己复习参考。

Java基于微信小程序的自习室系统的设计,附源码、教程

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 需求分析3.1用户需求分析3.1.1 学生用户3.1.3 管理员用户 4 数据库设计4.4.1 E…

使用Chatgpt编写的PHP数据库pdo操作类(增删改查)

摘要 将PDO封装成PHP类进行调用有很多好处,包括: 1、封装性和抽象性: 通过将PDO封装到一个类中,您可以将数据库操作逻辑与应用程序的其他部分分离开来,提高了代码的组织性和可维护性。这样,您只需在一个地…

面对IT部门和业务部门跨网文件交换的不同需求,怎样才能兼顾呢?

文件交换是企业中必不可少的一环,无论是内部员工之间,还是与外部客户、供应商、合作伙伴之间,都需要频繁地进行文件的发送和接收。然而,由于企业内外网之间的隔离,跨网文件交换往往面临着诸多困难和挑战。如何在保证文…

【Verilog语法】比较不同计数器的运算方式,其中有一个数是延迟打一拍的效果,目的是使得两个计数器的结果相同。

比较不同计数器的运算方式,其中有一个数是延迟打一拍的效果,目的是使得两个计数器的结果相同。 1,第一种2,第二种3,第三种 第三种方案,完成实现。 1,第一种 (1)RTL modu…

基于Python开发的火车票分析助手(源码+可执行程序+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python开发的火车票分析助手,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含:项目源码、项目文档等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,…

企业如何使员工保持工作的积极性?

保持员工的工作积极性对于企业来说至关重要。激发员工的热情和投入度可以提高工作效率、创造力和团队合作,进而为企业带来更好的成果和竞争优势。以下是一些企业可以采取的方法来确保员工保持积极性: 提供发展机会 员工希望在职业生涯中不断成长和发展…

数据库管理-第105期 安装Database Valut组件(20230919)

数据库管理-第105期 安装Database Valut组件(20230919) 之前无论是是EXPDP还是PDB中遇到的一些问题,其实都跟数据库的DV(Database Valut)组件有关,因为目标库没有安装DV导致启动时会出现问题。 1 DV/OLS …

Seata 源码篇之AT模式启动流程 - 上 - 02

Seata 源码篇之AT模式启动流程 - 02 自动配置两个关键点 初始化初始化TM初始化RM初始化TC 全局事务执行流程TM 发起全局事务GlobalTransactional 注解处理全局事务的开启 TM 和 RM 执行分支事务IntroductionDelegatingIntroductionInterceptorDelegatePerTargetObjectIntroduct…

Linux开发工具之编辑器-vim

vim简单来说就是一款文本编辑器,用于写代码,更是一款多模式编辑器 vim的基本概念 vim有许多种模式,但是铁三角是以下三种模式:命令模式,插入模式,底行模式 1 正常/普通/命令模式(默认打开&…

搭建私人图床结合内网穿透实现公网访问,让您的摄影作品连接世界

文章目录 1. 树洞外链网站搭建1.1 下载安装树洞外链1.2 树洞外链网页测试1.3 cpolar的安装和注册 2.本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道(云端设置)2.3 Cpolar稳定隧道(本地设置) 3.公网访问测试 社交平台具有庞…

Go 语言学习总结(9)—— Go 与 Java 全面对比总结

基本语法格式 Golang: 编码风格相对统一,简单,没有太多的语法糖等,Java层次清晰,全面面向对象。 变量相关 变量的声明及使用 在Java或者PHP、Python中,声明了变量,可以不使用,也不报错。 p…

win11 新建markdown文件 添加到右键新建项 无反应(已解决)

需要操作 2 处注册表 1. win R输入【regedit】 定位路径 【计算机\HKEY_CLASSES_ROOT.md】 点击.md文件夹, 双击右侧(默认)项,将数值数据改为【Typora.md】 右键.md文件夹 > 新建 > 项,把新建的项命名为【ShellNew】 右键ShellNew > 新建 >…

基于Spring Boot+ Vue的健身房管理系统与实现

小熊学Java全能学面试指南:https://javaxiaobear.cn 摘要 随着健身行业的快速发展,健身房管理系统成为了提高管理效率和用户体验的重要工具。本论文旨在设计与实现一种基于前后端分离的健身房管理系统,通过前后端分离的架构模式,…