STM32F407 hal库FFT

简介:本文所用开发板为立创天空星,主控芯片为STM32F407VET6,F407系列应该都能使用本文的方法。也推荐大家可以买一块立创天空星玩玩,很好用。

1.设置调试模式为SWD调试

2.将低速和高速时钟设置为外部时钟源

3.时钟设置(按下图即可)

4.设置ADC,可以和中断部分一起看

注意DMA设定时要把Mode设成circular,这样才能循环采样。

5.中断设置

中断的采样频率为主频(即clock configuration里的设置)/(PSC* counter period)因为FFT采样点为1024个所以采样频率应为1024的整倍数。

6.串口设置

只需要将mode设置成全双工(就是第一个A开头的),并根据自己用的外设调整baud rate。

7.调用DSP库

点击上方的software packs 并选择select components

下载下图打开的DSP库

打开左侧最下方的middleware

点击下图蓝标的algobuild,并在弹出的页面中勾选DSP库,再回来重新点击就会出现如下的页面,勾选DSP库(一定要重新看看是否选择成功)

设定项目名并将IDE改为MDK V5

如下图勾选

最后一步,生成文件。

还要把这些加入c/c++的define

,ARM_MATH_CM4,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING

开始最重要的代码部分

第一步是printf的重定义

int fputc(int ch, FILE *f)

{

/* 发送一个字节数据到串口DEBUG_USART */

HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);

return (ch);

}

FFT的计算很简单

#include "stdio.h"
#include "arm_math.h"
#include "arm_const_structs.h"

#define FFT_LENGTH		1024
#define VREF 3.2941

//定义FFT采样数组
uint16_t adcBuff[FFT_LENGTH];
float fft_inputbuf[FFT_LENGTH * 2];  
float fft_outputbuf[FFT_LENGTH];
//标志位
__IO uint8_t AdcConvEnd1 = 0;

HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adcBuff, FFT_LENGTH);

for(int i=0; i < FFT_LENGTH; i++)
    {
        fft_inputbuf[2*i]=adcBuff[i] * VREF / 4096; //实部
        fft_inputbuf[2*i+1]=0;				  //虚部
    }
    arm_cfft_f32(&arm_cfft_sR_f32_len1024, fft_inputbuf, 0, 1);//FFT计算
    arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH);	//取模得幅值

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值