[STM32F7] STM32F767 NUCLEO-144评测(4)FFT

[复制链接]
5076|10
 楼主| sky.sun.zz 发表于 2016-7-29 16:21 | 显示全部楼层 |阅读模式
本帖最后由 sky.sun.zz 于 2016-7-31 17:44 编辑

评测1:STM32F767NUCLEO-144
评测2:虚拟串口(3楼)
评测3:DAC(4楼)
评测4:FFT(5楼)
收到STM32F767NUCLEO-144,感谢网站,感谢ST.

包装.JPG

           主要特性在包装印刷上

背面.JPG
                        PCB背面
赶紧去下载了Keil.STM32F7xxBFP.2.7.0.pack

MDK驱动.jpg
在MDK已经有767ZI的驱动了。

  紧接着下载了STM32Cuble_FW_F7_V1.40
器件.jpg

    已经找到767ZI的对应驱动了。

DEBUG.jpg
  DEBUG选项里选择STLNK-DEBUGGER,STLINKV2-1已经激活。

UITLITES.jpg

UTILITES选项

运行演示包中\STM32Cube_FW_F7_V1.4.0\Projects\STM32F767ZI-Nucleo\Examples\GPIO\GPIO_IOToggle

下载成功.JPG

STM32F767NUCLEO-144已经能够正常下载代码运行了。评测准备工作就绪。

strang 发表于 2016-7-29 17:08 | 显示全部楼层
恭喜楼主,
 楼主| sky.sun.zz 发表于 2016-7-29 21:12 | 显示全部楼层
本帖最后由 sky.sun.zz 于 2016-7-31 17:43 编辑

评测2:虚拟串口

    当将STM32F767ZI Nncleo-144的CN1的USB连接到PC机USB后,电脑系统自动识别一个新的端口设备,在我的PC上是:STMicorelectornics STLink Virtual COM Port(COM6).
这样,我们无需添加任何硬件设备,就能够利用这个虚拟串口来调试程序了。
COM_6.jpg
    打开STM32Cube_FW_F7_V1.4.0\Projects\STM32F767ZI-Nucleo\Examples\UART\UART_Printf\MDK-ARM工程,这是个串口通讯演示,使用USART3:
波特率:9600
数据位:7位
停止位:1位
校验位:ODD
流控制:无
      将串口助手的通信格式设定与STM32F767一致,在开发板上编译下载UART_Printf,运行结果:
9600.jpg
的确是个方便的调试助手!


 楼主| sky.sun.zz 发表于 2016-7-31 10:12 | 显示全部楼层
本帖最后由 sky.sun.zz 于 2016-7-31 10:26 编辑

评测3 DAC

    STM32Cube_FW_F7_V1.4.0没有提供DAC演示代码,参考STM32Cube_FW_F7_V1.1.0中STM32F746G的DAC代码对TEMPLATES.C修改,TIM6的TRGO触发更新DAC数据,通过板上的“USER”按键控制生成三角波或阶梯波从PA4输出。

IMG_1299.JPG
三角波


