打印
[STM32F4]

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

[复制链接]
1022|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wang6623|  楼主 | 2023-11-20 23:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

涉及到的参数:这里以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++->…中定义,如下图





使用特权

评论回复
沙发
wang6623|  楼主 | 2023-11-20 23:42 | 只看该作者
(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,直接把条件编译给删了,这句程序就有效了;如果有的库不带这几句配置,那么用户自己添加

…………………..

}

使用特权

评论回复
板凳
wang6623|  楼主 | 2023-11-20 23:42 | 只看该作者
(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

使用特权

评论回复
地板
wang6623|  楼主 | 2023-11-20 23:43 | 只看该作者
方法2:用户单独定义一下ARM_MATH_CM4即可

2个方法看用户喜欢哪个

使用特权

评论回复
5
wang6623|  楼主 | 2023-11-20 23:50 | 只看该作者
MDK配置如下图,在浮点运算选项中选择:Use Single Precision

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

使用特权

评论回复
6
wang6623|  楼主 | 2023-11-20 23:50 | 只看该作者
以上配置已经可以使用STM32的浮点运算FPU功能了,测试结果,用2个小数相乘,在线仿真,看反汇编中出现xxx.F32语句,即说明开启了FPU功能

使用特权

评论回复
7
wang6623|  楼主 | 2023-11-20 23:50 | 只看该作者
还有的会在MDK配置C++ define中加上ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING这两个配置

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

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

使用特权

评论回复
8
wang6623|  楼主 | 2023-11-20 23:50 | 只看该作者
5)如果使用STM32自带的dsp运算函数还要添加对应的库函数

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

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

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

使用特权

评论回复
9
wang6623|  楼主 | 2023-11-20 23:50 | 只看该作者
arm_cortexM4lf_math.lib是什么功能呢?

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

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

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

使用特权

评论回复
10
wang6623|  楼主 | 2023-11-20 23:51 | 只看该作者
官方带的具体功能dsp函数库(这个不必须添加,只是设计者了解,知道函数名)

使用特权

评论回复
11
wang6623|  楼主 | 2023-11-20 23:51 | 只看该作者
使用方法

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

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

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

使用特权

评论回复
12
wang6623|  楼主 | 2023-11-20 23:51 | 只看该作者

使用特权

评论回复
13
wang6623|  楼主 | 2023-11-20 23:51 | 只看该作者

使用特权

评论回复
14
wang6623|  楼主 | 2023-11-20 23:51 | 只看该作者
打开对应的库.c文件,里面有函数名,实际使用得时候就按这个来,不能按以前math.h中对应的函数名了

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

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

使用特权

评论回复
15
wang6623|  楼主 | 2023-11-20 23:51 | 只看该作者
异常处理:

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

使用特权

评论回复
16
童雨竹| | 2024-7-11 07:26 | 只看该作者

给瞬间电流提供低阻抗导通路径

使用特权

评论回复
17
Wordsworth| | 2024-7-11 08:29 | 只看该作者

最典型的应用就是放大电路中的高低音频控制

使用特权

评论回复
18
公羊子丹| | 2024-7-11 10:25 | 只看该作者

需要设置电压钳位电路予以保护D3、N3构成的回路

使用特权

评论回复
19
万图| | 2024-7-11 11:28 | 只看该作者

需要串联一个限流电阻在其中

使用特权

评论回复
20
Uriah| | 2024-7-11 12:31 | 只看该作者

当人接触任何东西时,体内的电荷就会放电。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

454

帖子

0

粉丝