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
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 Keil MDK配置FPU的详细解析

    发表回复