stm32h743单片机嵌入式学习笔记7-FPU

版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎联系我qq2488890051 https://blog.csdn.net/kangkanglhb88008/article/details/89506240

* FPU 即浮点运算单元(Float Point Unit)。浮点运算,对于定点 CPU(没有 FPU 的 CPU)
来说必须要按照 IEEE-754 标准的算法来完成运算,是相当耗费时间的。而对于有 FPU 的 CPU
来说,浮点运算则只是几条指令的事情,速度相当快

LDR.W R0, =0xE000ED88 ; 使能浮点运算 CP10,CP11
LDR R1,[R0]
ORR R1,R1,#(0xF << 20)
STR R1,[R0]
DSB
此部分代码是 Reset_Handler 函数的部分内容(默认就是有的,我们不需要修改和添加),功能就是设置 CPACR 寄存器的 20~23 位为1,以开启 STM32H743 的硬件 FPU 功能。

但是,仅仅开启硬件 FPU 是不够的,我们还需要在编译器上面,做一下设置,否则编译器
遇到浮点运算,还是采用传统的方式(IEEE-754 标准)完成运算,不能体现硬件浮点运算的优
势。这里,我们在 MDK5 编译器里面,点击 按钮,然后在 Target 选项卡里面,设置 Floating
Point Hardware 为 Double Precision,如图 56.1.1.2 所示:(我估计这个过程,编译器实际上就是在单片机程序里添加了定义了__FPU_USED这样的一个宏,文章末尾我会讲解一下hal库函数工程确实就是这么回事)

这样就成功开启了FPU,当我们的程序中有浮点数计算的时候单片机就会自动调用FPU硬件单元进行计算了

经过这个设置,编译器遇到浮点运算就会使用硬件 FPU 相关指令,执行浮点运算,从而大
大减少计算时间。

最后,总结下 STM32H743 硬件 FPU 使用的要点:
1, 设置 CPACR 寄存器 bit20~23 为 1,使能硬件 FPU。
2, MDK 编译器 Code Generation 里面设置:Double Precision。不需要在代码里添加任何东西
经过这两步设置,我们的编写的浮点运算代码,即可使用 STM32H743 的硬件 FPU 了,可
以大大加快浮点运算速度。

----------------------------------------------------------------------------------------------------------------------------------------------

hal库函数工程:

我们在 system_stm32h7xx_c 文件里面开启,代码如下:
void SystemInit(void)
{
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
……//省略部分代码
}
此部分代码是系统初始化函数的部分内容,功能就是设置 CPACR 寄存器的 20~23 位为 1,
以开启 STMH32H7 的硬件 FPU 功能。从程序可以看出,只要我们定义了全局宏定义标识符
__FPU_PRESENT 以及__FPU_USED 为 1,那么就可以开启硬件 FPU。其中宏定义标识符
__FPU_PRESENT 用来确定处理器是否带 FPU 功能,标识符__FPU_USED 用来确定是否开启
FPU 功能。
实际上,因为 H7 是带 FPU 功能的,所以在我们的 stm32h743xx.h 头文件里面,我们默认
是定义了__FPU_PRESENT 为 1。大家可以打开文件搜索即可找到下面一行代码:
#define __FPU_PRESENT 1
但是,仅仅只是说明处理器有 FPU 功能是不够的,我们还需要开启 FPU 功能。开启 FPU
有两种方法,第一种是直接在头文件 STM32h743xx.h 中定义宏定义标识符__FPU_USED 的值为
1。也可以直接在 MDK 编译器上面设置,我们在 MDK5 编译器里面,点击 按钮,然后在 Target
选项卡里面,设置 Floating Point Hardware 为 Use Double Precision

经过这个设置,编译器会自动加入标识符__FPU_USED 为 1。这样遇到浮点运算就会使用
硬件 FPU 相关指令,执行浮点运算,从而大大减少计算时间。

通过实验对比发现,使用硬件 FPU 和不使用硬件 FPU 对比,同样的条件下,硬件 FPU 快了近
16 倍,充分体现了 STM32H743 硬件 FPU 的优势

猜你喜欢

转载自blog.csdn.net/kangkanglhb88008/article/details/89506240