STM32H7使用FPU与DSP

文章介绍了Cortex-M7处理器如何通过启用FPU进行高效浮点运算,以及利用DSP加速数字信号处理,包括使用arm_math库中的函数如FFT和复数模值计算。实验显示了FPU启用和优化等级对性能的影响。

FPU:浮点运算单元

                Cortex-M7内核支持双精度浮点,可以大大加速浮点运算的处理速度。

开启后,小数的运算自动使用FPU进行运算。

FPU开启:

void SystemInit (void)
{
#if defined (DATA_IN_D2_SRAM)
 __IO uint32_t tmpreg;
#endif /* DATA_IN_D2_SRAM */

  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2)));  /* set CP10 and CP11 Full Access */
  #endif

具体开启代码:写在初始化代码(看该条指令是否为灰色,可判断是否开启)

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


 

开启的两个标志位:

__FPU_PRESENT默认默认就为1

开启FPU中的__FPU_USED标志位的地方。

使用:

就正常写计算式,计算时能自动调用FPU计算小数

其它:

选择更加高的优化等级,并且全部编译,可再次提高运算速度。

实际对比:

无FPU+优化等级0:900.4ms

FPU+优化等级0:100.4ms

FPU+优化等级3:55.4ms

DSP:数字信号处理

DSP单元集成了一批专用的指令集(主要是SMID指令和快速MAC乘积累加指令),可以加速数字信号处理的执行速度。

Keil添加库后,利用DSP库里的运算函数进行运算

ST将这些库封装成.lib

不同内核的.lib的选择

相关头文件

添加对应的宏

STM32H750xx,USE_HAL_DRIVER,ARM_MATH_DSP,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING

主要是后面几个:

,ARM_MATH_DSP,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING

使用:

添加对应的头文件,然后调用对应的函数。

1.添加头文件
#include "arm_math.h"

2.调用运算函数:

/* 使用 DSP 优化的 sin, cos 函数, 输入角度,传出值*/
cosx = arm_cos_f32(angle); 
sinx = arm_sin_f32(angle);

/* FFT 算法*/

/* Deprecated */

arm_status arm_cfft_radix4_init_f32(arm_cfft_radix4_instance_f32 * S,
uint16_t fftLen, uint8_t ifftFlag, uint8_t bitReverseFlag);

/* Deprecated */

void arm_cfft_radix4_f32(const arm_cfft_radix4_instance_f32 * S,float32_t * pSrc);

/**

* @brief Floating-point complex magnitude
* @param[in] pSrc points to the complex input vector
* @param[out] pDst points to the real output vector
* @param[in] numSamples number of complex samples in the input vector
*/

void arm_cmplx_mag_f32(float32_t * pSrc, float32_t * pDst,uint32_t numSamples);



第一个函数 arm_cfft_radix4_init_f32,用于初始化 FFT 运算相关参数,其中: fftLen 用于指
定 FFT 长度(16/64/256/1024/4096),本章设置为 1024; ifftFlag 用于指定是傅里叶变换(0)还是
反傅里叶变换(1),本章设置为 0; bitReverseFlag 用于设置是否按位取反,本章设置为 1;最后,
所有这些参数存储在一个 arm_cfft_radix4_instance_f32 结构体指针 S 里面。
第二个函数 arm_cfft_radix4_f32 就是执行基 4 浮点 FFT 运算的, pSrc 传入采集到的输入信
号数据(实部+虚部形式),同时 FFT 变换后的数据,也按顺序存放在 pSrc 里面, pSrc 必须大
于等于 2 倍 fftLen 长度。另外, S 结构体指针参数是先由 arm_cfft_radix4_init_f32 函数设置好,
然后传入该函数的。
第三个函数 arm_cmplx_mag_f32 用于计算复数模值,可以对 FFT 变换后的结果数据,执行
取模操作。 pSrc 为复数输入数组(大小为 2*numSamples)指针,指向 FFT 变换后的结果; pDst
为输出数组(大小为 numSamples)指针,存储取模后的值; numSamples 就是总共有多少个数
据需要取模。
通过这三个函数,我们便可以完成 FFT 计算,并取模值。
 

除此之外:还能计算PID等,填入参数就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值