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

查看: 15480|回复: 5

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

[复制链接]

36

主题

89

回帖

2

蝴蝶豆

金牌会员

最后登录
2020-12-9
发表于 2014-4-1 10:02:48 | 显示全部楼层 |阅读模式
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

 






<
回复

使用道具 举报

16

主题

560

回帖

1

蝴蝶豆

金牌会员

最后登录
2020-6-25
发表于 2014-5-6 21:21:38 | 显示全部楼层

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

谢谢楼主分享!
回复 支持 反对

使用道具 举报

50

主题

1057

回帖

67

蝴蝶豆

论坛元老

最后登录
2020-12-2
发表于 2015-7-19 22:40:45 | 显示全部楼层
楼主为什么keil V5没有FPU的那个选项?如图:
keil.PNG
回复 支持 反对

使用道具 举报

4

主题

17

回帖

0

蝴蝶豆

初级会员

最后登录
2016-10-18
发表于 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)"
什么情况,求解,谢谢
回复 支持 反对

使用道具 举报

11

主题

1139

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-7-10
发表于 2016-11-1 01:08:45 | 显示全部楼层
fpu是不是编译器会自动调用
回复 支持 反对

使用道具 举报

4

主题

574

回帖

3

蝴蝶豆

高级会员

最后登录
2020-12-9
发表于 2016-11-1 08:30:10 | 显示全部楼层
好资料,谢谢分享。
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版