使用STM32F4浮点运算(FPU)功能开启+使用DSP库

涉及到的参数:这里以stm32F4  MDK5.2为例

(1)配置开启FPU功能标志

#define   __FPU_PRESENT       1U   //stm32f4xx.h 系统已经配置

#define   __FPU_USED          1U  //这个在core_cm4.h中,需要配置

由图知,要判断__CC_ARM 是否定义 ,判断__TARGET_FPU_VFP是否定义,最后判断__FPU_PRESENT是否已经配置为1,前面3个条件都为真的情况下,才配置__FPU_USED=1;其实可以简单化,直接在用户程序中配置__FPU_USED=1即可;

__CC_ARM:  #define   __CC_ARM     //1 有的系统会自己配置

__TARGET_FPU_VFP:定义设备有FPU功能,所以加入下句:

  #define   __TARGET_FPU_VFP    //1

当然__CC_ARM、__TARGET_FPU_VFP也可以在MDK->Option->C/C++->…中定义,如下图

(2)浮点配置函数在void SystemInit(void)即在system_stm32f4xx.c中

void SystemInit(void)

{

  /* FPU settings ------------------------------------------------------------*/

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

    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */

  #endif

就这一句   其实也可以不配置 __FPU_PRESENT  __FPU_PRESENT,直接把条件编译给删了,这句程序就有效了;如果有的库不带这几句配置,那么用户自己添加

…………………..

}

(3)加入头文件

#include “arm_math.h”  使用STM32自带的数学处理函数,同时添加arm_math.h头文件路径,这时编译会报错,提示:#error "Define according the used Cortex core ARM_MATH_CM7, ARM_MATH_CM4, ARM_MATH_CM3, ARM_MATH_CM0PLUS or ARM_MATH_CM0",是说没有定义内核数学类型,解决,2个方法:

方法1:在MDK软件中配置,我是用的是M4,选择ARM_MATH_CM4

方法2:用户单独定义一下ARM_MATH_CM4即可

2个方法看用户喜欢哪个

4MDK配置如下图,在浮点运算选项中选择:Use Single Precision

如果选择了Not Used 编译时会报错

以上配置已经可以使用STM32的浮点运算FPU功能了,测试结果,用2个小数相乘,在线仿真,看反汇编中出现xxx.F32语句,即说明开启了FPU功能

还有的会在MDK配置C++ define中加上ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING这两个配置

ARM_MATH_ROUNDING是四舍五入功能,可以不加;

ARM_MATH_MATRIX_CHECK是矩阵参数检查功能,可以不加

5)如果使用STM32自带的dsp运算函数还要添加对应的库函数

以上只是开启STM32内部的硬件FPU浮点运算功能,这里还没有涉及到DSP

要想使用DSP还得做一些处理

  1. 加入dsp数学库(加到哪个文件夹下可随意)

 

 

 

arm_cortexM4lf_math.lib是什么功能呢?

这个是下面具体dsp函数的汇编或由之编译的库,下面的具体功能函数是c编写的,如果直接这样使员工的话,会导致效率变低,所以使用对应的汇编函数实现,可以不关注这个lib文件,如果想了解具体的功能函数,可以参照下面说明,查看具体的.C文件查找对应的函数

arm_cortexM4lf_math.lib已经包含了所有dsp具体功能函数,其实只加入这个就可以了,这个.lib文件是打不开的不是必须加入下面对应的.C文件,这里提供.C文件只是让设计者去了解如何调用函数,及内部程序实现步骤

但是反过来不行,如果之加入对应的c文件,而不加入lib文件会编译报错

2.官方带的具体功能dsp函数库(这个不必须添加,只是设计者了解,知道函数名)

3.使用方法

比如使用正弦sin要加入arm_sin_f32.c(不必须)

余弦cos要加入  arm_cos_f32.c调用(不必须)

这里没有对应的头文件,要加入其它头文件,可以看具体c文件

打开对应的库.c文件,里面有函数名,实际使用得时候就按这个来,不能按以前math.h中对应的函数名了

CosVal=arm_cos_f32(radians);//计算余弦函数

可以只加入arm_cortexM4lf_math.lib文件,然后把对应函数功能的c文件移除工程,继续调用对应的dsp函数,一样的运行

异常处理:

有时配置FPU不正确,会出现HardFault_Handler,原因是:编译器产生了浮点运算指令,但是硬件没有开启浮点运算功能,这样一运算就错误,要检查一遍配置是否正确

  • 11
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值