你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【MCU实战经验】+STM32F4 的FPU 的配置

[复制链接]
wfmjj 提问时间:2014-4-1 10:02 /
STM32F4 FPU 的配置

编译环境为EWARM-6601

首先看下面一段代码:来自core_cm4.h文件

/*!< __FPU_USED to be checked prior to making use of FPU specific registers and functions */

#if defined ( __CC_ARM )

  #if defined __TARGET_FPU_VFP

    #if (__FPU_PRESENT == 1)

      #define __FPU_USED       1

    #else

      #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"

      #define __FPU_USED       0

    #endif

  #else

    #define __FPU_USED         0

  #endif

 

#elif defined ( __ICCARM__ )                     //IAR编译工具的开关

  #if defined __ARMVFP__                      //要求编译出的文件使用FPU功能

    #if (__FPU_PRESENT == 1)                 //检查是否有FPU功能

      #define __FPU_USED       1

    #else

      #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"

      #define __FPU_USED       0

    #endif

  #else

    #define __FPU_USED         0

  #endif

 

#elif defined ( __GNUC__ )

  #if defined (__VFP_FP__) && !defined(__SOFTFP__)

    #if (__FPU_PRESENT == 1)

      #define __FPU_USED       1

    #else

      #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"

      #define __FPU_USED       0

    #endif

  #else

    #define __FPU_USED         0

  #endif

 

#elif defined ( __TASKING__ )

    /* add preprocessor checks to define __FPU_USED */

    #define __FPU_USED         0

#endif

这里针对各种工具链设置了相应的条件编译选项,这里只说IAR的,其他工具链的用户请参考本文自行修改.

最上层的开关是 __CC_ARM 这个宏,很明显这个开关是针对MDK工具的,同理IAR工具的开关就叫做 __ICCARM__ 了;

然后一个开关就是__ARMVFP__ 了,这个开关要求编译出的文件使用FPU功能,但是m4的FPU并不是必装设备,某些厂家可能会不装这个东西,所以需要检查是否有FPU,即 __FPU_PRESENT 这个开关。在core_cm4.h中有这样的代码:

#ifndef __FPU_PRESENT

    #define __FPU_PRESENT             0

    #warning "__FPU_PRESENT not defined in device header file; using default!"

  #endif

 

  #ifndef __MPU_PRESENT

    #define __MPU_PRESENT             0

    #warning "__MPU_PRESENT not defined in device header file; using default!"

  #endif

由上述代码可以知道CMSIS默认的定义是没有FPU的,所以需要我们手动添加FPU存在的定义

#define  __FPU_PRESENT         1

这样FPU存在与否的检查就通过了,所以后面就自动定义了 __FPU_USED 这一开关。因此就有了下面的定义

#define __FPU_USED       1

因为m4增加了FPU(单精度浮点数),所以很多数学函数都应该用m4专用的,优化过的,而不是之前的通用函数。

打开arm_math.h文件

* Each library project have differant pre-processor macros.

   *

   * ARM_MATH_CMx:

   * Define macro ARM_MATH_CM4 for building the library on Cortex-M4 target,

* ARM_MATH_CM3 for building library on Cortex-M3 target

   * and ARM_MATH_CM0 for building library on cortex-M0 target.

   *

   * ARM_MATH_BIG_ENDIAN:

   * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets.

   *

   * ARM_MATH_MATRIX_CHECK:

   * Define macro for checking on the input and output sizes of matrices

   *

   * ARM_MATH_ROUNDING:

   * Define macro for rounding on support functions

   *

   * __FPU_PRESENT:

   * Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries

以上代码说明:要用ARM的数学函数得定义ARM_MATH_CMx即得有下面的定义

#define   ARM_MATH_CM4

如果你想使用STM32F4的FPU功能而又不想管Project中的设置那么使用下面的代码:

 

 

#define    __FPU_PRESENT 1                // FPU开关

 

#ifndef   __ARMVFP__                    //要求在生成的代码中使用FPU

#define   __ARMVFP__

#endif

 

