你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

NUCLEO-U545RE-Q评测 (6)FFT

[复制链接]
wenyangzeng 发布时间:2023-11-17 20:49

本贴是本次评测各贴的综合:

DAC1以DMA方式产生1个正弦波信号做信号源之用。 ADC4转换DAC信号源的正弦波信号,以DMA方式传输到FFT缓冲区。 利用STM32U545RE强大的DSP功能,对正弦波信号做FFT处理,将结果以图形方式显示在OLED屏幕上。

运行FFT需要在CubeMX开发环境添加ST的DSP库。

D1.png

点击Sofwware Packs->Seletc Compnoents

D2.png

点击Packs

D3.png

打勾DSP,点击OK

d4.png

回到Pinout & Configuration,打勾DSP Library Library

D5.png

这里选择Copy all libraries into the project folder

D6.png

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]

收藏 评论2 发布时间:2023-11-17 20:49

举报

2个回答
落花又见流水 回答时间:2023-12-12 09:33:29

学习一下,FFT有没详细移植的步骤啊。我想搞个音频FFT灯光

STMWoodData 回答时间:2023-12-12 10:58:47

FFT是个好东西啊,学习一下如何移植FFT处理

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版