STM32F4+CubeMX+Hal库下使能FPU

STM32F4相比于F103系列的一个巨大优势是带硬件浮点单元FPU。我看网上有非常多关于在STM32CubeMX进行配置后使能FPU的一些操作方法,但是总感觉说的不到位。

   我们的原则是:
   尽量不破坏CubeMX自动生成的代码!也就是下次再次使用CubeMX生成代码时不需要再次瞎捣鼓一番来使能FPU!

在这里,重新帮大家捋一遍。

在STM32CubeMX生成工程后,在Keil中打开工程,首先确认配置界面Target选项卡中的Floating Point Hardware为Single Precision(即单精度硬件浮点单元)
在这里插入图片描述

打开system_stm42f4xx.c可以看到在第168行明确写着FPU单元的开启条件及相关的寄存器操作。所以,只需要定义“__FPU_PRESENT = 1” 且 “__FPU_USED = 1”即可开启FPU单元。
在这里插入图片描述
我们打开stm32f4xx.h中对应芯片型号的头文件,我这里用的是F405,所以从这里可以打开stm32f405xx.h:
在这里插入图片描述
在stm32f405xx.h的第52行可以看到,它本身已进行了__FPU_PRESENT = 1的宏定义了,也就是它告诉编译器“这个芯片有FPU单元”。
在这里插入图片描述

网上看到很多人说,直接强行在第53行加一句:#define __FPU_USED 1U,这是不对的,因为我们看后面,打开第164行的“core_cm4.h”
在这里插入图片描述
在“core_cm4.h”的第73行到160行,明确告诉你怎么才能让“__FPU_USED = 1”了。
在这里插入图片描述
从这里可以看到针对不同的编译器,有不同的开启条件。
首先看到的是“__CC_ARM”,这个是说“使用Keil自带的编译器”,后面还有“GNUC”、ICCARM、TI_ARM、TASKING、CSMC等。我们这里选择“__CC_ARM”,它默认的也是这个。

对于复杂运算,比如三角函数,开方等运算,如果编程时还是使用math.h头文件,那是没法提升效率的:因为math.h头文件是针对所有ARM处理器的,其运算函数都是基于定点CPU和标准算法(IEEE-754),并没有预见使用FPU的情况,需要很多指令和复杂的过程才能完成运算,也就增加了运算时间。

因此要充分发挥Cotex M4的硬件浮点运算功能,就需要使用固件库自带的arm_math.h,这个文件根据编译控制项(__FPU_USED == 1)来决定是使用哪一种函数方法:如果没有使用FPU,那就调用keil的标准math.h头文件中定义的函数;如果使用了FPU,那就是用固件库自带的优化函数来解决问题。
如果不使用CMSIS的,就会调用keil自带的标准库函数。否则就用CMSIS的定义。这里因为是用的STM32F4,所以应该要ARM_MATH_CM4控制,即加入core_cm4.h,否则就用使用ARMCM4.h——但在编译时keil会提示找不到这文件。因此需要在工程选项之C/C++选项卡的define中继续加入语句ARM_MATH_CM4。

所以:

第一步:添加宏定义

(1) 打开Keil工程的配置界面;
(2)切换至C/C++选项卡;
(3)添加如下代码:

,__FPU_PRESENT = 1U,ARM_MATH_CM4,__CC_ARM,__TARGET_FPU_VFP

在这里插入图片描述
按上述操作完成后,如果你的Keil是V5以上版本,你会在“core_cm4.h”的第73行到第79行看到这段代码变深色了,深色也就代表了使能。
在这里插入图片描述

第二步:添加头文件

我们这上面中,使能了固件库自带的浮点运算,还需要添加头文件arm_math.h。有些人说添加在stm32f4xx.h中,我表示难以苟同。因为我们的原则是下次用CubeMX生成代码时不需要再瞎操作,所以,这里我们直接添加在main.h中:
在这里插入图片描述
有些人说配置完上述,还需要到C盘复制“arm_cortexM4lf_math.lib”文件到工程下,其实并不需要。CubeMX生成工程中,包含了CMSIS库,工程文件夹\Drivers\CMSIS\Lib\ARM文件夹中已经包含了。
所以,按上面两步操作即可。
Good Luck!

  • 27
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值