打印
[STM32H7]

STM32H7使用FPU与DSP

[复制链接]
246|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-2-23 08:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
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等,填入参数就行。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/JasonKyro/article/details/134775772

使用特权

评论回复
沙发
呐咯密密| | 2024-2-23 10:55 | 只看该作者
最近也在玩H7,性能强悍,真爽

使用特权

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

本版积分规则

1364

主题

13994

帖子

8

粉丝