Linux环境开发stm32+vscode编码+gcc-arm编译+openocd烧录

news2024/11/17 13:47:52

文章目录

  • Linux环境下STM32开发
    • 1前言
    • 2环境搭建
    • 3点灯:
      • 脚本方式
      • 命令行操作方式具体见参考2
      • vscode将以上命令集成起来
    • 4总结

Linux环境下STM32开发

1前言

最近在使用Keil开发STM32的时候总感觉代码写起来很很费劲,然后打算用vscode试试,刚开始用的是KeilAssitance这个插件,本质还是使用Keil进行配置,vscode写代码,体验了一下感觉还是不方便。后来想到了Linux,毕竟在写代码这方面,Linux的体验还是非常棒的。综合考虑加查资料,最终决定使用Linux+vscode+STM32CubeMX+gnu-arm编译工具+openocd烧录工具的方式进行stm32的开发。

下面这一段对我启发很大,转自知乎:
工具链一般用gcc-arm-none-eabi,可以用包管理装,也可以到arm官网下,也可以自己编译,毕竟gnu源有这个配置。如果keil自带的armcc就比较缺乏调试工具。纯用命令行的话,cubemx可以生成makefile工程,改下编译器路径就能make,会生成bin文件。
用IDE的话,可以用eclipse,参考wiced sdk。可以用vscode,体验要优于sublime。网上搜搜怎么配环境,主要就是设置工具链的目录。烧录程序,如果烧的是bin的话需要一个烧录程序。用jlink的话可以用segger官网下的jlinkexe工具。用stlink的话可以用github上的stutils什么的。用cmsis-dap或者ft2232的话就只能配openocd了。如果想直接烧elf,那么就要先搭好gdb server或者jtag bridge之类的东西,比方说jlink的就是jlinkgdbserver,然后xxxx-gdb连上,用load命令下载。keil的axf没研究过怎么用。
调试的话可以用IDE,关键还是先搭好gdb server然后让IDE里的gdb连上它。剩下的体验就跟调自家程序那样了,只是这些IDE没有像keil那样的看外设寄存器之类的功能了。

2环境搭建

  1. 安装ubuntu虚拟机,用vmware即可,教程自行搜索。硬盘最好分配30G以上。系统装好以后需要安装一些必要的软件
sudo apt-get update\
sudo apt-get upgrade\
sudo apt install gcc git vim -y
  1. 安装vscode Linux版,安装过程自行搜索。

  2. 安装STM32CubeMX Linux版,安装过程自行搜索。

  3. 安装gcc-arm-none-eabi编译工具,当执行CubeMX生成的makefile时会调用该工具。sudo apt install gcc-arm-none-eabi

  4. 安装openocd,openocd是一个开源的烧录工具

3点灯:

  1. 生成代码框架

使用STM32CubeMX生成点灯程序的代码框架及初始化代码。具体可以参考网上的教程
注意-要选择生成Makefile的工程文件。

  1. 完善代码

把初始化代码加每隔1S反转一次LED代码。

20230305162328

这里还有vscode会有红色波浪线的错误提示,虽然也能正常编译,作为强迫症这是绝对不能忍的
解决方法:
在c_cpp_properties.json中加入圈起来的这段代码,重启vscode即可。也可以在C/C++的插件里设置,具体参考网上教程
20230305173608

  1. 编译

通过安装的gcc-arm-none-eabi编译工具链编译。
在新建的工程里使用make命令编译工程文件,编译后在build文件夹下会生成工程名.elf,工程名.hex,工程名.bin文件。
20230305174147

当后期项目文件中增添了新文件,可以通过修改makefile文件的方式重新构建编译规则。
一文搞懂Makefile

  1. 烧录

硬件使用野火DAP仿真器,CMSIS标准接口。软件使用openocd

