添加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的数值用预编译来自动判断是否启用硬件浮点数。
  • 还需要在预编译符号添加ARM_MATH_CM4__TARGET_FPU_VFP。分别是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. 生成代码后还需要在预编译符号中添加DARM_MATH_CM4,用于表示架构。上面开启FPU时添加过define的话就不用再添加了。

  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 – 基本数学函数:提供浮点数的各种基本运算函数,如向量加减乘除等运算。
CommonTables –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。添加完成。

Keil想要忽略添加后可能产生的特定警告,可以在 Options for Target - C/C++(AC6) - Preprocessor Symbols - MiscControls 添加 --diag_suppress=2803,1,1035


参考链接

STM32CubeIDE添加DSP库

STM32 DSP库的快速添加