FPU 简介

  • FPU 即浮点运算单元(Float Point Unit)。浮点运算,对于定点 CPU(没有 FPU 的 CPU)来说必须要按照IEEE-754 标准的算法来完成运算,是相当耗费时间的。而对于有 FPU 的 CPU来说,浮点运算则只是几条指令的事情,速度相当快。
  • STM32F4 属于 Cortex M4F 架构,带有 32 位单精度硬件 FPU,支持浮点指令集,相对于 Cortex M0 和Cortex M3 等,高出数十倍甚至上百倍的运算性能。 STM32F4 硬件上要开启 FPU是很简单的,通过一个叫:协处理器控制寄存器(CPACR)的寄存器设置即可开启 STM32F4 的硬件 FPU。

简单来说,FPU是集成在STM32F4系列以上的一个专用浮点运算处理器,相当于我们电脑中专门用于处理图像计算的GPU,在处理浮点运算时,速度比CPU处理要快几十倍,是一种专用型的处理单元。在STM32 F4系列中,带有该单元,我们只需要设置 CPACR 寄存器即可。

DSP 简介

  • STM32F429 采用 Cortex-M4 内核,相比 Cortex-M3 系列除了内置硬件 FPU 单元,在数字信号处理方面还增加了DSP 指令集,支持诸如单周期乘加指令(MAC),优化的单指令多数据指令(SIMD),饱和算数等多种数字信号处理指令集。相比Cortex-M3,Cortex-M4 在数字信号处理能力方面得到了大大的提升。Cortex-M4 执行所有的 DSP指令集都可以在单周期内完成,而 Cortex-M3 需要多个指令和多个周期才能完成同样的功能。

DSP (数字信号处理),FPU是硬件,ST提供了FPU的库叫做DSP库,用于FPU的使用。DSP库之于FPU就如同 HAL库 之于 STM32 一样,是ST公司为硬件所开发的软件库。

工程中开启FPU和DSP库移植

1. CUBEMX生成包含DSP库的代码

在生成工程的 Project Manager 选项卡中,一定要选择 Copy all used libraries into the project folder 这样 CUBEMX才会复制DSP库到工程文件夹中。
在这里插入图片描述

2. 在KEIL中开启FPU

在HAL库中 FPU的开启与否在 Drivers/CMSIS system_stm32f4xx.c 中的

在这里插入图片描述
SystemInit 函数

1
2
3
4
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif

在这里插入图片描述

2. 1 KEIL中开启FPU

Target 选项中 Floating Point Hardware 选项选择 Single Precision 开启浮点运算单元。
在这里插入图片描述

2. 2 KEIL中添加定义

根据该定义我们在KEIL的全局定义中加上宏定义即可

1
2
__FPU_PRESENT // FPU状态
__FPU_USED // FPU使用标志

另外还需要添加几个必须宏

1
2
ARM_MATH_CM4 //在Cortex-M4目标上构建库 
__CC_ARM //ARM

可选宏

1
2
ARM_MATH_ROUNDING //用于舍入支持功能
ARM_MATH_MATRIX_CHECK //检查矩阵的输入和输出大小

因此总计需要添加如下宏

1
,__FPU_PRESENT=1,__FPU_USED=1,ARM_MATH_CM4,__CC_ARM

3. 添加DSP库

CUBEMX生成之后,DSP库位于 工程目录/Driver/CMSIS/DSP
DSP文件夹 中包含了所有 DSP库 的源文件。
在这里插入图片描述
进入Source文件夹,是所有 DSP 库的源码。
在这里插入图片描述
|函数| 解释 |
|–|–|
|BasicMathFunctions| 基本数学函数:提供浮点数的各种基本运算函数,如向量加减乘除等运算。 |
| CommonTables | arm_common_tables.c 文件提供位翻转或相关参数表。 |
| ComplexMathFunctions | 复杂数学功能,如向量处理,求模运算的。 |
| ControllerFunctions |控制功能函数。包括正弦余弦,PID 电机控制,矢量 Clarke 变换,矢量 Clarke 逆变换等。 |
| FastMathFunctions | 快速数学功能函数。提供了一种快速的近似正弦,余弦和平方根等相比 CMSIS 计算库要快的数学函数。 |
| FilteringFunctions | 滤波函数功能,主要为 FIR 和 LMS(最小均方根)等滤波函数。 |
| MatrixFunctions | 矩阵处理函数。包括矩阵加法、矩阵初始化、矩阵反、矩阵乘法、矩阵规模、矩阵减法、矩阵转置等函数。 |
| StatisticsFunctions | 统计功能函数。如求平均值、最大值、最小值、计算均方根 RMS、计算方差/标准差等。 |
|SupportFunctions|支持功能函数,如数据拷贝,Q 格式和浮点格式相互转换,Q 任意格式相互转换。|
|TransformFunctions|变换功能。包括复数 FFT(CFFT)/复数 FFT 逆运算(CIFFT)、实数 FFT(RFFT)/实数FFT 逆运算(RIFFT)、和 DCT(离散余弦变换)和配套的初始化函数。|

所有这些 DSP 库代码合在一起是比较多的,因此,ST 为我们提了.lib 格式的文件,方便使用。这些.lib 文件就是由 Source 文件夹下的源码编译生成的,如果想看某个函数的源码,大家可以在 Source 文件夹下面查找。.lib 格式文件 HAL 库位于:工程目录/Driver/CMSIS/LIB/ARM
总共有 4 个.lib 文件,如下:
① arm_cortexM4b_math.lib (Cortex-M4 大端模式)
② arm_cortexM4l_math.lib (Cortex-M4 小端模式)
③ arm_cortexM4bf_math.lib (浮点 Cortex-M4 大端模式)
④ arm_cortexM4lf_math.lib (浮点 Cortex-M4 小端模式)
我们得根据所用 MCU 内核类型以及端模式来选择符合要求的.lib 文件,本章我们所用的
STM32F4 属于 CortexM4F 内核,小端模式,应选择:arm_cortexM4lf_math.lib(浮点 Cortex-M4 小端模式)。
在这里插入图片描述
因此在KEIL中我们添加 arm_cortexM4lf_math.lib就可以了。

在这里插入图片描述

测试

FPU DSP库至此移植完毕 但现在编译会出现警告

warning: #47-D: incompatible redefinition of macro “__FPU_PRESENT”

嗯不影响使用但是作为一个强迫症肯定是忍不了的
暂时先将 warning 改为 no warning 解决问题
待日后有时间了再详细分析分析