赞
踩
今天需要用STM32F4计算sin(),碰巧发现网上有教程开启STM32F407VG的FPU,同时调用DSP库。本人用的是免费的STM32CubeIDE开发STM32,不知能否适用。
Windows 10 + STM32CubeIDE 1.0.2 + STM32CubeMX 5.3.0 + STM32Cube_FW_F4_V1.24.1 +STM32F4discovery
(略过)
通过选择板卡初始化程序,能自动生成板载外围的初始化代码。能自动为STM32F4Discoery生成LED、按键等。
我自行增加了TIM1、TIM3的初始化。
文件夹中找到官方DSP库所需的LIB、头文件、源文件,复制粘贴至工程目录内。所需文件见下图。
STM32F407VG对应的库文件是arm_cortexM4lf_math.lib:
C:\Users\用户名\STM32Cube\Repository\STM32Cube_FW_F4_V1.24.0\Drivers\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib
DSP库头文件有三个,路径是
C:\Users\用户名\STM32Cube\Repository\STM32Cube_FW_F4_V1.24.0\Drivers\CMSIS\DSP\Include
源文件是一些math运算,在arm中优化过的。有不少文件夹,直接复制粘贴到工程源文件目录内。
C:\Users\用户名\STM32Cube\Repository\STM32Cube_FW_F4_V1.24.0\Drivers\CMSIS\DSP\Source
右键工程,选属性。在C/C++ General -> Paths and Symbols 中的Symbols增加以下定义
__FPU_PRESENT,且数值1
__FPU_USED,且数值1
__TARGET_FPU_VFP
ARM_MATH_CM4
最后编译工程。
在main.c中增加
- #include "math.h"
- #include "arm_math.h"
直接使用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。
使用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倍速度。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。