STM32 keil MDK配置FPU详解

STM32 keil MDK配置FPU详解

记录下keil对FPU的配置,及对应的宏参数。

文章目录

前言一、一些宏的说明二、勾选开启FPU

前言

FPU单元是芯片上一个独立于CPU处理的浮点运算单元,整个单元可以被使能和关闭。 STM32F4带有32位单精度硬件FPU支持浮点指令集。相比Cortex-M3、Cortex-M0等无FPU的芯片高出数十倍甚至上百倍的运算性能。 STM32F7/H7及以上处理器带有双精度硬件FPU。 如果芯片支持FPU的话,ST公司会在驱动库中添加对应宏定义__FPU_PRESENT。 下面这个是STM32G4系列,支持FPU

没有FPU的芯片一般不会有这个宏定义,就像下面这个F1的

一、一些宏的说明

有效配置FPU的方法如下图所示: 其中可以看到,真正有效的配置是一句寄存器设置,而控制这句指令是否使用的是两个宏(__FPU_PRESENT == 1) && (__FPU_USED == 1)。前者是表示FPU功能是否存在,后者表示程序员是否要使用FPU。 所以对于有FPU的芯片,直接在C/C++的全局宏定义里添加__FPU_USED=1便可以打开FPU功能。像下面这样: 但是这种方法不常用,也不方便。

二、勾选开启FPU

对于使用CubeMX的用户,如果芯片带有FPU,会默认开启FPU功能,即下面的勾选框: 无FPU的芯片是没有这个选项的(附F1界面):

那么这个选项到底影响了什么?

先说结论,看库的这段代码: 如果用的编译器是ARM Compiler 5,那么__CC_ARM是定义的,次一级的__TARGET_FPU_VFP就是对应上面的选择框的,选了__TARGET_FPU_VFP就有定义,不选他就会把__FPU_USED置0,也就是不使用FPU。如果勾选了选择框,首先会检查是否有FPU,没有就会报错;有的话他会#define __FPU_USED 1U 把它置1,从而使能system_stm32xxxx.c中那句指令,开启FPU。

以下的测试代码是我当时为了搞明白对应关系写的,可以有选择地注释掉部分报错指令,来观察定义关系:

#if defined __TARGET_FPU_VFP

#error "def __TARGET_FPU_VFP"

#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)

#error "def __FPU_PRESENT == 1U"

#define __FPU_USED 1U

#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)

#error "FPU OK!!!"

#endif

#else

#error "device without an FPU (check __FPU_PRESENT)"

#define __FPU_USED 0U

#endif

#else

#error "undef __TARGET_FPU_VFP"

#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)

#error "def __FPU_PRESENT == 1U"

#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)

#error "FPU OK!!!"

#else

#error "__FPU_PRESENT != 1 || __FPU_USED != 1"

#endif

#else

#error "device without an FPU (check __FPU_PRESENT)"

#endif

#endif

相关推荐

荷花香烟价格表和图片大全(2025年度)
beat365中文官方网站

荷花香烟价格表和图片大全(2025年度)

📅 09-04 👁️ 5686
OPC常见问题
365bet官网提现说维护

OPC常见问题

📅 08-10 👁️ 6461
许志安十大经典歌曲榜中榜
365bet官网提现说维护

许志安十大经典歌曲榜中榜

📅 09-05 👁️ 320