开启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内使用。
-
在CubeMX上方蓝色条中选择 Software Packs - Select Components
-
点击左上角第一个长得像设置一样的图标(Show or hide the filter panel)
-
然后在右侧Software Component Class中选择DSP Library,右侧展开后勾选的Selection即可
-
回到CubeMX控制界面会发现左侧最下面多出了Software Packs栏目。在下拉列表中选择STMicroelectronics.X-CUBE-ALGOBUILD.1.2.1并勾选右侧DSP Library Library即可生成代码
-
生成代码后还需要在预编译符号中添加D
ARM_MATH_CM4
,用于表示架构。上面开启FPU时添加过define的话就不用再添加了。 -
生成代码后工程的根目录下会自动新建一个Library文件夹。在这里添加arm_math.h中需要用到的.c文件即可。
需要的.c文件可以在CubeMX芯片固件库的安装目录下找到。…\Repository\STM32Cube_FW_F4_V1.26.2\Drivers\CMSIS\DSP\Source
-
之后就完成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
参考链接