openocd介绍:
OpenOCD是一种开放式片上调试器,可为嵌入式设备提供编程,调试和边界扫描测试。OpenOCD作为服务器,并通过端口3333接受来自GDB的传入连接或通过端口4444接受来自telnet的传入连接。GDB用于源文件步骤调试。telnet连接用于刷新。OpenOCD连接到 DAPLINK仿真器。DAPLINK适配器连接到目标。参考如下
https://zhuanlan.zhihu.com/p/41517198

下载openocdsudo apt install openocd
使用方式:
1通过openocd命令行
2把命令封装成shell脚本运行
3将命令集成到vscode的配置文件中
三种方式的本质都是一样的,这里主要使用shell脚本的方式

脚本方式

在gitee下载一个被人写好的脚本,直接运行脚本即可。
git clone https://gitee.com/delbertzopenocd-toolbox.git

下载完切换到该文件夹下
cd openocd-toolbox/sricpts/linux/stm32f4x # 后面这个根据自己的stm32型号选择

脚本文件如下:
20230305163231

连接好开发板和仿真器后,运行attach.sh,openocd通过端口连接DAP仿真器如下:
20230305163616

在vscode中 ctrl+ ` 调出终端,运行命令
program hex文件所在的路径
程序开始烧录

  • telnet localhost 4444 通过telnet连接openocd,DAP仿真器灯变红表示开始工作
  • program /home/lps/stm32/test01/build/test01.hex 烧录hex文件
  • reset 复位STM32
  • exit 关闭连接

命令行操作方式具体见参考2

通过运行<scripts>带参脚本命令运行Server,通用格式为
-f <interface> -f <target>
<interface>仿真器配置: 代表你的仿真器类型,DAPLINK就是interface/cmsis-dap.cfg
<target>目标板配置: 代表你的烧录的单片机类型,如STM32F407就是target/stm32f4x.cfg

支持的烧录器在/usr/share/openocd/scripts/interface
支持的芯片在/usr/share/openocd/scripts/target
如下:
20230305174736

首先连接板子执行命令

openocd -f interface/cmsis-dap.cfg -f target/stm32f4x.cfg

通过以上命令openocd打开4444端口
打开vscode ctrl + `打开终端,接下来的操作和脚本的方式一样了,参考上面脚本的方式。

vscode将以上命令集成起来

vscode通过tasks.json这个配置文件的形式,提供了类似shell脚本的方式执行自动任务。具体参考:
https://code.visualstudio.com/Docs/editor/tasks

在.vscode文件夹下新建tasks.json文件内容如下:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "make",
            "args": [
                "/home/linuz/em/stm32/Projects/HAL/HAL_LED/Makefile"//makefile路径
            ],
            "group": {
                "kind": "build"
                //"isDefault": true  配置为默认任务
            },
            "problemMatcher": []
        },
        {
            "label": "download",
            "type": "shell",
            "command": "openocd",
            "args": [
                "-f",
                "/usr/share/openocd/scripts/interface/cmsis-dap.cfg",
                "-f",
                "/usr/share/openocd/scripts/target/stm32f4x.cfg",
                "-c",
                "program /home/linuz/em/stm32/Projects/HAL/HAL_LED/build/HAL_LED.elf verify reset exit"
            ],
            "group": "build",
            "problemMatcher": []
        }
    ]
}

具体内容根据自己的路径设置即可
以上文件就是对之前用命令行的方式进行封装,只需要ctrl+shift+b即可快速执行一个任务,非常方便。

4总结

整个过程收获很大,对vscode的使用更明白了一些,同时对嵌入式开发的过程理解的更通透了。以上是我各种搜索查资料总结出来的,对配置过程有疑问的小伙伴欢迎留言讨论。

参考:

  • 1 https://blog.csdn.net/u010000843/article/details/114531922
  • 2 openocd命令操作
  • 3 vscode 有关task.json的文档

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

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

相关文章

js作用域和作用域链

