我正在使用STM32F103C8T6,并且想使用CMSIS which is essentially just register definitions and no code使我的生活更轻松,同时仍然保持较低水平。问题是我不知道如何安装该库以在命令行上与Makefile一起使用。所有文档似乎都绑定了特定于供应商的IDE,例如STM32CubeIDE。
我想要做的第一件事是下载CMSIS库,该库是在GitHub上找到的。但是,解压缩ARM.CMSIS.5.6.0.pack
后,我没有找到名为stm32f10x.h
的文件。我花了更多时间,发现我正在使用的特定MCU的a CMSIS pack,但是它不包含core_cm3.h
,但是在ARM.CMSIS.5.6.0.pack
中显示。 document说我需要将两者都包括到我的项目中,所以我需要将从不同位置下载的文件复制到我的项目中,还是什么?
另外一个问题是:CMSIS和Keli之间是什么关系?特定于设备的CMSIS包是从www.keil.com
下载的,但是我现在暂时不想使用Keil MDK,因为它似乎是商业产品,并且GNU Arm工具链为我提供了很好的服务。
编辑:我应该从一开始就更加具体,但是现在让我们集中讨论如何构建Basic CMSIS Example作为最小,完整和可验证的示例。
我做了什么:
将CMSIS-Core和CMSIS-DFP分别下载并解压缩到/Users/nalzok/Developer/CMSIS/ARM.CMSIS.5.6.0/
和/Users/nalzok/Developer/CMSIS/Packs/Keil.STM32F1xx_DFP.2.3.0/
。
创建一个名为main.c
的文件,并将the basic example的内容复制到其中。
在第一行添加#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
根据下面@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
最佳答案
对于最新的设备头,我建议从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命令(也许是结帐)来告诉您的PC下载实际的.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生成的一个。
更新:
Here,您可以找到一个在STM32CubeIDE中创建的最小项目。我创建了一个空的C项目。 IDE提供了一个链接描述文件和一个启动文件(.s),但我删除了它们并使用了STM32CubeF1软件包中的文件。我还从/ Drivers / Device / ST / STM32F1xx / Include目录中删除了不相关的头文件。但是我没有触及/ Drivers / CMSIS / Core / Include中的文件,尽管那里有许多不相关的文件,因为很难确定哪些文件是必需的。
我知道您正在寻找没有IDE的解决方案,但是我认为这个示例项目至少可以为您提供有关所需文件和项目结构的一些线索。
注意:示例项目名称为blinky.cube,但项目中没有任何多维数据集。我使用此命名约定只是为了指定我使用的IDE,在这种情况下为STM32CubeIDE。
关于arm - 在没有IDE的情况下如何使用CMSIS?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60158918/