IMG_1300.JPG
                           阶梯波
  1. static void DAC_Ch1_EscalatorConfig(void)
  2. {   if (HAL_DAC_Init(&DacHandle) != HAL_OK)
  3.   {
  4.       Error_Handler();
  5.   }
  6.   sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;
  7.   sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
  8.   if (HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DACx_CHANNEL) != HAL_OK)
  9.   {
  10.     /* Channel configuration Error */
  11.     Error_Handler();
  12.   }
  13.   if (HAL_DAC_Start_DMA(&DacHandle, DACx_CHANNEL, (uint32_t *)aEscalator8bit, 6, DAC_ALIGN_8B_R) != HAL_OK)
  14.   {
  15.        Error_Handler();
  16.   }
  17. }

  18. static void DAC_Ch1_TriangleConfig(void)
  19. {
  20.    if (HAL_DAC_Init(&DacHandle) != HAL_OK)
  21.   {
  22.        Error_Handler();
  23.   }

  24.   sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;
  25.   sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;

  26.   if (HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DACx_CHANNEL) != HAL_OK)
  27.   {
  28.     /* Channel configuration Error */
  29.     Error_Handler();
  30.   }


  31.   if (HAL_DACEx_TriangleWaveGenerate(&DacHandle, DACx_CHANNEL, DAC_TRIANGLEAMPLITUDE_1023) != HAL_OK)
  32.   {
  33.      Error_Handler();
  34.   }
  35.   if (HAL_DAC_Start(&DacHandle, DACx_CHANNEL) != HAL_OK)
  36.   {
  37.       Error_Handler();
  38.   }

  39.   if (HAL_DAC_SetValue(&DacHandle, DACx_CHANNEL, DAC_ALIGN_12B_R, 0x100) != HAL_OK)
  40.   {
  41.     Error_Handler();
  42.   }
  43. }

  44. int main(void)
  45. {
  46.    MPU_Config();
  47.   CPU_CACHE_Enable();
  48.   HAL_Init();
  49.   SystemClock_Config();
  50.    BSP_LED_Init(LED1);
  51.   BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_EXTI);
  52.   DacHandle.Instance = DACx;
  53.   TIM6_Config();
  54.   while (1)
  55.   {
  56.       if (ubKeyPressed != RESET)
  57.     {
  58.       HAL_DAC_DeInit(&DacHandle);
  59.       if (ubSelectedWavesForm == 1)
  60.       {
  61.       DAC_Ch1_TriangleConfig();
  62.       }
  63.       else
  64.       {
  65.         DAC_Ch1_EscalatorConfig();
  66.       }
  67.       ubKeyPressed = RESET;
  68.     }
  69.   }
  70. }



DAC.rar

18.04 KB, 下载次数: 12

 楼主| sky.sun.zz 发表于 2016-7-31 17:38 | 显示全部楼层
本帖最后由 sky.sun.zz 于 2016-7-31 19:14 编辑

评测(4)FFT
这个FFT评测利用原来的UART.C修改而成。
1、打开工程,在manage_Run-Time Environment中添加DSP库:
manage_Run-Time Environment.jpg
2、在Options for Target “    STM32F767ZI-Nucleo”-C/C++Define添加:ARM_MATH_CM7 __FPU_PRESENT=1
无标题2.png
3、添加FFT_DATA.C文件
ManageProject items.jpg
     在程序上生成了一个输入信号序列用于测试,输入信号序列表达式:
for(i=0;i<FFT_LENGTH;i++)
       {
inputbuf[2*i]=100+10*arm_sin_f32(2*PI*i*50/FFT_LENGTH)+30*arm_sin_f32(2*PI*i*200/FFT_LENGTH)+10*arm_cos_f32(2*PI*i*400/FFT_LENGTH);  
inputbuf[2*i+1]=0;                                                            
  }
     通过该表达式我们可知,信号的直流分量为100,外加2个正弦信号和一个余弦信号,其幅值分别为103010