1、局部作用域分为函数作用域和块作用域 1.1、函数作用域: 在函数内部声明的变量只能在函数内部被访问&#xff0c;外部无法直接访问。 总结 1.函数内部声明的变量&#xff0c;在函数外部无法被访问 2.函数的参数也是函数内部的局部变量 3.不同函数内部声明的变量无法互相访…

iscsi windows使用教程与smb das 区别

介绍——为什么不用smb而用iscsi 历史 说到SAN等传统存储设备&#xff0c;我们不得不提到SCSI&#xff0c;SCSI作为外部块设备的连接和传输协议&#xff0c;是最广泛的块设备协议&#xff0c;于1979首次提出&#xff0c;是为小型机研制的一种接口技术&#xff0c;现在已完全普…

taobao.item.joint.img( 商品关联子图 )

&#xffe5;开放平台免费API必须用户授权 关联一张商品图片到num_iid指定的商品中传入的num_iid所对应的商品必须属于当前会话的用户商品图片关联在卖家身份和图片来源上的限制&#xff0c;卖家要是B卖家或订购了多图服务才能关联图片&#xff0c;并且图片要来自于卖家自己的…

汇编指令学习(JMP、JE、JS、JP,JO,JB)

一、JMP无条件跳转不用看标志位&#xff0c;jmp后面跟一个内存地址&#xff0c;直接跳转到该地址jmp 0x0046B994二、JE&#xff08;JZ&#xff09;条件跳转当ZF标致为1的时候发生跳转&#xff0c;为0的时候不跳转&#xff0c;可以双击标志位&#xff0c;进行判断je 0x0046B99F三…

802.11 mac帧

mac帧格式帧格式MAC headFrame Control域Protocol VersionType和SubtypeTo DS和From DSMore FragmentsRetryPower ManagementMore DataProtected FrameOrderDuration/ID域Address域Address1 接收Address2 发送Address3 携带其他信息帮助mac帧传输Sequence Control域管理帧格式定…

vue3:生命周期(onErrorCaptured)

一、背景 当项目如果发生报错&#xff0c;影响程序体验。如果能以捕获的方式得到错误信息&#xff0c;而且还能定位问题&#xff0c;这样就好了&#xff0c;本文介绍onErrorCaptured实现我们想要的效果。 vue2&#xff1a;errorCaptured。使用与vue3同理。 vue3&#xff1a;…

某游戏app sig参数分析

今天要分析的app 叫 dGFwdGFwIDIuMjA= (base64 解码),来一起学习下。 找个视频接口,上来先抓个包,没错今天就是要分析下这个sig参数。 这个app 在高版本上有加固壳,并且还有frida检测(ps:遇到困难不会放弃,以后慢慢研究),这里只是研究sig参数,所以采用低版本了。 把…

ARM uboot 的移植2-从三星官方 uboot 开始移植

一、inand 驱动问题的解决 1、先从现象出发定位问题 (1) 解决问题的第一步&#xff0c;是定位问题。所谓定位问题&#xff0c;就是找到源代码当中导致这个问题的那一句或者那几句代码。有时候解决这个问题需要修改的代码和直接导致这个问题的代码是不同的。我们这里说的定位问…

一文深入分析虚拟机中对象锁实现!

一、前言 编程过程中经常会遇到线程的同步问题&#xff0c;Java 中对同步问题的解决方案比较多&#xff08;synchronized、JUC、原子操作、volatile、条件变量等&#xff09;&#xff0c;其中synchronized 最方便、简单易用&#xff0c;也是java 编程中使用最多的临界区保护方…

接口自动化入门-TestNg

目录1.TestNg介绍2、TestNG安装3、TestNG使用3.1 编写测试用例脚本3.2 创建TestNG.xml文件&#xff08;1&#xff09;创建testng.xml文件&#xff08;2&#xff09;修改testng.xml4、测试报告生成1.TestNg介绍 TestNg是Java中开源的自动化测试框架&#xff0c;灵感来源于Junit…

CSAPP第九章 虚拟内存

