VSCode ARM CortexM 开发

news2025/1/11 16:50:40

VSCode ARM CortexM 开发: http://coffeelatte.vip.cpolar.top/post/software/applications/vscode/vscode_arm_cortexm_开发/

文章目录

  • VSCode ARM CortexM 开发: <http://coffeelatte.vip.cpolar.top/post/software/applications/vscode/vscode_arm_cortexm_%E5%BC%80%E5%8F%91/>
    • 1. Embedded IDE
      • 1.1. 安装工具链
      • 1.2. 项目配置
      • 1.3. 编译和下载
    • 2. 调试
    • 3. 国产芯片及 CMSIS-DAP 调试器的支持
      • 3.1. PyOCD 的安装
      • 3.2. 关于 PyOCD 的扩展说明
      • 3.3 PyOCD 常用命令
    • 4. 常见问题解决
      • 4.1. GCC 链接错误 引用未定义函数 _read _write _sbrk

VSCode 的嵌入式开发插件具备了相当多的功能,这里主要使用 Embedded IDE,这是一个支持 MCU 开发的工具,但不具备调试功能,为了调试 ARM Cortex-M MCUs,可以配合安装 Cortex-Debug 插件。这两个插件直接在扩展商店进行搜索安装即可,下面主要介绍使用方法。

1. Embedded IDE

Embedded IDE 集成了 MCU 项目创建,固件和工具下载等功能。安装完毕后在 VSCode 图标面板中会出现 EIDE 图标,EIDE 即 Embedded IDE 的缩写。

点击 EIDE 图标,将出现“New Project”、“Open Project”、“Import Project”项目按钮,以及“Configure Toolchain”、“Setup Utility Tools”、“Open plug-in Settings”选项菜单。

EIDE

“New Project” 可用于创建新 MCU 工程,“Import Project” 可以将 Keil、IAR 或 Eclipse 类 IDE(如 STM32Cube IDE) 工程导入到 EIDE 环境中。“New Project” 和 “Import Project” 都有很好的引导界面,使用起来很方便。

EIDE 会跟随 VSCode 的语言配置展示为英文或中文菜单,如果没有自动跟随,可以点击 “Open plug-in Settings” 后,在配置中切换 EIDE 界面语言。

这里我们假设已经创建或导入了一个 ARM Cortex M 工程,接下来看一下工程配置及开发工具链的安装。

1.1. 安装工具链

工具和配置

在 EIDE 的“Builder Configurations”和“Flasher Configurations”下可以看到默认使用了 GCC 编译器和 JLink 调试器。如果你的系统中已经直接或间接的安装了这两个工具,那可以到“Open plug-in Settings”下配置好相关工具的路径。

如果没有安装这两个工具,则可以点击“Setup Utility Tools”进行安装:

安装工具

