一、开发环境
硬件:STM32F407 核心开发板
单片机:STM32F407ZGT6
Keil版本:5.24.2.0
STM32CubeMX版本:6.12.0
二、配置CubeMX
0. 添加dsp库:参考这位大佬STM32 DSP库的快速添加 基于cubemx 调用,使用DSP库_stm32 dsp库的快速添加 基于cubemx 调用,使用dsp库-优快云博客
1. 选择时钟源
2. 配置时钟
3. 使能Debug功能:Serial Wire
4. HAL库时基选择:SysTick
5. ADC配置:如图。
6. TIM配置:如图。
7. 配置工程参数:在Project标签页中,配置项目名称和位置,选择工具链MDK-ARM。
8. 生成代码:在Code Generator标签页中,配置工程外设文件与HAL库,勾选头文件.c和.h文件分开,然后点击Project > Generate Code生成代码。
三、代码实现与部署
1. 路径如图:删了一个,加了一个。
2. main.c增加代码:依次添加头文件、数组、相应的代码等。
#include "stdio.h"
#include "arm_math.h"
#include "arm_const_structs.h"
#define FFT_LENGTH 4096
uint16_t adc_buff[FFT_LENGTH];
float testInput[FFT_LENGTH*2] = {0};
float testOutput[FFT_LENGTH] = {0};
__IO uint8_t AdcConvEnd = 0;
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start(&htim3);
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_buff,4096);
/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while (!AdcConvEnd)
;
for (uint16_t i = 0; i < FFT_LENGTH; i++)
{
testInput[i * 2] = adc_buff[i];
testInput[i * 2 + 1] = 0;
}
arm_cfft_f32(&arm_cfft_sR_f32_len4096, testInput, 0, 1);
arm_cmplx_mag_f32(testInput, testOutput, FFT_LENGTH);
testOutput[0] /= FFT_LENGTH;
for (uint16_t i = 0; i < FFT_LENGTH; i++)
{
testOutput[i] /= FFT_LENGTH / 2;
}
for (uint16_t i = 1; i < FFT_LENGTH / 2; i++)
{
printf("%d:%f\r\n", (int)i, testOutput[i]);
}
/* USER CODE END WHILE */
(参考的挺杂的,这里就不列出来了,感恩大佬们