本贴是本次评测各贴的综合:
DAC1以DMA方式产生1个正弦波信号做信号源之用。
ADC4转换DAC信号源的正弦波信号,以DMA方式传输到FFT缓冲区。
利用STM32U545RE强大的DSP功能,对正弦波信号做FFT处理,将结果以图形方式显示在OLED屏幕上。
运行FFT需要在CubeMX开发环境添加ST的DSP库。
点击Sofwware Packs->Seletc Compnoents
点击Packs
打勾DSP,点击OK
回到Pinout & Configuration,打勾DSP Library Library
这里选择Copy all libraries into the project folder
MDK里添加DSP库文件
编译:很遗憾CubeMX添加的DSP库是V1.5.3版本,它来不及更新到STM32U5系列,在编译到arm_math.h时出错,无法继续。
解决办法:
1、在main()函数里添加
#define ARM_MATH_CM7
2、拷贝ST官方STM32Cube_FW_U5_V1.3.0中的DSP库,它的版本是 V1.10.0。
重新编译、下载、运行:
演示代码选择从DAC分别自动输出1Khz、2Khz、4Khz、8Khz、10Khz的正弦波,在屏幕上显示各种频率的频谱图。
视频
<iframe height=498 width=510 src='https://player.youku.com/embed/XNjE2NjMwNTgyNA==' frameborder=0 'allowfullscreen'></iframe>
相关代码
ADC和DAC代码在前几贴,不再重复
static void FFT_read(void)
{uint16_t i;
arm_cfft_radix4_instance_f32 scfft;
arm_cfft_radix4_init_f32(&scfft,BUFFER_SIZE,0,1);
for(i=0;i<FFT_LENGTH;i++)
{ inputbuf[2*i]=(uint16_t)aADCxConvertedData[i];
inputbuf[2*i+1]=0;
}
arm_cfft_radix4_f32(&scfft,inputbuf);
arm_cmplx_mag_f32(inputbuf,outputbuf,BUFFER_SIZE);
int main(void)
{
uint16_t i=0;
HAL_Init();
SystemClock_Config();
SystemPower_Config();
MX_GPIO_Init();
MX_GPDMA1_Init();
MX_MEMORYMAP_Init();
MX_ADC4_Init();
MX_ICACHE_Init();
MX_DAC1_Init();
MX_TIM1_Init();
OLED_Init();
OLED_Clear();
LCD_Print(16, 0,"STM32U545RE ",TYPE16X16,TYPE8X16);
LCD_Print(32, 16, "NUCLEO",TYPE16X16,TYPE8X16);
LCD_Print(36, 32, "DEMO",TYPE16X16,TYPE8X16);
HAL_Delay(3000);
OLED_Clear();
LCD_Print(10, 0,"DAC(DMA)",TYPE16X16,TYPE8X16);
LCD_Print(10, 16,"Sine-wave ",TYPE16X16,TYPE8X16);
LCD_Print(10, 32,"generation",TYPE16X16,TYPE8X16);
HAL_Delay(3000);
OLED_Clear();
LCD_Print(10, 0,"ADC(DMA)& arm_",TYPE16X16,TYPE8X16);
LCD_Print(0, 16,"cff_radix4_f32",TYPE16X16,TYPE8X16);
LCD_Print(20, 32,"FFT",TYPE16X16,TYPE8X16);
HAL_Delay(3000);
MX_DACQueue_Config();
if( HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel10, &DACQueue)!= HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(&hdac1, DMA_Handle1, handle_GPDMA1_Channel10);
DAC_Ch1_SineConfig();
MX_ADCQueue_Config();
__HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel9);
if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel9, &ADCQueue) != HAL_OK)
{
Error_Handler();
}
if (HAL_ADC_Start_DMA(&hadc4,
(uint32_t *)aADCxConvertedData, (ADC_CONVERTED_DATA_BUFFER_SIZE)
) != HAL_OK)
{
Error_Handler();
}
OLED_Clear();
LCD_Print(90,8,"1KHz",2,3);
while (1)
{FFT_read();
i++;
if(i==100)
{
TIM1->ARR = 600;
LCD_Print(90,8,"2KHz",2,3);
}
else
if(i==200)
{
TIM1->ARR = 310;
LCD_Print(90,8,"4KHz",2,3);
}
else
if(i==300)
{
OLED_Clear();
TIM1->ARR = 155;
LCD_Print(90,8,"8kHz",2,3);
}
else
if(i==400)
{
OLED_Clear();
TIM1->ARR = 125;
LCD_Print(90,8,"10kHz",2,3);
}
if(i==500)
{
OLED_Clear();
TIM1->ARR = 1250;
LCD_Print(90,8,"1kHz",2,3);
i=0;
}
}
}
[/i]
学习一下,FFT有没详细移植的步骤啊。我想搞个音频FFT灯光
FFT是个好东西啊,学习一下如何移植FFT处理