STM32CubeIDE下使能STM32F4的FPU同时调用DSP库计算正弦函数

0 背景

今天需要用STM32F4计算sin(),碰巧发现网上有教程开启STM32F407VG的FPU,同时调用DSP库。本人用的是免费的STM32CubeIDE开发STM32,不知能否适用。

1 环境

Windows 10 + STM32CubeIDE 1.0.2 + STM32CubeMX 5.3.0 + STM32Cube_FW_F4_V1.24.1 +STM32F4discovery

2 STM32CubeMX生成初始化代码

(略过)

通过选择板卡初始化程序,能自动生成板载外围的初始化代码。能自动为STM32F4Discoery生成LED、按键等。

我自行增加了TIM1、TIM3的初始化。

3 添加官方DSP库

文件夹中找到官方DSP库所需的LIB、头文件、源文件,复制粘贴至工程目录内。所需文件见下图。

3.1 LIB

STM32F407VG对应的库文件是arm_cortexM4lf_math.lib:

C:\Users\用户名\STM32Cube\Repository\STM32Cube_FW_F4_V1.24.0\Drivers\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib

3.2 头文件

DSP库头文件有三个,路径是

C:\Users\用户名\STM32Cube\Repository\STM32Cube_FW_F4_V1.24.0\Drivers\CMSIS\DSP\Include

3.3 源文件

源文件是一些math运算,在arm中优化过的。有不少文件夹,直接复制粘贴到工程源文件目录内。

C:\Users\用户名\STM32Cube\Repository\STM32Cube_FW_F4_V1.24.0\Drivers\CMSIS\DSP\Source

4 配置IDE

右键工程,选属性。在C/C++ General -> Paths and Symbols 中的Symbols增加以下定义

__FPU_PRESENT,且数值1

__FPU_USED,且数值1

__TARGET_FPU_VFP

ARM_MATH_CM4

最后编译工程。

5 上机试验

在main.c中增加

 

#include "math.h"
#include "arm_math.h"

5.1 不使用DSP库

直接使用math.h中的sin计算正弦。

HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_SET);

Vrefa = Modul_Factor * sin(2*PI*b_SinWaveFreq*b_PwmPrdUpdateCnt/3000) / 2 + 0.5;
Vrefb = Modul_Factor * sin(2*PI*b_SinWaveFreq*b_PwmPrdUpdateCnt/3000 + 2*PI/3) / 2 + 0.5;
Vrefc = Modul_Factor * sin(2*PI*b_SinWaveFreq*b_PwmPrdUpdateCnt/3000 - 2*PI/3) / 2 + 0.5;
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET);

观察PE7高电平时间,即可得到这三行代码的运算耗时。测量结果是59us(每次计算有几个us的误差的)。我这几行代码是在TIM3的周期中断函数内计算的。每秒计算3KHz。

5.2 使用DSP库

使用arm_math.h中的arm_sin_f32计算正弦(这函数输入输出都是float32浮点数)。

HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_SET);

Vrefa = Modul_Factor * arm_sin_f32(2*PI*b_SinWaveFreq*b_PwmPrdUpdateCnt/3000) / 2 + 0.5;
Vrefb = Modul_Factor * arm_sin_f32(2*PI*b_SinWaveFreq*b_PwmPrdUpdateCnt/3000 + 2*PI/3) / 2 + 0.5;
Vrefc = Modul_Factor * arm_sin_f32(2*PI*b_SinWaveFreq*b_PwmPrdUpdateCnt/3000 - 2*PI/3) / 2 + 0.5;
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET);

继续观察PE7高电平保持时间。结果是5us。优化了10倍速度。

  • 20
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
STM32F4 DSP是一种用于在STM32F4系列微控制器上进行数字信号处理的。它提供了一系列的函数和算法,用于实现基本的数学运算、滤波、FFT、向量操作等。\[1\] 要在STM32F4上使用DSP,需要进行一些环境配置。首先,在CUBEMX中生成工程时,需要勾选生成工程时添加所有。然后,在Keil中进行宏定义,包括__FPU_PRESENT=1、__TARGET_FPU_VFP、ARM_MATH_CM4和__CC_ARM。接下来,在Keil中添加DSP的位置,即../Drivers/CMSIS/DSP/Include。然后,将lib文件的lf后缀添加到工程的core文件夹下。最后,在使用函数时,需要包含头文件arm_math.h,并编译工程。\[2\] 通过以上配置和使用,您可以在STM32F4上使用DSP来实现各种数字信号处理的功能。 #### 引用[.reference_title] - *1* [stm32F407-------DSP学习](https://blog.csdn.net/qq_53889131/article/details/125983021)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32F4DSP](https://blog.csdn.net/weixin_44229819/article/details/124160520)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值