当前位置:   article > 正文

STM32F407 hal库FFT_stm32 hal fft

stm32 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的重定义

  1. int fputc(int ch, FILE *f)
  2. {
  3. /* 发送一个字节数据到串口DEBUG_USART */
  4. HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
  5. return (ch);
  6. }

FFT的计算很简单

  1. #include "stdio.h"
  2. #include "arm_math.h"
  3. #include "arm_const_structs.h"
  4. #define FFT_LENGTH 1024
  5. #define VREF 3.2941
  6. //定义FFT采样数组
  7. uint16_t adcBuff[FFT_LENGTH];
  8. float fft_inputbuf[FFT_LENGTH * 2];
  9. float fft_outputbuf[FFT_LENGTH];
  10. //标志位
  11. __IO uint8_t AdcConvEnd1 = 0;
  12. HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adcBuff, FFT_LENGTH);
  13. for(int i=0; i < FFT_LENGTH; i++)
  14. {
  15. fft_inputbuf[2*i]=adcBuff[i] * VREF / 4096; //实部
  16. fft_inputbuf[2*i+1]=0; //虚部
  17. }
  18. arm_cfft_f32(&arm_cfft_sR_f32_len1024, fft_inputbuf, 0, 1);//FFT计算
  19. arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH); //取模得幅值

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/914316
推荐阅读
相关标签
  

闽ICP备14008679号