2

我正在尝试在 STM32 F411RE 板上实现 DSP 的使用,但我似乎无法在不调用大量错误的情况下包含必要的文件。

背景

我以前在 Keil uVision 中使用过 CMSIS 和 CMSIS-DSP,但考虑到 32k 的代码限制,我很快就超过了评估限制。因此,我一直在尝试将 CMSIS-DSP 包含到 Atollic TrueStudio 中,但这似乎很难实现:CMSIS-DSP 上可用的文档有限,在 Atollic TrueStudio 中实现的文档更少。

一些相关资源可以在 Atollic TrueStudio 用户指南 以及 StackOverflow 主题 #1StackOverflow 主题 #2中找到 。我能找到的大多数其他相关主题只是参考 Keil uVision 或用户指南的使用,而没有更多帮助。

Atollic TrueStudio 确实包含一个内置的包管理器,其中基本 CMSIS 可供下载,但它不为 CMSIS-DSP 包提供此选项。

尝试的解决方案

我曾尝试手动下载对应的CMSIS包(STM32Cube_FW_F4_V1.24.0),并将对应的DSP包放入工程文件结构中。然后,这允许使用 DSP 功能,例如 #include arm_math.harm_rfft_fast_instance_f32 S;可以通过使用自动完成功能来调用,并因此被 IDE 识别。

然而,这个过程也会引发很多错误,因为包含的函数无法识别它们的头依赖关系(例如#include arm_math.h)。我发现 main.c 能够识别该#include arm_math.h命令但包含的功能却不是,但我仍然尝试通过将 CMSIS DSP 添加到包含的目录来解决这个问题(在“构建属性-> C/C++”中找到构建 --> 设置 --> 工具设置 --> C 编译器 --> 目录`)。然而,这也不能解决手头的问题。

代码结果

该函数找不到标题

函数找不到标头

但是主要可以找到完全相同的标题

Main.c 可以找到标题但是

并且标头包含在构建选项 -> 目录中

构建选项,包括 DSP 头

刚刚验证它也包含在“路径和符号”中,一旦将其包含在构建选项中,它应该自动执行 AFAIK:

路径和符号

更新

自从我的 OP 以来,我取得了一些进展,主要是通过弄乱包含、符号和链接器。我现在已经设法克服了最初的错误(尽管不幸的是我不知道如何),但是我现在已经为 startup_stm32 文件产生了大量额外的错误。

这些似乎都是涉及 CMSIS 中包含的模板文件(CMSIS / Device / ST / STM32F4xx / Source / Templates / ARM / ...)的错误指令错误,无法解释这些模板中列出的各种命令。

示例错误:bad instruction __heap_base

4

1 回答 1

2

从那以后,我发现了我的项目的问题:包括 Github 存储库中可用的 CMSIS 文件夹意味着在整个文件夹结构中存在大量模板。在这些模板仍然存在的情况下尝试构建/编译时,会导致许多无效类型和重新定义错误的问题。

这些模板中的大多数都位于合乎逻辑的位置,但有些模板埋得很深,因此可能很难找到。我将尽快制作一个视频,描述将 CMSIS (DSP) 从 github 存储库添加到 TrueStudio 中的项目的过程。

同时,以下步骤应该使 CMSIS 和 CMSIS-DSP 在您的 STM32 TrueStudio ProjecT 中工作:

  1. 确保从 CMSIS 文件夹中删除所有模板(文件夹)。这可能需要一些搜索和试验:特别有害的那些被隐藏起来, ../STM32Cube_FW_xx_Vx.xx/Drivers/CMSIS/Device/ST/STM32xxxx/Source/{Templates} 而还有其他的集合../STM32Cube_FW_xx_Vx.xx/Drivers/CMSIS/DSP/{Examples} ../STM32Cube_FW_xx_Vx.xx/Drivers/CMSIS/DSP/{Projects}我已经为我的项目成功编译/构建而删除了这些集合。

  2. 包括所有被命名为包含在文件夹中的文件夹。AFAIK 你不能只包含主../Drivers文件夹,因为包含似乎不包括底层结构,而且它似乎也包括我的项目的错误。最好只手动包含文件夹:您可以通过右键单击要包含的文件夹,单击底部“添加/删除包含路径”附近的选项并勾选两个框以进行发布和调试,然后按“确定”包括这个文件夹。对其他“包含”文件夹重复此操作。

  3. 查找RTE_Components.h位于../STM32Cube_FW_xx_Vx/STM32xxxx-Nucleo\Templates\MDK-ARM\RTE. RTE_Components.hNN (Neural Networks) CMSIS-pack 文件夹中也有具有此名称 ( ) 的文件,请勿触摸这些文件。将此文件复制到您之前包含的任何位置(将我的放在 中../Drivers/CMSIS/Include),然后在您选择的 IDE 中打开它。在任何其他语句之前添加该行#define CMSIS_device_header " DEVICE_NAME.h ",并将设备名称替换为您的 STM32 板名称。例如,我的 RTE_Components.h 文件看起来像

    /*
     * Auto generated Run-Time-Environment Component Configuration File
     *      *** Do not modify ! ***
     * Project: 'Project' 
     * Target:  'STM32F410Tx_Nucleo' 
     */
    #define CMSIS_device_header "stm32f4xx.h" // define  own board header, eg stm32f4xx.h or stm32f7xx.h
    #ifndef RTE_COMPONENTS_H
    #define RTE_COMPONENTS_H
    #endif /* RTE_COMPONENTS_H */
    

    确保 CMSIS_device_header 的设备名称对应于位于../Drivers/CMSIS/Device/ST/DEVICE_NAME/Include/DEVICE_NAME.h

  4. 添加所需的符号(右键单击您的项目,转到属性、C/C++ 常规、路径和符号;然后转到#Symbols 选项卡)以定义 FPU 和您的 Cortex 内核类型。对我来说,我需要添加__FPU_PRESENT(没有值或值“1”),因为我在 STM32F411RE 上有 Cortex M4 芯片,所以我添加了ARM_MATH_CM4. 这意味着我的符号列表如下所示:

    • __FPU_PRESENT
    • __packed有价值__attribute__((__packed__))
    • __weak具有价值__attribute__((weak)) -ARM_MATH_CM4
    • STM32F411xE
    • USE_HAL_DRIVER虽然这取决于您是否要使用 HAL
  5. 再次确保必要的包含已明确定义,因为不包含仅 1 个目录会导致大量错误。这些可以通过转到项目属性(右键单击您的项目,底部的选项)、转到 C/C++ 构建、设置、工具设置选项卡、C 编译器下拉菜单和目录选项来找到。

对于我的项目,我在项目属性中有以下包含路径:

../Inc                                           (should be by default)
../Drivers/CMSIS/Device/ST/STM32F4xx/Include     (should be by default) 
../Drivers/STM32F4xx_HAL_Driver/Inc              (should be by default)
../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy       (should be by default)
../Drivers/CMSIS/Include                         (should be by default)

"${workspace_loc:/${ProjName}/Drivers/Device/ST/STM32F4xx/Include}"
"${workspace_loc:/${ProjName}/Drivers/CMSIS/Core/Include}" 
"${workspace_loc:/${ProjName}/Drivers/CMSIS/Core_A/Include}"
"${workspace_loc:/${ProjName}/Drivers/CMSIS/DSP/Include}"

希望这对您也有帮助和工作!

于 2019-05-16T08:08:03.087 回答