理解虚拟内存的原因 本章前部分描述虚拟内存是如何工作的&#xff0c;后一部分描述应用程序如何使用和管理虚拟内存 物理和虚拟寻址 虚拟内存作为缓存的工具 页表 页命中 缺页 虚拟内存作为内存管理的工具 简化链接&#xff0c;简化加载&#xff0c;简化共享&#xff0c;简化…

K8s集群部署

#部署方式有多种&#xff0c;本文采用kubeadm组件的方式来部署K8s集群 安装要求&#xff1a; 至少三台主机内存最少2G&#xff0c;CPU2核集群网络互通可以访问外网禁止swap分区 环境说明: 系统&#xff1a;ubuntu22.04.1 版本信息&#xff1a;kubernetes&#xff1a;1.26.…

HashMap底层的实现原理

目录一、知识点回顾二、HashMap 的 put() 和 get() 的实现2.1 map.put(k, v) 实现原理2.2 map.get(k) 实现原理2.3 为何随机增删、查询效率都很高&#xff1f;2.4 为什么放在 HashMap 集合 key 部分的元素需要重写 equals 方法?2.5 HashMap总结2.6 JDK8 之后&#xff0c;HashM…

由点到面贯穿整个Java泛型理解

泛型概述 Java泛型(generics)是DK5中引入的一个新特性&#xff0c;泛型提供了编译时类型安全监测机制&#xff0c;该机制允许我们在编译时检测到非法的类型数据结构。 泛型的本质就是参数化类型&#xff0c;也就是所操作的数据类型被指定为一个参数。 如我们经常使用的Array…

信息安全与数学基础-笔记-③一次同余方程

知识目录一次同余方程的解中国剩余定理中国剩余定理的应用一次同余方程的解 本文只研究一次同余方程的解。 f(x) 三 0 (mod m)&#xff0c; 若有一个s能够满足该式子&#xff0c;那么该数字就是该式子的解&#xff0c; 在同余方程式中的解一般写成&#xff1a;x三s (mod m) 同…

Git学习入门(2)- 基本命令操作总结

个人博客&#xff1a;我的个人博客&#xff0c;各位大佬来玩1 创建 git仓库1.1 从现有工作目录中初始化新仓库需要到你需要用git管理的项目中输入以下命令&#xff1a;git init便会创建一个空的git项目&#xff0c;并且当前目录下会出现一个名为 .git 的目录&#xff0c; Git 需…

1.SpringSecurity快速入门

*SpringScurity的核心功能: 认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户 授权:经过认证后判断当前用户是否有权限进行某个操作 *第一步:创建springboot工程 *第二步:引入SpringSecurity依赖 *第三步:写controller,访问对应的url:localhos…

常用训练tricks,提升你模型的鲁棒性

目录一、对抗训练FGM(Fast Gradient Method): ICLR2017代码实现二、权值平均1.指数移动平均&#xff08;Exponential Moving Average&#xff0c;EMA&#xff09;为什么EMA会有效&#xff1f;代码实现2. 随机权值平均&#xff08;Stochastic Weight Averaging&#xff0c;SWA&a…

Java Volatile的三大特性

本文通过学习&#xff1a;周阳老师-尚硅谷Java大厂面试题第二季 总结的volatile相关的笔记volatile是Java虚拟机提供的轻量级的同步机制&#xff0c;三大特性为&#xff1a;保证可见性、不保证原子性、禁止指令重排一、保证可见性import java.util.concurrent.TimeUnit;class M…

cadence专题【1】--多引脚IC如何创建orcad原理图库

cadense下载说明新建工程一、采用传统方式创建1、新建库文件2、放置pin array3、修改管脚信息二、采用电子表格方式创建1、新建库文件2、Ctrlc、Ctrlvcadense下载说明 cadence是目前最流行的EDA&#xff0c;下载装机全交给阿狸狗即可。 浏览器搜索cadence吴川斌或点击链接: ht…