在没有 IDE 的情况下如何使用 CMSIS?

2023-11-30

我正在使用 STM32F103C8T6 并想使用 CMSIS,这本质上只是寄存器定义,没有代码,让我的生活更轻松,同时仍保持在较低水平。问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用。所有文档似乎都与特定于供应商的 IDE(例如 STM32CubeIDE)绑定。

我想要做的第一件事就是下载 CMSIS 库,我在GitHub。然而解压后ARM.CMSIS.5.6.0.pack我发现没有名为stm32f10x.h。我又花了一些时间发现CMSIS 包对于我正在使用的特定 MCU,但它不包含core_cm3.h,然而它呈现在ARM.CMSIS.5.6.0.pack. The document说我需要将两者都包含到我的项目中,那么我是否需要将从不同地方下载的文件复制到我的项目中,或者什么?

作为一个额外的问题:CMSIS 和 Keli 之间的关系是什么?设备特定的 CMSIS 包可从以下地址下载www.keil.com,但我现在不想使用 Keil MDK,因为它似乎是一个商业产品,并且 GNU Arm 工具链为我提供了很好的服务。


Edit:我应该从一开始就更具体,但现在让我们关注如何构建基本 CMSIS 示例作为一个最小的、完整的、可验证的例子。

我做了什么:

  1. 下载并解压 CMSIS-Core 和 CMSIS-DFP 以/Users/nalzok/Developer/CMSIS/ARM.CMSIS.5.6.0/ and /Users/nalzok/Developer/CMSIS/Packs/Keil.STM32F1xx_DFP.2.3.0/, 分别。
  2. 创建一个名为main.c,并复制内容基本示例 to it.
  3. Add #define STM32F10X_MD在第一行指定芯片。
  4. 修正错别字:替换:31号线到;,并将第 33 行替换为timer1_init (42);.
  5. 构建并出现错误

/tmp $ arm-none-eabi-gcc -I/Users/nalzok/Developer/CMSIS/ARM.CMSIS.5.6.0/CMSIS/Include/ -I/Users/nalzok/Developer/CMSIS/Packs/Keil.STM32F1xx_DFP.2.3.0/Device/Include/ main.c
main.c: In function 'main':
main.c:42:5: warning: implicit declaration of function 'Get_InputValues' [-Wimplicit-function-declaration]
   42 |     Get_InputValues ();                          // Read Values
      |     ^~~~~~~~~~~~~~~
main.c:44:5: warning: implicit declaration of function 'Calculation_Response' [-Wimplicit-function-declaration]
   44 |     Calculation_Response ();                     // Calculate Results
      |     ^~~~~~~~~~~~~~~~~~~~
main.c:45:5: warning: implicit declaration of function 'Output_Response' [-Wimplicit-function-declaration]
   45 |     Output_Response ();                          // Output Results
      |     ^~~~~~~~~~~~~~~
/var/folders/m4/7my6q_kj6pxgzb1b7pxyhp0h0000gn/T//cc1ZVBaH.s: Assembler messages:
/var/folders/m4/7my6q_kj6pxgzb1b7pxyhp0h0000gn/T//cc1ZVBaH.s:197: Error: selected processor does not support `wfe' in ARM mode
/var/folders/m4/7my6q_kj6pxgzb1b7pxyhp0h0000gn/T//cc1ZVBaH.s:310: Error: selected processor does not support `cpsid i' in ARM mode
/var/folders/m4/7my6q_kj6pxgzb1b7pxyhp0h0000gn/T//cc1ZVBaH.s:318: Error: selected processor does not support `cpsie i' in ARM mode

根据下面 @KamilCuk 的评论,我添加了更多选项并注释掉了函数Get_InputValues, Calculation_Response, and Output_Response,但现在我遇到了一些不同的错误。

