手把手STM32G431CubeMx+keil添加DSP库并实现FFT简单实验
创始人
2025-01-07 18:34:42
0

1.前言

三天前的积分赛需要用到FFT来测量信号的频谱,于是乎在网上找找教程。发现之前已经有学长分享过经验,但是自己跟着添加的过程中还是遇到了一些keil里面的报错,在网上又找了找相关文章,最后终于是解决了问题,并且在校初选中运用FFT测量了信号的频谱,于是想写下这篇文章当作备忘。贴下学长的帖子的链接:https://blog.csdn.net/qq_34022877/article/details/123190943

2.CubeMx配置

在softwarePacks里面选择第一个
在这里插入图片描述
在cubemxpack里面选择DSP库,若没有下载还需要先下载,然后打对勾
在这里插入图片描述
CubeMX左侧拉到最下面点开Middware 选择x-CUBE-ALGOBUILD,勾选DSP
接下来按照正常配置就行

3.keil配置

在这里插入图片描述
点开环境管理

在CMSIS里选中DSP
点击魔术棒,在c/c++里添加宏定义
在这里插入图片描述
这里需要添加的内容是:ARM_MATH_CM4,这里的CM4是因为G431是M4的,如果是其他需要更该相应的数字

这里添加忽略警告

--diag_suppress=2803,1,1035 

在这里插入图片描述

在这里插入图片描述
将CubeMx生成的这个路径删除,不然编译的时候会重复引用报错,这里需要注意每次CubeMX生成的时候都会自动添加到这个路径,在使用CubeMx生成后这里记得要删除
在这里插入图片描述
接着引用头文件并定义FPU
#define __FPU_PRESENT 1U #include "arm_math.h" #include "arm_const_structs.h"
如果使用了printf等函数需要包含头文件stdio 并且需要勾选Use MicroLIB(这个界面在魔术棒 Target栏里)
在这里插入图片描述
最后点击编译,发现零错误零警告,大功告成
在这里插入图片描述

4.部分代码

内容部分基本和前面贴的学长的帖子里基本一致,这里写一下我的数据处理部分,作抛砖引玉,希望能和大家交流,互相学习。

int j; 		int frequence[3]={0};//定义存储频率的数组 		float amplitude[3]={0};//定义存储幅值的数组float类型 		printf("%.2f\n",fft_outputbuf[0]);//串口调试用 		frequence[0]=0;//直流频率 		amplitude[0]=fft_outputbuf[0];//直流分量			 		for(j=0;j<512;j++)//之前存储了1024个点,但只有512有效 		{ 			if(fft_outputbuf[j]>1)//这里fft_outputbuff里面存放的是峰峰值,这里是为了找到基波,由于输入信号的峰峰值是1V到2V	的方波,傅里叶变化后得到的基波是方波峰峰值乘4/pi,也就是说基波的峰峰值一定大于1V,只要找到第一个大于1V就是基波 			{	 				printf("%d:\t%.2f\r\n", j, fft_outputbuf[j]);		//串口调试		 				frequence[1]=j*5;//基波频率 (这里配置的CubeMX时钟频率170MHz 定时器设置的ARR是33203 采样率 = 170000000/33203 = 5120,fft计算点数为1024 这里配置采样率5120是为了让频率最小变化5Hz  频率等于数组下标*采样率/fft计算点数) 				for(c=0;c<10;c++) 				{ 					fft_tem += fft_outputbuf[j+c-10]*fft_outputbuf[j+c-10];//由于栅格效应,将周围50Hz频率的点都平方相加 				}	 				amplitude[1]=sqrt(fft_tem);//这里开根号 				fft_tem =0; 				frequence[2]=j*5*3;//3次谐波直接基波频率*3 				for(c=0;c<10;c++) 				{ 					fft_tem += fft_outputbuf[j*3+c-10]*fft_outputbuf[j*3+c-10];//3次谐波周围的数据处理 				}	 				amplitude[2]=sqrt(fft_tem); 				fft_tem =0; 			} 		} 		sprintf(str_buff[0],"fou_vpp=%.2fV",amplitude[1]-0.1); 		sprintf(str_buff[1],"fou_fre=%dHz",frequence[1]); 		sprintf(str_buff[2],"thr_vpp=%.2fV",amplitude[2]-0.1); 		sprintf(str_buff[3],"thr_fre=%dHz",frequence[2]);	 		OLED_Clear(); 		OLED_ShowString(0,0,str_buff[0],16, 0); 		OLED_ShowString(0,2,str_buff[1],16, 0); 		OLED_ShowString(0,4,str_buff[2],16, 0); 		OLED_ShowString(0,6,str_buff[3],16, 0);//OLED显示信息 

在这里插入图片描述
最后FFT部分误差处于误差范围内。

4.18号更新,最近再用的时候发现如果两次编译器版本不一样就会出现__FPU_PRESENT unknown的错误,目前还没有找到问题的原因和解决问题的方法,建议最好从头开始都不要更换编译器版本

相关内容

热门资讯

第四分钟了解!吉祥填大坑技巧(... 第四分钟了解!吉祥填大坑技巧(辅助)天涯麻将开挂辅助辅助器-总是是有辅助1、每一步都需要思考,不同水...
第5分钟了解!雀友会广东潮汕苹... 第5分钟了解!雀友会广东潮汕苹果(辅助)永和备厅开挂辅助修改器-真是存在有脚本1、雀友会广东潮汕苹果...
两分钟了解!新广西老友辅助(辅... 两分钟了解!新广西老友辅助(辅助)永乐跑胡子开挂辅助安装-总是是真的安装1、新广西老友辅助辅助软件下...
第九分钟了解!逍遥辅助软件(辅... 第九分钟了解!逍遥辅助软件(辅助)老腌菜开挂辅助下载-总是有挂平台1、金币登录送、破产送、升级送、活...
第七分钟了解!随意玩辅助器视频... 第七分钟了解!随意玩辅助器视频有挂(辅助)荷花开挂辅助脚本-果然真的是有插件1.随意玩辅助器视频有挂...
三分钟了解!微乐小程序多乐辅助... 三分钟了解!微乐小程序多乐辅助器(辅助)起来麻将开挂辅助app-总是有挂脚本微乐小程序多乐辅助器透视...
8分钟了解!新星游辅助软件(辅... 8分钟了解!新星游辅助软件(辅助)方片比鸡开挂辅助修改器-确实有挂辅助1、让任何用户在无需新星游辅助...
3分钟了解!如何下载科乐填大坑... 3分钟了解!如何下载科乐填大坑辅助器(辅助)2278游戏开挂辅助app-总是真的是有软件1)如何下载...
1分钟了解!瓜瓜丰城手机辅助(... 1分钟了解!瓜瓜丰城手机辅助(辅助)川麻换三张开挂辅助app-果然是真的平台1、该软件可以轻松地帮助...
2分钟了解!泉州相约十三水辅助... 2分钟了解!泉州相约十三水辅助(辅助)新道游开挂辅助辅助器-确实是真的修改器1、进入到泉州相约十三水...