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

[复制链接]
1551|19
 楼主| 喂什么玩意 发表于 2023-11-20 23:37 | 显示全部楼层 |阅读模式
背景
今天需要用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的初始化。
88434655b7d2817161.png

 楼主| 喂什么玩意 发表于 2023-11-20 23:37 | 显示全部楼层
添加官方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

27842655b7d3d0d49b.png
 楼主| 喂什么玩意 发表于 2023-11-20 23:37 | 显示全部楼层
3.2 头文件
DSP库头文件有三个,路径是

C:\Users\用户名\STM32Cube\Repository\STM32Cube_FW_F4_V1.24.0\Drivers\CMSIS\DSP\Include
 楼主| 喂什么玩意 发表于 2023-11-20 23:37 | 显示全部楼层
3.3 源文件
源文件是一些math运算,在arm中优化过的。有不少文件夹,直接复制粘贴到工程源文件目录内。

C:\Users\用户名\STM32Cube\Repository\STM32Cube_FW_F4_V1.24.0\Drivers\CMSIS\DSP\Source
 楼主| 喂什么玩意 发表于 2023-11-20 23:37 | 显示全部楼层
4 配置IDE
右键工程,选属性。在C/C++ General -> Paths and Symbols 中的Symbols增加以下定义

__FPU_PRESENT,且数值1

__FPU_USED,且数值1

__TARGET_FPU_VFP

ARM_MATH_CM4
 楼主| 喂什么玩意 发表于 2023-11-20 23:38 | 显示全部楼层
52655b7d5874c77.png 最后编译工程。
 楼主| 喂什么玩意 发表于 2023-11-20 23:38 | 显示全部楼层
上机试验
在main.c中增加



#include "math.h"
#include "arm_math.h"
 楼主| 喂什么玩意 发表于 2023-11-20 23:38 | 显示全部楼层
不使用DSP库
直接使用math.h中的sin计算正弦。

  1. HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_SET);

  2. Vrefa = Modul_Factor * sin(2*PI*b_SinWaveFreq*b_PwmPrdUpdateCnt/3000) / 2 + 0.5;
  3. Vrefb = Modul_Factor * sin(2*PI*b_SinWaveFreq*b_PwmPrdUpdateCnt/3000 + 2*PI/3) / 2 + 0.5;
  4. Vrefc = Modul_Factor * sin(2*PI*b_SinWaveFreq*b_PwmPrdUpdateCnt/3000 - 2*PI/3) / 2 + 0.5;
  5. HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET);
 楼主| 喂什么玩意 发表于 2023-11-20 23:38 | 显示全部楼层
观察PE7高电平时间,即可得到这三行代码的运算耗时。测量结果是59us(每次计算有几个us的误差的)。我这几行代码是在TIM3的周期中断函数内计算的。每秒计算3KHz。 23532655b7d7adaad2.png
 楼主| 喂什么玩意 发表于 2023-11-20 23:38 | 显示全部楼层
使用DSP库
使用arm_math.h中的arm_sin_f32计算正弦(这函数输入输出都是float32浮点数)。

  1. HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_SET);

  2. Vrefa = Modul_Factor * arm_sin_f32(2*PI*b_SinWaveFreq*b_PwmPrdUpdateCnt/3000) / 2 + 0.5;
  3. Vrefb = Modul_Factor * arm_sin_f32(2*PI*b_SinWaveFreq*b_PwmPrdUpdateCnt/3000 + 2*PI/3) / 2 + 0.5;
  4. Vrefc = Modul_Factor * arm_sin_f32(2*PI*b_SinWaveFreq*b_PwmPrdUpdateCnt/3000 - 2*PI/3) / 2 + 0.5;
  5. HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET);
 楼主| 喂什么玩意 发表于 2023-11-20 23:38 | 显示全部楼层
继续观察PE7高电平保持时间。结果是5us。优化了10倍速度。
 楼主| 喂什么玩意 发表于 2023-11-20 23:39 | 显示全部楼层
Wordsworth 发表于 2024-7-11 07:29 | 显示全部楼层

模块电源选购灌封材料的时候,需要注意导热系数要能达到电子部件散热的需求,不过粘接能力不太强
公羊子丹 发表于 2024-7-11 09:25 | 显示全部楼层

可能击穿开关器件,
万图 发表于 2024-7-11 10:28 | 显示全部楼层

如果想要让它正常工作且不会损坏
Uriah 发表于 2024-7-11 11:31 | 显示全部楼层

前模块电源灌封时用的最多的是加成型有机灌封硅胶
帛灿灿 发表于 2024-7-11 13:27 | 显示全部楼层

电阻属于一个普通的元件
周半梅 发表于 2024-7-11 16:26 | 显示全部楼层

当异常过压消失,恢复至高阻态
Pulitzer 发表于 2024-7-11 17:29 | 显示全部楼层

微控制器、数字信号控制器和处理器都具有内部的ESD钳位二极管
童雨竹 发表于 2024-7-11 19:25 | 显示全部楼层

ESD电压一般超过导通电压
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

647

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部