/tmp $ arm-none-eabi-gcc -I/Users/nalzok/Developer/CMSIS/ARM.CMSIS.5.6.0/CMSIS/Include/ -I/Users/nalzok/Developer/CMSIS/Packs/Keil.STM32F1xx_DFP.2.3.0/Device/Include/ -D STM32F1 -D STM32F103x6 -mthumb -mcpu=cortex-m3 main.c
/Users/nalzok/opt/xPacks/arm-none-eabi-gcc/9.2.1-1.1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld: /Users/nalzok/opt/xPacks/arm-none-eabi-gcc/9.2.1-1.1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/libc.a(lib_a-exit.o): in function `exit':
exit.c:(.text.exit+0x16): undefined reference to `_exit'
/Users/nalzok/opt/xPacks/arm-none-eabi-gcc/9.2.1-1.1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld: /var/folders/m4/7my6q_kj6pxgzb1b7pxyhp0h0000gn/T//ccqfC5LA.o: in function `Device_Initialization':
main.c:(.text+0x164): undefined reference to `SystemCoreClock'
collect2: error: ld returned 1 exit status

对于最新的设备标头,我建议下载STM32CubeF1来自 ST 网站的软件包。除其他外(中间件、HAL 等),此包包含所需的设备头文件/Drivers/CMSIS/Device文件夹。你需要STM32F103xB定义的符号stm32f1xx.h标头才能正常工作。

当然,STM32CubeF1软件包还包含 CMSIS 库,但它们通常有点过时。我更喜欢从您提到的 github 存储库将它们下载为 .pack 文件。你需要的标题/CMSIS/Core至少。如果您愿意,您可以添加 CMSIS 的其他部分。其中一些(如 DSP)可能还需要您添加提供的静态库/Lib文件夹。

请注意,如果您从 github 克隆 CMSIS 存储库而不是下载 .pack 文件,您最终会得到静态库的占位符版本,因为项目使用git LFS。您不能直接使用这些静态库文件(.a 文件),因为它们只是某种指针。我不熟悉git LFS,但我猜你需要一些 git 命令(也许是 checkout)来告诉你的电脑下载实际的 .a 文件。

另请注意,有时 CMSIS 文件夹结构会因版本而异。您进入的文件夹结构STM32CubeF1可能与您从官方 CMSIS 存储库下载的不同。

我忘了提:除了 CMSIS 和 ST 设备头之外,您还需要以下文件:

  • 系统_stm32f1xx.c(STM32CubeF1包裹/Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates folder)
  • 启动_stm32f103xb.s(STM32CubeF1包裹/Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/gcc folder)
  • 链接器脚本来自STM32CubeF1包裹/Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/gcc/linker文件夹。奇怪的是,STM32F103x8 没有,因此您可能需要选择 STM32F103xB 并对其进行修改。我使用的是 IDE 生成的。

Update:

Here您可以找到在 STM32CubeIDE 中创建的最小项目。我创建了一个空的 C 项目。 IDE 提供了链接器脚本和启动文件 (.s),但我删除了它们并使用了包含在STM32CubeF1包裹。我还从/Drivers/Device/ST/STM32F1xx/Include目录中删除了不相关的头文件。但我没有触及 /Drivers/CMSIS/Core/Include 中的文件,尽管那里有很多不相关的文件,因为很难确定哪些文件是需要的,哪些是不需要的。

我知道您正在寻找没有 IDE 的解决方案,但我认为这个示例项目至少可以为您提供一些有关所需文件和项目结构的线索。

注:示例项目名称为闪烁立方体但项目中没有Cube。我使用此命名约定只是为了指定我使用的 IDE,在本例中为 STM32CubeIDE。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在没有 IDE 的情况下如何使用 CMSIS? 的相关文章

  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • iPhone 3GS 上的 ARM 与 Thumb 性能比较,非浮点代码

    我想知道是否有人有关于 iPhone 3GS 上 ARM 与 Thumb 代码性能的硬性数据 特别是对于非浮点 VFP 或 NEON 代码 我知道 Thumb 模式下的浮点性能问题 更大的 ARM 指令的额外代码大小是否会在某个时刻成为性能
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 英特尔的最后分支记录功能是英特尔处理器独有的吗?

    最后分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 MSR 的集合 它们受英特尔酷睿 2 英特尔至强和英特尔凌动处理器系列的支持 http css csail mit edu 6 858 2012 readings ia3
  • 映射文件和链接器文件之间的区别

    链接器生成的映射文件与包含内存段本身的链接器文件有什么区别 链接器 文件是链接器的一组命令 涉及如何在内存中布置所有内容 并由程序员创建 映射 文件是所有内容在内存中位置的列表 由链接器创建
  • 用于嵌入式系统的简约人类可读序列化格式解析器

    By 人类可读的序列化格式 I mean YAML JSON INI或喜欢 请注意 XML对于我的目的来说太冗长而且太不方便 所以让我们把它作为最后的手段 格式应将数据存储为 命名键 值 配对并允许嵌套和数组 不过 缺少数组并不重要 此外
  • 如何在WinMobile6上启用ARMv6非对齐访问?

    ARMv6 引入了一个很棒的功能 未对齐的内存访问 这使得代码中的某些事情变得更加简单和更快 但微软只在winCE6中提供了API 现在大多数 PDA 都基于 WinMobile6 基于 CE 5 x 默认情况下禁用未对齐访问 我尝试在 C
  • A64 Neon SIMD - 256 位比较

    我想将两个小端 256 位值与 A64 Neon 指令 asm 进行有效比较 平等 为了平等 我已经有了解决方案 bool eq256 const UInt256 lhs const UInt256 rhs bool result 首先 将
  • 直接写入 ARM Cortex A8 分支预测器中的全局历史缓冲区 (GHB) 或 BTB?

    我有兴趣直接修改 Cortex A8 上的 BTB 分支目标缓冲区 和 GHB 的内容 ARM 手册上有这样的内容 要在指令端 GHB 数组中写入一项 例如 LDR R0 0x3333AAAA MCR p15 0 R0 c15 c1 0 M
  • 如何使用从偶数地址边界开始的两个字节值填充 S 记录?

    当我编译代码时我最终得到摩托罗拉 S 记录 http en wikipedia org wiki SREC 28file format 29 a mot 有间隙 整个地址范围不被代码和数据覆盖 我想用图案来填补这些空白0x01 0x80 然
  • 在 C/C++ 中除了使用 % (模数)之外还有其他选择吗?

    我曾经在某处读到 模数运算符在小型嵌入式设备 例如没有整数除法指令的 8 位微控制器 上效率低下 也许有人可以证实这一点 但我认为差异比整数除法运算慢 5 10 倍 除了保留计数器变量并在 mod 点手动溢出到 0 之外 还有其他方法可以做
  • 如何在嵌入式上进行代码覆盖

    我为非 POSIX 嵌入式系统编写了一个项目 因此我无法使用 gcc 选项 coverage 我没有读或写 我还能做什么来产生类似 gcov 的输出 我确实有输出功能 它可以通过具有嵌入式跟踪的处理器 公开跟踪端口的板设计以及合适的硬件调试
  • GCC 变量映射和 MISRA-C

    我主要知道两种使用 GCC 声明内存映射寄存器的方法 有许多变体 使用双字段 每个外设的数据结构等 要么使用初始化为正确地址的指针 例如volatile uint32 t pMyRegister uint32 t 0xDEADBEEFUL
  • 当我尝试在 Armv8 程序集中分配数组时,执行冻结

    所以我正在用汇编语言进行编程 这只是一个简单的代码 这样我就可以学习如何分配数组 以便稍后在 NEON 编程中使用它们 ASM FUNC FPE data balign 8 array skip 80 array1 word 10 20 3
  • 对于任何真实数据集,数据压缩比的最小可能值是多少

    我在写信ZLIB类似于嵌入式硬件压缩器的 API 它使用 deflate 算法来压缩给定的输入流 在进一步讨论之前 我想解释一下数据压缩率 数据压缩率定义为未压缩大小与压缩大小之间的比率 压缩比通常大于一 这意味着压缩数据通常比未压缩数据小
  • 2022年Android CPU架构分布(armeabi-v7a vs arm64-v8a)

    有没有关于 2022 年 Android 设备上的架构使用情况的官方信息 我有一个支持armeabi v7a 和arm64 v8a 的应用程序 我想要放弃对armeabi v7a的支持并且仅支持 64 位设备 arm64 v8a 但我找不到
  • 支持 ARM 上的 Windows 10 桌面应用程序 - MFC 和 COM 以及 OPOS 可以工作吗?

    我试图了解将在 x86 Windows 10 上运行的 C MFC 应用程序移植到具有 Qualcomm Snapdragon 处理器的 ARM Windows 10 设备的障碍 32位应用程序具有以下特点 MFC 与 C 用于用户界面 C
  • 什么是 .axf 文件?

    我是arm架构的新手 我从事嵌入式软件工作 并试图了解我的项目二进制文件的调试文件夹中存在的 axf文件 发现它是链接器在构建过程中生成的arm可执行格式文件 用于调试崩溃 所以很明显它包含了一些调试信息 但不清楚具体是什么信息 而且deb
  • 通过单个 GPIO 引脚转储闪存

    我正在使用 Infineon 的 XMC4500 Relax Kit 并尝试通过单个 GPIO 引脚提取固件 我非常天真的想法是通过 GPIO 引脚一次转储一位 然后用逻辑分析仪以某种方式 嗅探 数据 伪代码 while word by w

随机推荐

  • 动态设置 ui-sref Angularjs 的值

    我搜索过类似的问题 但出现的问题似乎略有不同 我正在尝试动态更改链接的 ui sref 此链接指向向导表单的下一部分 下一部分取决于下拉列表中所做的选择 我只是想根据选择框中的某些选择来设置 ui sref 属性 我可以通过绑定到在进行选择
  • 如何防止gcc优化破坏rep movsb代码? [复制]

    这个问题在这里已经有答案了 我尝试使用以下命令创建我的 memcpy 代码rep movsb操作说明 当禁用优化时 它可以完美地适应任何尺寸 但是 当我启用优化时 它无法按预期工作 问题 如何防止gcc优化破坏rep movsb代码 我的代
  • 使用 Ruby 驱动程序的 MongoDB Group

    我正在尝试带回一个包含用于描述博客文章的计数的年 月组合列表 我们的想法是 它们将像这样显示 2010 年 1 月 1 篇文章 2009 年 12 月 2 个职位 我已经设法使用 MongoDB JS shell 让它工作 并且它以有用的格
  • PHP-PDO从数据库获取元数据

    我想从带有 朋友 表的数据库中获取元数据 id name 1 Herbert 2 LG 3 Levins 这是我试图获取数据的代码
  • 如何正确手动重新创建 sklearn (python) 逻辑回归 Predict_proba 结果以进行多重分类

    如果我运行 4 个类的基本逻辑回归 我可以获得 Predict proba 数组 如何使用系数和截距手动计算概率 获得与 Predict proba 生成的相同答案的确切步骤是什么 网上似乎有很多关于此的问题和一些建议 这些建议要么不完整
  • Android 中不显示选项菜单

    我有这个代码来创建菜单 Override public boolean onCreateOptionsMenu Menu menu super onCreateOptionsMenu menu MenuInflater inflater g
  • 风格化文本以针对不同语言使用不同字体?

    有没有一种方法可以对 HTML 页面上的文本进行样式化 以便它针对不同的语言自动使用不同的字体 我的网站使用英语和阿拉伯语 我想根据显示的语言使用不同的字体 假设我有这样的一段 上一句是阿拉伯语 但这一句是英语 我希望阿拉伯语句子用 X 字
  • 当 SimpleXML 解析带有特殊字符的 XML 时会发生什么?

    我正在尝试用我的最终输出来解决这个问题 XML 提要看起来像这样
  • UIView动画

    我正在尝试制作动画UIView这里 它看起来像一个矩形 我只想将其转换为我的坐标 那么 我怎样才能让它动起来呢 我试图找到一些教程 但没有成功 在iOS 4中 UIView块动画方法是最简单的 UIView animateWithDurat
  • 什么是 JSTL 强制 Jars

    我是新人 刚刚开始学习Java 来自jstltag 我对jstl了解很多 我使用IDE eclipse mars 通过添加一个简单的jsp页面来创建一个动态Web项目 然后将war导出到tomcat 7的webapps文件夹中 我对jstl
  • Leaflet - 如何查找现有标记并删除标记?

    我已经开始使用传单作为开源地图 http leaflet cloudmade com 以下 jQuery 代码将允许在单击地图时在地图上创建标记 map on click onMapClick function onMapClick e v
  • 向表单验证添加错误不起作用?

    根据有关表单验证的语义 UI 文档 我可以手动添加错误 添加错误 错误 给定数组错误 将错误添加到表单中 我想使用此功能 因为我通过 AJAX 提交表单 进行服务器端验证 然后想要显示结果 我尝试了以下代码 my form form add
  • spring默认作用域是否是单例?

    你能解释一下为什么Spring要为如下所示的bean配置创建两个对象吗 因为默认情况下spring的默认作用域是单例的 Spring的配置在这里
  • 寻找具有 3 个 CGPoint 的角度

    在我的应用程序中 用户点击 3 次 点击的 3 个点将创建一个角度 它完美地绘制了角度 我试图计算第二次点击时的角度 但我认为我做错了 可能是数学错误 我还没有在微积分课上讨论这个问题 所以我将使用维基百科上的公式 http en wiki
  • 无法从派生类型的范围访问另一个实例的受保护成员

    In 这个答案对于这个问题 为什么我的对象无法访问公共基类中定义的另一个对象的受保护成员 可以读作 您只能从您自己的基类实例访问受保护的成员 要么我没有正确理解 要么关注 MCVE 在 coliru 上直播 证明它是错误的 struct B
  • Android 上是否有类似于 Windows Phone 7 上的全景或枢轴 UI 控件?

    有谁知道是否有一个适用于 Android 的 UI 小部件 类似于 Windows Phone 7 全景或枢轴控件 如果没有 是否有任何教程可以指导我走上实现自己的正确道路 任何帮助表示赞赏 谢谢 是的 我也对枢轴控件感兴趣 这是我找到的类
  • 避免 GRPC 服务器中的端口冲突

    我目前正在考虑 GRPC 来满足我的实时需求 我注意到在示例中我们明确要求绑定到服务器中的硬编码端口 我希望将服务器部署在像 Heroku 这样的 Stack 上 想象一下 我将端口设置为 9090 并且该端口当前正被另一个服务使用 这不会
  • R:每月汇总行数

    我制作了一个数据框 其中有一列包含日期和一列包含数值 我希望这个数据框按月进行分组 并汇总每个相应月份其他列中的所有数值 这是我的数据框示例 capture date Test1 Test2 Test3 2016 03 18 0 1 1 2
  • 如何在 Vue 2 中包含 css 文件

    我是 vue js 新手 正在尝试学习这个 我在我的系统中安装了全新版本的 vue webpack 我有一个 css js 和这个主题模板的图像 我想将其包含到 HTML 中 所以我尝试将其添加到index html但我可以在控制台中看到错
  • 在没有 IDE 的情况下如何使用 CMSIS?

    我正在使用 STM32F103C8T6 并想使用 CMSIS 这本质上只是寄存器定义 没有代码 让我的生活更轻松 同时仍保持在较低水平 问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用 所有文档似乎都与特定于供应商的 I