#ifndef    ARM_MATH_CM4               //要求使用m4的数学库函数

#define   ARM_MATH_CM4

#endif

也可以在软件中开FPU功能IAR的设置如下:

wee.JPG

MDK中的设置如下

%E6%9C%AA%E5%91%BD%E5%90%8D2.JPG

对于Cortex-M0或者M3处理器类型,由于没有FPU因此无法直接进行浮点运算,只能将浮点数进行Q规格化 (q7、 q15或Q31)处理,如开平方运算: M0/M3只能通过迭代法 ( 标准数学函数库 ) 计算,而M4直接调用VSQRT指令完成。

DSP_Lib的文件结构

%E6%9C%AA%E5%91%BD%E5%90%8D5.JPG

事实上arm_math.h文件中的定义就为源文件组使用的 因此在将源文件组编译为库时,在应用工程中添加这个库和arm_math.h即可访问所有DSP库功能。也可以根据需要只添加arm_math.h和需要的源文件,以缩短程序长度。

(1)   BasicMathFunctions源文件组

提供浮点数的各种基本运算函数,如加减乘除等运算。对于M0/M3只能用Q运算,即文件夹下以 _q7_q15 _q31结尾的文件;而M4能直接硬件浮点计算,属于文件夹下以 _f32结尾的文件

(2)   CommonTables源文件组

     arm_common_tables.c文件提供位翻转或相关参数表。

(3)   ComplexMathFunctions源文件组

复数数学功能,如向量处理,求模运算的。

(4)   ControllerFunctions源文件组

控制功能,主要PID控制函数arm_sin_cos_f32/-q31.c函数提供360点正余弦函数表和任意角度的正余弦函数值计算功能

(5)   FastMathFunctions源文件组

快速数学功能函数, 提供256正余弦函数表任意角度的正余弦函数值计算功能,和Q值开平方运算

Arm_cos_f32/_q15/_q31.c:提供256点余弦函数表任意角度余弦值计算功能

Arm_sin_f32/_q15/_q31.c:提供256点正弦函数表和任意角度正弦值计算功能。

Arm_sqrt_q15/q31.c 提供迭代法计算平方根的函数

对于M4的平方根运算,通过执行VSQRT指令完成

(6)   FilteringFunctions源文件组

滤波函数功能,主要为FIRLMS (最小均方根)滤波函数。

(7)   MatrixFunctions源文件组

矩阵处理函数

(8)   StatisticsFunctions源文件组

统计功能函数,如求平均值、计算RMS 、计算方差 / 标准差等。

(9)   SupportFunctions源文件组

支持功能函数,如数据拷贝, Q格式和浮点格式相互转换, Q任意格式相互转换。

(10)             TransformFunctions源文件组

变换功能,包括复数FFT CFFT / 复数FFT逆运算 CIFFT 实数FFT RFFT / 实数FFT逆运算(RIFFT 、和DCT (离散余弦变换)和配套的初始化函数。

IAR的环境下运行一个简单的浮点运算:

主函数如下:

%E6%9C%AA%E5%91%BD%E5%90%8D7.JPG

 

 

通过IAR软件Terminal I/O 窗口观察的输出结果

%E6%9C%AA%E5%91%BD%E5%90%8D6.JPG

 






收藏 2 评论5 发布时间:2014-4-1 10:02

举报

5个回答
feel-376797 回答时间:2014-5-6 21:21:38

RE:【MCU实战经验】+STM32F4 的FPU 的配置

谢谢楼主分享!
watershade 回答时间:2015-7-19 22:40:45
楼主为什么keil V5没有FPU的那个选项?如图:
keil.PNG
MrLi... 回答时间:2016-9-22 15:05:33
楼主,你好  我配置后出现这个错误
../Drivers/CMSIS/Include/core_cm4.h(129): error:  #35: #error directive: "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
什么情况,求解,谢谢
peter001 回答时间:2016-11-1 01:08:45
fpu是不是编译器会自动调用
高二毛 回答时间:2016-11-1 08:30:10
好资料,谢谢分享。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版