EDID 不支持工具卸载功能,实际上,这些工具默认下载并解压在 “ u s e r R o o t / . e i d e / t o o l s ”目录下(“ {userRoot}/.eide/tools” 目录下(“ userRoot/.eide/tools目录下({userRoot}”即当前的用户目录)。如果需要卸载,则直接到该目录下删除对应工具即可。

EDID 也支持使用 AC5、AC6、IAR 等编译器,以及 STLink、pyOCD 等下载器,可以点击“Builder Configurations”和“Flasher Configurations”后面的切换按钮进行更换。

工具切换

注:使用“Setup Utility Tools”安装的 GCC 包在使用时会造成 FreeRTOS 堆栈大很多(TCB 中的 struct _reent xNewLib_reent 结构有问题,runtime 的问题),解决办法是使用 STM32Cube IDE 中的 GCC 进行替换(点此下载)。

1.2. 项目配置

有了编译器和调试器工具,就可以编译并下载程序。但是,在此之前需要先进行项目配置,除了配置编译器和下载器以外,需要配置“Chip Support Package”、“Builder Configurations”、“Flasher Configurations”和“Project Attributes”。

如果某项目无法咱开,则点击项目后边的“+”号进行添加即可:

添加配置

先添加一个“Chip Support Package”,“From Repo”会从网络上自动下载相关 pack 包,“From Disk”则可以选择硬盘上一个已经下载好的 pack 包。相关资源可能在 github 上,所以网络安装需要些特殊工具支持。如果失败,可以多尝试几次。

添加STM32F103

继续点击加号添完成“Chip Support Package”和“Builder Configurations”、“Flasher Configurations”的添加。配置好“Chip Support Package”后会自动完成 Svd 的配置,有了 Svd 才可以调试外设。

GCC 需要配置“Linker Script File Path”,这个是 LD 连接文件,该文件可以来自 STM32 Cube,或者示例参考工程。如果是 Keil 的 ACx 编译器,则可以使用默认连接脚本(将“USe Custom Linker Script File”置为 false)。IAR 编译器需要配置 icf 格式的连接文件。

基本配置

“Flasher Configurations”以 OpenOCD 为例,需要配置“Chip Config”和“Interface Config”,所谓“Chip Config”即指芯片的配置,“Interface Config” 指使用哪种调试器,这里使用的是 DAP 调试器,如果是 stlink 或 jlink 只要按需修改即可。

如果是导入的项目,不添加“Chip Support Package”也可以正常编译和下载、调试,只是调试时不支持查看外设寄存器。

“Project Attributes” 中可以配置 Include Path、Library Path 和 全局宏等。

Project Attributes

其他项目一般会自动配置,如有差异则按需变更即可。

1.3. 编译和下载

安装好依赖工具并做好项目配置后就可以编译并下载程序,点击项目右侧的按钮即可:

编译和下载

2. 调试

Embedded IDE 不具备调试功能,需要 Cortex-Debug 扩展插件。Cortex-Debug 可以与 EIDE 进行很好的配合,一般不需要进行额外的配置。当变更 EIDE 的“Flasher”后即会自动生成 VSCode 调试脚本。然后按 F5 进行调试即可。

Cortex-Debug 会自动安装 RTOS Views 以及其他一些依赖插件,如果提示自动安装,点击允许即可。

RTOS Views 支持 RTOS 调试功能,比如查看系统中的 Task 等。

3. 国产芯片及 CMSIS-DAP 调试器的支持

通常国产芯片会提供 Keil 的 pack 文件,以及 JTAG 扩展支持该芯片的方法。因此如果使用 Keil+DAP 或者使用 EIDE+JTAG 均可下载和调试。但使用 EIDE+DAP 就需要变通一下,因为 EIDE 所支持的调试器中并没有 Keil 中的 CMSIS-DAP 选项,只有 OpenOCD 和 PyOCD。而想让 OpenOCD 支持某款芯片就要编写该芯片的 Flash 算法,这个方法有些复杂。

而 PyOCD 则可以直接使用 Keil 的 pack 文件,通过这种方式使 EIDE 支持国产芯片更加普遍适用,并且易于实现。同时在 EIDE 的“Chip Support Package”中也可以通过文件加载 pack 文件来获取国产芯片的型号支持。

3.1. PyOCD 的安装

既然是 Py 开头的,那一定使需要用到 Python,Windows 下从官网下载好 Python3,或者 Linux 下使用命令进行安装后(需要安装 pip)后,通过 pip 命令安装 PyOCD 即可:

# 配置 pip 使用阿里云镜像.
pip config set global.index-url http://mirrors.aliyun.com/pypi/simple/
pip config set global.trusted-host mirrors.aliyun.com
pip config set global.timeout 120
# 安装 PyOCD.
pip install pyocd

需要注意的是,Windows 下不要使用 MSYS2 这类环境下的 python 和 pip,容易安装失败。

之后使用

pyocd --version

验证安装是否成功。

然后将 EIDE 中的“Flasher Configurationgs” 配置为 pyOCD。点击“Flasher Configurationgs->Other Options”,将打开“debug.pyocd.yaml”文件,向该文件添加:

pack:
  - /Abs/Path/To/Company.Family_DFP.Version.pack

之后重启 Vscode,便可在 EIDE 的 “Flasher Configurationgs->Target Name”中选择 pack 文件中的芯片,并进行调试。

PyOCD 能够自动识别 CMSIS-DAP 等多种调试器,不需要再 EDID 中设置调试器种类。

3.2. 关于 PyOCD 的扩展说明

以上使用 pack 包的方法是基于 PyOCD 对 pack 包的手动管理。PyOCD 支持两种手动管理 pack 包的方式,官方原文说明如下:

Manual pack usage

If you prefer to manually manage packs, or if the managed pack system cannot access online packs from your network, you can download them yourself from the official CMSIS-Pack list. The downloaded pack files can be stored wherever you like. Typically you would group them in a single common directory. Another good option is to place the pack file used with a project in a project-relative location.

There are two ways to use a manually downloaded pack.

The simplest option is to pass the --pack option to the pyocd tool, specifying the path to the .pack file. PyOCD does not cache any information about packs used this way, so this argument must be passed for every invocation in addition to the other arguments. For instance, to run the GDB server, you might execute pyocd gdbserver --pack=Keil.STM32L4xx_DFP.2.2.0.pack. Note that you can pass multiple --pack arguments to pyOCD, which might be useful in a scripted execution of pyOCD.

For a more permanent solution, use a pyocd.yaml configuration file. In the config file, set the pack session option to either a single .pack file path or a list of paths. Now when you run the pyocd tool, it will automatically pick up the pack file(s) to use.

Here is an example config file that lists two packs.

pack:
  - /Users/admin/CMSIS-Packs/Keil.STM32L0xx_DFP.2.0.0.pack
  - /Users/admin/CMSIS-Packs/NXP.MKV58F24_DFP.11.0.0.pack

To see the targets provided by a .pack file, run pyocd list --targets and pass the approprate --pack option or use a config file, as described above.

Note: .pack files are simply zip archives with a different extension. To examine the contents of a pack, change the extension to .zip and extract.

Note: PyOCD can work with expanded packs just like zipped .pack files. Pass the path to the root directory of the pack using the --pack argument, as above. This is very useful for cases such as development or debugging of a pack, or for working with other CMSIS-Pack managers that store packs in decompressed form.

PyOCD 的 yam 配置文件说明如下:

Config file

pyOCD supports a YAML configuration file that lets you set session options that either apply to all probes or to a single probe, based on the probe’s unique ID.

The easiest way to use a config file is to place a pyocd.yaml file in the project directory. An alternate .yml extension and optional dot prefix on the config file name are allowed. Alternatively, you can use the --config command line option, for instance --config=myconfig.yaml. Finally, you can set the config_file option. If there is a need to prevent reading a config file, use the --no-config argument.

The top level of the YAML file is a dictionary. The keys in the top-level dictionary must be names of session options, or the key probes. Session options are set to the value corresponding to the dictionary entry. Unrecognized option names are ignored.

EIDE 中的 debug.pyocd.yaml 属于项目级的配置文件。

PyOCD 安装了 CMSIS Pack Manager,其位置在用户目录下

C:\Users\<User Name>\AppData\Local\cmsis-pack-manager\cmsis-pack-manager

3.3 PyOCD 常用命令

pyocd pack find <part keyword>
pyocd pack install <part number>

4. 常见问题解决

4.1. GCC 链接错误 引用未定义函数 _read _write _sbrk

d:/gcc-arm-none-eabi-4_9/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc_nano.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'
d:/gcc-arm-none-eabi-4_9/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc_nano.a(lib_a-writer.o): In function `_write_r':
writer.c:(.text._write_r+0x10): undefined reference to `_write'
d:/gcc-arm-none-eabi-4_9/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc_nano.a(lib_a-closer.o): In function `_close_r':
closer.c:(.text._close_r+0xc): undefined reference to `_close'
d:/gcc-arm-none-eabi-4_9/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc_nano.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'
d:/gcc-arm-none-eabi-4_9/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc_nano.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'
d:/gcc-arm-none-eabi-4_9/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc_nano.a(lib_a-lseekr.o): In function `_lseek_r':
lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'
d:/gcc-arm-none-eabi-4_9/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc_nano.a(lib_a-readr.o): In function `_read_r':
readr.c:(.text._read_r+0x10): undefined reference to `_read'

在 Builder Configurations -> Builder Options 中进行修改。

选择 Global Options 或 Linker,添加或删除 “–specs=nosys.spece”(文章:ARM GCC 链接错误 引用未定义函数 _read _write _sbrk 解决和重定向 中说要添加该参数,但我实际项目中已经添加了该参数仍然报出了这个警告,删除后警告消失)。

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

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

相关文章

三星计划将其NAND闪存芯片价格上调最高20%

韩国媒体一份报告显示&#xff0c;三星电子的内存业务成功挺过了去年的市场低迷时期。最近&#xff0c;其减产策略终于见效&#xff0c;芯片价格随之上升。 据报导&#xff0c;今年第一季度&#xff0c;三星计划将其NAND闪存芯片价格上调最高20%&#xff0c;目标是恢复其内存芯…

【析】一类动态车辆路径问题模型和两阶段算法

一类动态车辆路径问题模型和两阶段算法 摘要 针对一类动态车辆路径问题&#xff0c;分析4种主要类型动态信息对传统车辆路径问题的本质影响&#xff0c;将动态车辆路径问题(Dynamic Vehicle Routing Problem, DVRP)转化为多个静态的多车型开放式车辆路径问题(The Fleet Size a…

Java基础-复制

复制 前言引用拷贝浅拷贝深拷贝重写clone()方法序列化 前言 在编码中,我们可能会遇到需要将对象的属性复制到另一个对象中,这种情况叫做拷贝. 拷贝与Java内存结构有密切关系,拷贝有三种情况,引用拷贝,深拷贝和浅拷贝,下面来了解一下. 引用拷贝 引用拷贝会生成一个新的对象引…

微信小程序基础面试题

1、简述微信小程序原理 小程序本质就是一个单页面应用&#xff0c;所有的页面渲染和事件处理&#xff0c;都在一个页面内进行&#xff0c;但又可以通过微信客户端调用原生的各种接口&#xff1b;它的架构&#xff0c;是数据驱动的架构模式&#xff0c;它的UI和数据是分离的&am…

Windows上Git LFS的安装和使用

到Git LFS官网下载 传送门 初始化GitHub LFS和Git仓库 在仓库目录中运行&#xff1a; git lfs install再运行&#xff1a; git init跟踪大文件 git lfs track "*.zip"添加并提交文件 git add . git commit -m "Add large files"上传到我的github 配…

3.15作业

什么是IP地址&#xff1a;IP地址的作用是在网络中唯一标识和定位设备 IP地址和MAC地址的区别&#xff1a;IP地址是逻辑地址&#xff0c;网络层标识设备&#xff0c;可以更改&#xff0c;是全球互联网的唯 一 标识 MAC地址是物…

【CTF笔记】 CTF web方向笔记分享 免费 附预览图

个人不怎么记东西&#xff0c;笔记不多&#xff0c;师傅们凑合看… 百度网盘&#xff1a;https://pan.baidu.com/s/1PspihUX28Y_AOQZPurHqKA 麻烦各位师傅帮忙填写一下问卷&#xff0c;提取码在问卷填写结束后显示~ 【https://www.wjx.cn/vm/mBBTTKm.aspx# 】 &#xff08;…

大型政企寻求“智能化配方”,谁是“偏方”,谁是“验方”?

文 | 智能相对论 作者 | 叶远风 两会落幕&#xff0c;“人工智能”已成为国策&#xff0c;而全面推进智能化建设&#xff0c;大型政企首当其冲、责无旁贷——它们既是智能化转型升级的重要构成部分&#xff0c;也能直接在垂直领域形成价值引领、以点带片。 当智能成为大型政…

某鱼弹幕逆向

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018…

对称加密算法(DES、AES)

加密密钥 解密密钥 DES现在基本不再使用 3DES处理速度慢 AES通常用于移动通信系统加密以及基于SSH协议的软件

使用docker-compose部署Redis集群

一、部署三主三从的Redis集群 分别为6个节点建立挂载目录&#xff0c;每个目录下建立数据、配置、日志文件夹。 docker-compose内容如下&#xff1a; version: 3 services:redis1:image: redis:6.2.3restart: alwaysports:- "6379:6379"- "16379:16379"v…

【LeetCode热题100】138. 随机链表的复制(链表)

一.题目要求 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值…

【Javascript】变量和数据类型

目录 1.JavaScript介绍 内部JavaScript 外部JavaScript 内联JavaScript JavaScript输入输出语法 2.变量 2.1定义变量 2.2变量的命名规则和规范 2.3let和var区别 3.数据类型 3.1数字类型 3.2 字符串类型 3.3 布尔类型&#xff08;boolean&#xff09; 3.4 未…

表单修饰符和事件修饰符

表单修饰符和事件修饰符 表单修饰符 v-model.lazy v-model.lazy 失去焦点后再收集数据 <div id"app"><textarea name"" id"" cols"30" rows"10" v-model.lazy"a"></textarea>{{a}}<textar…

一键分割,瞬间转换!轻松驾驭视频的无限可能

在数字化的世界里&#xff0c;视频内容已成为我们日常生活与工作中不可或缺的一部分。然而&#xff0c;处理这些多媒体文件时&#xff0c;常常需要花费大量的时间和精力进行分割、转换和编辑。现在&#xff0c;有了这款强大的“一键分割与转换”工具&#xff0c;你将能够轻松驾…

达梦数据库安装使用

一、Windows端 打开iso文件 前面呆瓜式安装下一步 Oracle的特性与达梦特性大致一样 MySQL与Oracle区别 MySQL&#xff1a;安装一个服务&#xff0c;新建多个数据库 达梦&#xff1a;只安装底层服务&#xff0c;数据库需要单独创建 现在服务安装好了但是没有安装数据库 如果…

【JetsonNano】onnxruntime-gpu 环境编译和安装,支持 Python 和 C++ 开发

1. 设备 2. 环境 sudo apt-get install protobuf-compiler libprotoc-devexport PATH/usr/local/cuda/bin:${PATH} export CUDA_PATH/usr/local/cuda export cuDNN_PATH/usr/lib/aarch64-linux-gnu export CMAKE_ARGS"-DONNX_CUSTOM_PROTOC_EXECUTABLE/usr/bin/protoc&qu…

Spirngboot中文乱码解决方案

在使用springboot的时候,如果我们直接在控制器里面返回中文, 则默认可能会是乱码,因为默认的编码是ISO8859-1, 要解决这个问题, 就需要我们通过重写springboot里面的configureMessageConverters方法来将默认的编码设置为utf-8即可解决, 当然你的类文件编码也必须要是utf-8的, …

Spring中的BeanFactory

BeanFactory&#xff0c;以Factory结尾&#xff0c;表示是一种工厂。 作用&#xff1a; 是一个接口&#xff0c;定义了生产Bean对象的工厂应有的方法&#xff0c;如下图,定义了一个Bean工厂&#xff0c;最基本的方法。 职责&#xff1a; 它是负责生产和管理bean的一个工厂&…

Python数据分析教程(非常详细)从零基础入门到精通,看这一篇就够了_python数据分析从入门到精通

1、为什么选择Python进行数据分析? Python是一门动态的、面向对象的脚本语言&#xff0c;同时也是一门简约&#xff0c;通俗易懂的编程语言。Python入门简单&#xff0c;代码可读性强&#xff0c;一段好的Python代码&#xff0c;阅读起来像是在读一篇外语文章。Python这种特性…