nal*_*zok 4 embedded microcontroller arm stm32 cmsis
我正在使用 STM32F103C8T6,并希望使用 CMSIS,它本质上只是寄存器定义,没有代码,让我的生活更轻松,同时仍保持在较低水平。问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用。所有文档似乎都与特定于供应商的 IDE(例如 STM32CubeIDE)绑定。
我想要做的第一件事是下载 CMSIS 库,我在GitHub上找到了它。但是解压后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 示例作为最小、完整且可验证的示例。
我做了什么:
/Users/nalzok/Developer/CMSIS/ARM.CMSIS.5.6.0/和/Users/nalzok/Developer/CMSIS/Packs/Keil.STM32F1xx_DFP.2.3.0/。main.c的内容复制到其中。#define STM32F10X_MD到第一行以指定芯片。:第 31 行替换为;,将第 33 行替换为timer1_init (42);。
/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
Run Code Online (Sandbox Code Playgroud)
根据下面 @KamilCuk 的评论,我添加了更多选项并注释掉了函数Get_InputValues、Calculation_Response和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
Run Code Online (Sandbox Code Playgroud)
对于最新的设备头文件,我建议从 ST 网站下载STM32CubeF1软件包。除其他内容(中间件、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 设备头之外,您还需要以下文件:
/Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates文件夹)/Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/gcc文件夹)/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。