【STM32H7S78-DK】测评+DSP测试
[复制链接]
本帖最后由 dql2016 于 2024-10-10 21:22 编辑
STM32H7S78采用的是M7内核,支持双精度浮点DSP指令,性能强劲。通常可以在STM32CubeMX配置界面通过如下方法加入DSP库:
但实际测试下来,通过此方法STM32H7S78无法将DSP库添加到工程,因此只能采用手动下载DSP库并添加到STM32CubeIDE工程。
ARM公司提供的数字信号库CMSIS-DSP可以在github上下载,也可以在ST提供的STM32Cube软件包里面找到。由于CMSIS-5.6.0以后版本不再提供编译好的静态库,这里为了方便下载CMSIS-5.6.0版本,解压后主要关注下面3个文件夹:
Lib文件夹中包含的底层库包括IAR、KEIL、GCC三个编译器平台,字母l代表小端地址格式,b代表大端地址格式(所有STM32皆为小端地址格式处理器);字母f代表使用浮点处理单元(FPU)
对于M7内核提供如下3种:
arm_cortexM7lfdp_math.lib (Cortex-M7, Little endian, Double Precision Floating Point Unit)
arm_cortexM7lfsp_math.lib (Cortex-M7, Little endian, Single Precision Floating Point Unit)
arm_cortexM7l_math.lib (Cortex-M7, Little endian)
这里我们使用第1种。
DSP库Source目录包含了各种数学运算库的源码,如果使用添加源码的方式,能够更好的使用编译器的优化功能,这也是5.6.0不再提供静态库的原因,armcc v6无法对静态lib优化。
1)BasicMathFunctions
基本数学函数:提供浮点数的各种基本运算函数,如向量加减乘除等运算。
2)CommonTables
数字信号处理常用参数表。
3)ComplexMathFunctions
复数计算数学函数。
4)ControllerFunctions
控制算法函数。包括正弦余弦,PID电机控制,矢量Clarke变换,矢量Clarke逆变换等。
5)FastMathFunctions
常见快速算法的数学函数。
6)FilteringFunctions
滤波函数功能,主要为FIR和LMS(最小均方根)等滤波函数。
7)MatrixFunctions
矩阵处理函数。包括矩阵加法、矩阵初始化、矩阵反、矩阵乘法、矩阵规模、矩阵减法、矩阵转置等函数。
8)StatisticsFunctions
统计功能函数。如求平均值、最大值、最小值、计算均方根RMS、计算方差/标准差等。
9)SupportFunctions
支持功能函数,如数据拷贝,Q格式和浮点格式相互转换,Q任意格式相互转换。
10)TransformFunctions
变换功能。包括复数FFT(CFFT)/复数FFT逆运算(CIFFT)、实数FFT(RFFT)/实数FFT逆运算(RIFFT)、和DCT(离散余弦变换)和配套的初始化函数。
在工作空间目录下添加DSP文件夹:
将上面的Include、Lib、Source三个文件夹复制到DSP文件夹中,如下图:
然后在STM32CubeIDE指定库路径和头文件路径。
首先添加静态库:
然后添加静态库路径:
添加头文件引用路径:
添加宏定义:
使能硬件浮点运算单元FPU:
添加头文件:
#include "arm_math.h"
添加浮点运算测试代码:
//DSP库求均方根测试
static void DSP_RMS(void)
{
float32_t pSrc[10] = {0.7060f, 0.0318f, 0.2769f, 0.0462f, 0.0971f, 0.8235f, 0.6948f, 0.3171f,0.9502f, 0.0344f};
float32_t pResult;
uint32_t pIndex;
q31_t pSrc1[10];
q31_t pResult1;
q15_t pSrc2[10];
q15_t pResult2;
printf("******** stm32h7s78-dk eeworld dsp test ***********\r\n");
arm_rms_f32(pSrc, 10, &pResult);
printf("arm_rms_f32 : pResult = %f\r\n", pResult);
/*****************************************************************/
for(pIndex = 0; pIndex < 10; pIndex++)
{
pSrc1[pIndex] = rand();
}
arm_rms_q31(pSrc1, 10, &pResult1);
printf("arm_rms_q31 : pResult = %d\r\n", pResult1);
/*****************************************************************/
for(pIndex = 0; pIndex < 10; pIndex++)
{
pSrc2[pIndex] = rand()%32768;
}
arm_rms_q15(pSrc2, 10, &pResult2);
printf("arm_rms_q15 : pResult = %d\r\n", pResult2);
printf("******************************************************************\r\n");
}
调用
计算结果符合预期,可见DSP库被正确的加入到了工程中
附件:
|