赞
踩
简介:本文所用开发板为立创天空星,主控芯片为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); //取模得幅值
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。