3

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

我想首先要做的是下载我在GitHub 上找到的 CMSIS 库。但是,解压缩后,ARM.CMSIS.5.6.0.pack我没有找到名为stm32f10x.h. 我花了一些时间,为我正在使用的特定 MCU 找到了一个 CMSIS 包core_cm3.h,但它不包含ARM.CMSIS.5.6.0.pack. 该文件说我需要将两者都包含到我的项目中,所以我需要将从不同地方下载的文件复制到我的项目中,还是什么?

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


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

我做了什么:

  1. 分别将 CMSIS-Core 和 CMSIS-DFP 下载并解压缩到/Users/nalzok/Developer/CMSIS/ARM.CMSIS.5.6.0//Users/nalzok/Developer/CMSIS/Packs/Keil.STM32F1xx_DFP.2.3.0/
  2. 创建一个名为 的文件,并将基本示例main.c的内容复制到其中。
  3. 添加#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_InputValuesCalculation_ResponseOutput_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
4

2 回答 2

4

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

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

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

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

我忘了说:除了CMSIS和ST设备头,你还需要以下文件:

  • system_stm32f1xx.c(STM32CubeF1/Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates文件夹)
  • startup_stm32f103xb.s(STM32CubeF1/Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/gcc文件夹)
  • STM32CubeF1包文件夹中的链接描述/Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/gcc/linker文件。奇怪的是,STM32F103x8 没有,所以您可能需要选择 STM32F103xB 并对其进行修改。我使用 IDE 生成的。

更新:

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

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

注意:示例项目名称为blinky.cube,但项目中没有 Cube。我使用这个命名约定只是为了指定我使用的 IDE,在本例中是 STM32CubeIDE。

于 2020-02-11T06:15:24.423 回答
3

对于您所指的 CMSIS 部分,一些由 ARM(CMSIS 内核)提供,一些由您的芯片供应商(设备系列包)提供。正如您所发现的,CMSIS 软件包只是另一个名称的 zip 文件。你可以在任何你想要的地方解压它们。如您所知,核心 CMSIS 和大多数供应商特定部分仅包含头文件。然后有必要在编译器包含路径中包含正确的目录,通常使用-I...命令行选项。

一种类型的供应商软件包称为设备系列包。除了供应商特定的外设定义外,它们通常包含启动代码,并且通常包含与 SOC 存储器布局相匹配的链接器脚本。这些是值得寻找的,并且将节省向量表布局和其他此类低级代码的工作。

作为奖励:Keil 是一家软件工具制造商,归 ARM 所有。Keil IDE 支持 CMSIS 软件包的更好功能,例如通过网络分发和更新它们,并且 Keil 维护一个常见 SOC 包的存储库。我通常也使用 GNU 编译器,但使用 Keil 及其内置的 CMSIS 感知和软件包可用性效果很好。我什至为定制工作构建了一些软件包。我建议继续阅读CMSIS 文档,并注意有关packs的部分。您不必拥有为您管理包的 IDE。由于它们只是 zip 文件,因此您可以自己承担该任务。

于 2020-02-10T23:48:43.090 回答