STM32 keil MDK配置FPU详解

文章介绍了如何配置STM32的浮点运算单元(FPU),包括通过宏定义__FPU_PRESENT和__FPU_USED启用FPU,以及在CubeMX中开启FPU功能的影响。重点解释了__TARGET_FPU_VFP宏与FPU使用的关联,以及不正确配置时的错误处理。
摘要由CSDN通过智能技术生成

记录下keil对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
  • 11
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值