简介:本文所用开发板为立创天空星,主控芯片为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); //取模得幅值
标签:inputbuf,FFT,hal,fft,LENGTH,设置,STM32F407,arm
From: https://blog.csdn.net/m0_74054307/article/details/139412328