同时将取模后的模值大于1时通过串口打印出来。可以看出:624以后的数据是前面数据的镜像。
无标题.1png.png
  1. #define BUFFER_SIZE 1024
  2. #define FFT_LENGTH 1024

  3. float inputbuf[BUFFER_SIZE*2];           
  4. float outputbuf[BUFFER_SIZE];

  5. int main(void)
  6. {
  7.          MPU_Config();  
  8.   CPU_CACHE_Enable();

  9.   HAL_Init();
  10.   SystemClock_Config();
  11.   BSP_LED_Init(LED3);
  12.   UartHandle.Instance        = USARTx;
  13.   UartHandle.Init.BaudRate   = 9600;
  14.   UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
  15.   UartHandle.Init.StopBits   = UART_STOPBITS_1;
  16.   UartHandle.Init.Parity     = UART_PARITY_ODD;
  17.   UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
  18.   UartHandle.Init.Mode       = UART_MODE_TX_RX;
  19.   UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
  20.   if (HAL_UART_Init(&UartHandle) != HAL_OK)
  21.   {
  22.     Error_Handler();
  23.   }
  24.   printf("\n\r     STM32F767ZI-Nucleo-144 FFT demo\n\r");
  25.                         FFT_read();        
  26.   while (1)
  27.   {
  28.                
  29.   }
  30. }
  1. static void CPU_CACHE_Enable(void)
  2. {
  3.   /* Enable I-Cache */
  4.   SCB_EnableICache();

  5.   /* Enable D-Cache */
  6.   SCB_EnableDCache();
  7. }

  8. static void MPU_Config (void) {
  9.   MPU_Region_InitTypeDef MPU_InitStruct;
  10.   
  11.   /* Disable the MPU */
  12.   HAL_MPU_Disable();

  13.   /* Configure the MPU attributes as WT for SRAM */
  14.   MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  15.   MPU_InitStruct.BaseAddress = 0x20010000;
  16.   MPU_InitStruct.Size = MPU_REGION_SIZE_256KB;
  17.   MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  18.   MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  19.   MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  20.   MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  21.   MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  22.   MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  23.   MPU_InitStruct.SubRegionDisable = 0x00;
  24.   MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

  25.   HAL_MPU_ConfigRegion(&MPU_InitStruct);

  26.   /* Enable the MPU */
  27.   HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
  28. }


  29. static void FFT_read(void)
  30. {uint16_t i;
  31. arm_cfft_radix4_instance_f32 scfft;
  32. arm_cfft_radix4_init_f32(&scfft,BUFFER_SIZE,0,1);
  33. for(i=0;i<FFT_LENGTH;i++)
  34.         {
  35.         inputbuf[2*i]=100+10*arm_sin_f32(2*PI*i*50/FFT_LENGTH)+30*arm_sin_f32(2*PI*i*200/FFT_LENGTH)+10*arm_cos_f32(2*PI*i*400/FFT_LENGTH);  
  36.   inputbuf[2*i+1]=0;                                                                        
  37.   }
  38.    arm_cfft_radix4_f32(&scfft,inputbuf);                     
  39.    arm_cmplx_mag_f32(inputbuf,outputbuf,BUFFER_SIZE);
  40.         
  41.                         for(i=0;i<1024;i++)
  42.                         {                                                
  43.                         if((uint32_t)outputbuf[i]>1)
  44.                                 {
  45.                                 printf("\n\r%4d \n\r",i);
  46.                                 printf("\n\r%f  \n\r",outputbuf[i]);
  47.                                 }        
  48.                         }                                
  49. }
最后。测试一下STM32F767运行FFT的速度,去掉FFT_read()函数中的printf输出语句,在主循环中加入:

          for(i=0;i<100;i++)
                {
                  FFT_read();
                }
                GPIOB->ODR ^=0X4000;
实测PB14(LED3)上脉冲为150mS,可知:STM32F767做1次1024点的FFT大概需要1.5mS,相比之下STM32F446需要4mS。




Naga1991 发表于 2016-7-31 18:44 | 显示全部楼层
sky.sun.zz 发表于 2016-7-29 21:12
评测2:虚拟串口

    当将STM32F767ZI Nncleo-144的CN1的USB连接到PC机USB后,电脑系统自动识别一个新的端 ...

为什么我接上USB后 没有虚拟串口?
 楼主| sky.sun.zz 发表于 2016-7-31 19:07 | 显示全部楼层
Naga1991 发表于 2016-7-31 18:44
为什么我接上USB后 没有虚拟串口?

应该是你的ST-LINK驱动没有安装好或者是版本较低
荣丰宇 发表于 2016-8-24 23:25 | 显示全部楼层
Naga1991 发表于 2016-7-31 18:44
为什么我接上USB后 没有虚拟串口?

STSW-LINK004 - STMicroelectronics
http://www.st.com/content/st_com ... e/stsw-link004.html

huangcunxiake 发表于 2016-11-5 19:14 | 显示全部楼层
非常不错。虚拟串口要查看设备管理器里面看看,驱动搞定没,如果没有安装,如果用Keil,那Keil目录下就有驱动。
wahahaheihei 发表于 2016-11-5 19:26 | 显示全部楼层
没跑过这个FFT,学习下,我也找个板子试试怎么玩这个。
IanLei 发表于 2017-6-1 21:37 | 显示全部楼层
没跑过这个FFT,学习下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

732

帖子

13

粉丝
快速回复 在线客服 返回列表 返回顶部