[STM32F4] STM32F4使用FPU/DSP核心启用与测试

[复制链接]
27|10
小海师 发表于 2026-7-2 14:44 | 显示全部楼层 |阅读模式
STEP1、下载DSP库
具体链接如下:
https://www.st.com/en/embedded-software/stsw-stm32065.html?dl=9w6sdOSAKySFxBhN764Stg%3D%3D%2CIS1vzyA84KLAefK%2B0DawUl0FScREpiT6AdC3qFjIMJnCIgXIwr82G2XUFo6w43Wp5L5CUyrX3vZAoaHRE3nsTmRsArV3hnQOEgX73SKt8ss1vGrLlfXT24jUzDKvQoj0H4L2gBSZsUj3urRJVJbHG4DQFKfuPFNFVrLwAU%2BPiDijkoKerSTrWWYmm3p2HQVKGYnsx1PSiEhTwxxCtypyEyQ%2FF7Njoo91y8R1335R3mnkBMltxzkHazjuDUv70bqgF4Ag6Udlq%2FU%2BbwPnADU8bDIeFoajhGZqQ%2FVQKXnNRD1%2BX5QlTirHwE70z30iCggOevNWRUSduoDbL%2BfDrst3MpnbBMp8fS%2BnjdyzoMIr38s%3D&mkt_tok=ODU2LVBWUC03MTUAAAGSp9OfinR1c6wipFSEfUyersIL-3429o1xMWtufKm-UMHocChwATGGEfRPL7x0CqUGeHCOi81u1lnfvAqPgQYD0u3BcNopl_yaR7adaGH1cw#get-software

STEP2、移植到工程
下载完成后就是en.stsw这么一个压缩包。

1、找到如图路径,拷贝lib & .h文件到工程

407166a4490c9e1371.png

75346a4490c4db584.png

2、相信这一步大家都会(lib以及头文件正确的路径包含)

16796a4490c07e3c6.png

3、添加Define (, ARM_MATH_CM4)

201186a4490bba7797.png

4、勾选mirolib 和 single precision

332416a4490b75fcea.png

5、全局搜索stm32f411xe.h头文件中,添加宏定义 __FPU_PRESENT , __FPU_USED 并且赋值为1

694326a4490ac3b070.png

6、编译测试
测试代码中添加了sin运算的API,并且添加arm_math的头文件即可,编译测试。

479346a4490a55a7c9.png

STEP3、说明书
打开如下路径的index.html ,将是这个API的全套说明文档,用于翻阅查询的。

770336a44909f31c3c.png

975236a449098d83e9.png

STEP4、测试结果对比matlab
matlab测试 矩阵B/A的结果

355486a449093089d7.png

stm32f4测试结果打印

                        // 测试代码
                        float32_t dataA[]={1,25,3,2,31,4,3,43,51};
                        float32_t dataA_[9]={0};
                        arm_matrix_instance_f32 A,A_;
                        A.numRows =3;
                        A.numCols =3;
                        A.pData = dataA;
                       
                        A_.numRows =3;
                        A_.numCols =3;
                        A_.pData = dataA_;
                       
                        float32_t dataB[]={1,5,8};
                        float32_t dataC[3]={0};
                        arm_matrix_instance_f32 B,C;
                        B.numRows =1;
                        B.numCols =3;
                        B.pData = dataB;
                        C.numRows =1;
                        C.numCols =3;
                        C.pData = dataC;
                        // 求逆
                        arm_mat_inverse_f32(&A,&A_);
                        // B/A = C
                        arm_mat_mult_f32(&B,&A_,&C);
                        // 打印结果
                        printf("C = ");
                        for(int i=0;i<3;i++)
                        {
                                printf(" %f ",C.pData);
                        }
                        printf("\r\n");

663536a44908aa5d71.png

————————————————
版权声明:本文为CSDN博主「滤波电了个龙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33479881/article/details/138134104

公羊子丹 发表于 2026-7-14 13:07 | 显示全部楼层
我之前移植DSP库总报浮点运算硬故障,后来发现没在编译器开启FPU硬件,勾选Single Precision并启用硬件浮点,编译报错直接全部消失。
周半梅 发表于 2026-7-14 13:08 | 显示全部楼层
想问下楼主,F411使用arm_cortexM4lf_math.lib和bf库性能差距大吗?低功耗场景下选lf库会不会大幅降低矩阵运算速度?
帛灿灿 发表于 2026-7-14 13:09 | 显示全部楼层
分享移植踩坑经验,只加ARM_MATH_CM4宏不够,CubeMX工程要在系统初始化里手动开启FPU,不然浮点API运行直接卡死。
童雨竹 发表于 2026-7-14 13:10 | 显示全部楼层
调侃一句很多人忽略MicroLIB搭配问题,不用MicroLIB时浮点打印容易乱码,开启之后printf输出float数值才不会出现异常数字。
万图 发表于 2026-7-14 13:11 | 显示全部楼层
我怀疑矩阵求逆误差偏大是数据位数问题,高精度运算建议改用q31定点函数,相比f32浮点和Matlab偏差会缩小很多。
Wordsworth 发表于 2026-7-14 13:12 | 显示全部楼层
做音频滤波开发给个实操建议,测试滤波算法先拿小数组和Matlab逐点比对,确认数值一致再上真实采样数据流。
Bblythe 发表于 2026-7-14 13:13 | 显示全部楼层
有个疑问想请教,RTOS多任务同时调用DSP浮点函数,要不要加互斥锁保护FPU寄存器,会不会出现浮点运算结果错乱?
Pulitzer 发表于 2026-7-14 13:14 | 显示全部楼层
之前只拷贝头文件忘记添加对应lib库,编译提示arm_sin_f32未定义,核对lib文件名,根据芯片浮点规格选对应库文件即可解决。
Uriah 发表于 2026-7-14 13:15 | 显示全部楼层
这问题挺常见的,手动在头文件定义__FPU_USED容易被CubeMX重新生成代码覆盖,直接在工程预定义里添加更稳定。
Clyde011 发表于 2026-7-14 13:16 | 显示全部楼层
大批量信号处理项目可以参考,运算数组尽量放片内RAM,放外部SRAM会拖慢DSP运算速度,采样周期容易跟不上需求。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

242

主题

623

帖子

1

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