添加DSP库启用arm_math.h

简介: 添加DSP库启用arm_math.h

开启STM32的FPU硬件单精度浮点数计算单元,并启用CMSIS封装的STM32的DSP静态库。

像是卡尔曼滤波的矩阵运算,FIR和IIR滤波还有很多高级数学功能有了DSP库都会很方便和快速。

FPU硬件浮点数

FPU:Float Point Unit。全称是浮点计算单元,用于浮点计算的协处理器。

一般单片机带有硬件FPU并且支持浮点指令集时,工程会默认开启了FPU功能。STM32F4就带有32位单精度硬件FPU,支持浮点指令集。

  • 在头文件中 stm32f767xx.h中定义了__FPU_PRESENT。其值为1时可用。
  • 在头文件中 core_cm7.h 中定义了__FPU_USED。其值为1时可用。
  • system_stm32f4xx.c中初始化函数SystemInit()会根据上面两个define的数值用预编译来自动判断是否启用硬件浮点数。
  • 还需要在预编译符号添加__TARGET_FPU_VFPARM_MATH_CM4。分别是FPU的条件编译配置宏和使用的单片机的架构(需要根据使用的单片机来确定 这里以F407为例)

    • keil:Options for Target - C/C++(AC6) - Preprocessor Symbols - Define
    • CubeIDE:Properties - C/C++ General - Paths and Symbols - Symbols
  • 在IDE中设置开启FPU。但最终FPU启用与否也是根据上面两个define的数值来判断。

    • keil:Options for Target - Target - Floating Point Hardware 设置为 Single Precision 或 USEFPU
    • CubeIDE:Properties - C/C++ Bulid - Settings - MCU Settings。Floating-point unit 设置为 FPv4-SP-D16 ;Floating-point ABI 设置为 Hardware implementation (-mfloat-abi=hard)
  • arm_math.h 也需要根据__FPU_USED的数值来判断是否启用。但是因为上面两个定义的文件和导入的DSP库文件可能没有联系,所以为了避免出问题可以在编译器的预编译符号设置__FPU_USED=1__FPU_PRESENT=1。编译时会报重定义的错需要把原本的定义注释掉

添加DSP库

有三种方法,可以通过CubeMX软件包添加;Keil设置运行环境添加;以及手动添加。任选其一即可,推荐使用CubeMX添加。

CubeMX软件包

方法同样适用于在CubeIDE内使用。

  1. 在CubeMX上方蓝色条中选择 Software Packs - Select Components
  2. 点击左上角第一个长得像设置一样的图标(Show or hide the filter panel)
  3. 然后在右侧Software Component Class中选择DSP Library,右侧展开后勾选的Selection即可
  4. 回到CubeMX控制界面会发现左侧最下面多出了Software Packs栏目。在下拉列表中选择STMicroelectronics.X-CUBE-ALGOBUILD.1.2.1并勾选右侧DSP Library Library即可生成代码
  5. 生成代码后还需要在预编译符号中添加ARM_MATH_CM4表示架构,上面开启FPU时添加过的话就不用再添加了。
  6. 生成代码后工程的根目录下会自动新建一个Library文件夹。在这里添加arm_math.h中需要用到的.c文件即可。

    需要的.c文件可以在CubeMX芯片固件库的安装目录下找到。...\Repository\STM32Cube_FW_F4_V1.26.2\Drivers\CMSIS\DSP\Source

  7. 之后就完成DSP库的添加。此时程序中可以#include "arm_math.h"进行运算。

使用CubeMX软件包添加非常方便,并且会自动配置好IDE的设置(包括CubeIDE)

.lib文件的文件名中bf是大端,lf是小端。F4的内核CortexM4F采用小端模式。不过这些CubeMX在生成时都会自动选择无需额外关心

DSP库主要包含以下几个分库。根据工程需要添加至Library文件夹即可。

BasicMathFunctions – 基本数学函数:提供浮点数的各种基本运算函数,如向量加减乘除等运算。
ommonTables –arm_common_tables.c文件提供位翻转或相关参数表。
ComplexMathFunctions –复杂数学功能,如向量处理,求模运算的。
ControllerFunctions –控制功能函数。包括正弦余弦,PID电机控制,矢量Clarke变换,矢量Clarke逆变换等。
astMathFunctions –快速数学功能函数。提供了一种快速的近似正弦,余弦和平方根等相比CMSIS计算库要快的数学函数。
ilteringFunctions –滤波函数功能,主要为FIR和LMS(最小均方根)等滤波函数。
MatrixFunctions –矩阵处理函数。包括矩阵加法、矩阵初始化、矩阵反、矩阵乘法、矩阵规模、矩阵减法、矩阵转置等函数。
StatisticsFunctions –统计功能函数。如求平均值、最大值、最小值、计算均方根RMS、计算方差/标准差等。
SupportFunctions –支持功能函数,如数据拷贝,Q格式和浮点格式相互转换,Q任意格式相互转换。
TransformFunctions –变换功能。包括复数FFT(CFFT)/复数FFT逆运算(CIFFT)、实数FFT(RFFT)/实数FFT逆运算(RIFFT)、和DCT(离散余弦变换)和配套的初始化函数。

通过 Keil 添加

工具栏 Manage Run - Time Environment - CMSIS - DSP 勾选

还需要在预编译符号中添加ARM_MATH_CM4。添加完成

目录
相关文章
|
5月前
|
Ubuntu 编译器 C语言
蓝易云 - ubuntu上安装boost库为SOMEIP的X86和ARM下编译做准备(编译两种版本)
以上就是在Ubuntu上安装Boost库并为SOME/IP的X86和ARM架构编译做准备的全部步骤。
71 0
|
6月前
|
Swift
swift相关项目包含私有库引起的Undefined symbols for architecture arm64
swift相关项目包含私有库引起的Undefined symbols for architecture arm64
56 0
|
6月前
|
编译器 Linux
boost库交叉编译ARM版本
boost库交叉编译ARM版本
239 2
|
6月前
|
编译器
正点原子IMX6ULL-安装交叉编译器、编译tslib触摸屏库、编译arm环境qt源代码
正点原子IMX6ULL-安装交叉编译器、编译tslib触摸屏库、编译arm环境qt源代码
182 0
STM32CubeIDE移植ARM DSP库
STM32CubeIDE移植ARM DSP库
|
6月前
交叉编译libvisca库ARM版本
交叉编译libvisca库ARM版本
87 0
|
编译器 vr&ar C语言
如何保护自己知识产权,建立代码护城河——建立自己的静态库,x86和arm平台的实例讲解
如何保护自己知识产权,建立代码护城河——建立自己的静态库,x86和arm平台的实例讲解
311 0
编译OpenJDK8 arm32的源码库
编译OpenJDK8 arm32的源码库
122 0
|
Ubuntu 编译器 C语言
zlib开发笔记(三):zlib库介绍、在ubuntu上进行arm平台交叉编译
zlib开发笔记(三):zlib库介绍、在ubuntu上进行arm平台交叉编译
zlib开发笔记(三):zlib库介绍、在ubuntu上进行arm平台交叉编译
|
机器学习/深度学习 SQL 人工智能
ARM放大招发布Trillium项目:包含神经网络软件库和两种AI处理器
90% 的 AI 设备都是用 Arm 的架构设计的,现在 Arm 在人工智能领域厚积薄发,发布了 Trillium 项目,包括一款为移动设备而设计的机器学习处理器、一款目标检测处理器和一个神经网络软件库。
248 0
ARM放大招发布Trillium项目:包含神经网络软件库和两种AI处理器