本帖最后由 正点原子运营 于 2024-5-23 18:02 编辑  
 
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板 
 
2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版 
 
3)购买链接:https://detail.tmall.com/item.htm?&id=609293737870 
 
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar ... _mini_sysboard.html 
 
5)正点原子官方B站:https://space.bilibili.com/394620890 
 
6)正点原子STM32技术交流QQ群:725095144 
 
 
 
 
 
 
 
 
本章将使用DSP进行快速傅里叶变换(FFT)的运算测试。通过本章的学习,读者将学习到DSP库中FFT运算的简单应用。 本章分为如下几个章节: 51.1 硬件设计 51.2 程序设计 51.3 下载验证  
51.1 硬件设计 51.1.1 例程功能 1. 按下WKUP按键可进行FFT计算,并在LCD上显示计算耗时,同时通过串口输出计算结果 2. LED0闪烁,提示程序正在运行  
 51.1.2 硬件资源 1. LED        LED0 - PB5 2. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块 3. 按键        WKUP - PA0 4. USART1        USART1_TX - PA9        USART1_RX - PA10  
 51.1.3原理图 本章使用的DSP库为软件库,因此没有对应的连接原理图。  
 51.2 程序设计 51.2.1 实验应用代码 本章实验的应用代码,如下所示: - int main(void)
 
 - {
 
 -     uint8_t t = 0;
 
 -     uint8_t key;
 
 -     float time;
 
 -     char buf[50];
 
 -    arm_cfft_radix4_instance_f32 s;
 
 -     uint16_t i;
 
 -    
 
 -    HAL_Init();                             /* 初始化HAL库 */
 
 -    sys_stm32_clock_init(RCC_PLL_MUL9);     /* 配置时钟,72MHz */
 
 -    delay_init(72);                         /* 初始化延时 */
 
 -    usart_init(115200);                     /* 初始化串口 */
 
 -    led_init();                             /* 初始化LED */
 
 -    key_init();                             /* 初始化按键 */
 
 -    lcd_init();                             /* 初始化LCD */
 
 -    btim_timx_int_init(0xFFFF, 7200 - 1);   /* 初始化基本定时器 */
 
 -    
 
 -    lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
 
 -    lcd_show_string(30, 70, 200, 16, 16, "DSP FFTTEST", RED);
 
 -    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
 
 -    
 
 -    lcd_show_string(30, 110, 200, 16, 16, "WKUP:RunFFT", RED);
 
 -    lcd_show_string(30, 130, 200, 16, 16, "FFTruntime:", RED);
 
 -    
 
 -     /* FFT计算初始化 */
 
 -    arm_cfft_radix4_init_f32(&s, FFT_LENGTH, 0, 1);
 
 -    
 
 -     while (1)
 
 -     {
 
 -          key = key_scan(0);
 
 -          if (key == WKUP_PRES)
 
 -          {
 
 -              /* 生成输入数据 */
 
 -              for (i=0; i<FFT_LENGTH; i++)
 
 -              {
 
 -                  fft_inputbuf[2 * i] = 100 +
 
 -                                  10 * arm_sin_f32(2 * PI * i / FFT_LENGTH) +
 
 -                                  30 * arm_sin_f32(2 * PI * i * 4 / FFT_LENGTH) +
 
 -                                  50 * arm_cos_f32(2 * PI * i * 8 / FFT_LENGTH);
 
 -                                  fft_inputbuf[2 * i + 1] = 0;
 
 -              }
 
 -             
 
 -              /* FFT计算并计算耗时 */
 
 -              __HAL_TIM_SET_COUNTER(&g_timx_handle, 0);
 
 -              g_timeout = 0;
 
 -              arm_cfft_radix4_f32(&s, fft_inputbuf);
 
 -              time = __HAL_TIM_GET_COUNTER(&g_timx_handle) +
 
 -                      (uint32_t)g_timeout * 0x10000;
 
 -              sprintf(buf, "%0.1fms\r\n", time / 10);
 
 -              lcd_show_string(126, 130, 200, 16, 16, buf, BLUE);
 
 -             
 
 -              /* 对FFT计算结果取模并通过串口输出 */
 
 -              arm_cmplx_mag_f32(fft_inputbuf, fft_outputbuf, FFT_LENGTH);
 
 -              printf("\r\n%d point FFT runtime:%0.1fms\r\n",
 
 -                      FFT_LENGTH, time / 10);
 
 -              printf("FFT Result:\r\n");
 
 -              for (i=0; i<FFT_LENGTH; i++)
 
 -              {
 
 -                  printf("fft_outputbuf[%d]:%f\r\n", i, fft_outputbuf);
 
 -              }
 
 -          }
 
 -          
 
 -          if (++t == 20)
 
 -          {
 
 -              t = 0;
 
 -              LED0_TOGGLE();
 
 -          }
 
 -          
 
 -          delay_ms(10);
 
 -     }
 
 - }
 
  复制代码从上面的代码中可以看出,在检测到WKUP按键被按下后,便会调用DSP库中的函数arm_cfft_radix4_f32()进行FFT运算测试,同时使用定时器统计运算耗时,最后调用函数arm_cmplx_mag_f32()对FFT的运算结果取模,然后在串口调试助手上显示最终的结果。在使用了DSP库后,进行FFT运算变得十分简便,这非常有利于缩短应用开发周期。  
 51.3 下载验证 在完成编译和烧录操作后,可以看到LCD上显示了本实验的相关信息,此时若按下WKUP按键进行FFT运算测试,测可以看到,在FFT运算结束后,LCD上显示了本次FFT运算的耗时时长,同时串口调试助手上也显示了本次FFT运算结果取模后的结果值。  |