打印
[STM32F7]

STM32F767 NUCLEO-144评测(4)FFT

[复制链接]
4216|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 sky.sun.zz 于 2016-7-31 17:44 编辑

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


           主要特性在包装印刷上

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

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

  紧接着下载了STM32Cuble_FW_F7_V1.40

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

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


UTILITES选项

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


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).
这样,我们无需添加任何硬件设备,就能够利用这个虚拟串口来调试程序了。

    打开STM32Cube_FW_F7_V1.4.0\Projects\STM32F767ZI-Nucleo\Examples\UART\UART_Printf\MDK-ARM工程,这是个串口通讯演示,使用USART3:
波特率:9600
数据位:7位
停止位:1位
校验位:ODD
流控制:无
      将串口助手的通信格式设定与STM32F767一致,在开发板上编译下载UART_Printf,运行结果:

的确是个方便的调试助手!


使用特权

评论回复
地板
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输出。


三角波



                           阶梯波
static void DAC_Ch1_EscalatorConfig(void)
{   if (HAL_DAC_Init(&DacHandle) != HAL_OK)
  {
      Error_Handler();
  }
  sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;
  sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
  if (HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DACx_CHANNEL) != HAL_OK)
  {
    /* Channel configuration Error */
    Error_Handler();
  }
  if (HAL_DAC_Start_DMA(&DacHandle, DACx_CHANNEL, (uint32_t *)aEscalator8bit, 6, DAC_ALIGN_8B_R) != HAL_OK)
  {
       Error_Handler();
  }
}

static void DAC_Ch1_TriangleConfig(void)
{
   if (HAL_DAC_Init(&DacHandle) != HAL_OK)
  {
       Error_Handler();
  }

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

  if (HAL_DAC_ConfigChannel(&DacHandle, &sConfig, DACx_CHANNEL) != HAL_OK)
  {
    /* Channel configuration Error */
    Error_Handler();
  }


  if (HAL_DACEx_TriangleWaveGenerate(&DacHandle, DACx_CHANNEL, DAC_TRIANGLEAMPLITUDE_1023) != HAL_OK)
  {
     Error_Handler();
  }
  if (HAL_DAC_Start(&DacHandle, DACx_CHANNEL) != HAL_OK)
  {
      Error_Handler();
  }

  if (HAL_DAC_SetValue(&DacHandle, DACx_CHANNEL, DAC_ALIGN_12B_R, 0x100) != HAL_OK)
  {
    Error_Handler();
  }
}

int main(void)
{
   MPU_Config();
  CPU_CACHE_Enable();
  HAL_Init();
  SystemClock_Config();
   BSP_LED_Init(LED1);
  BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_EXTI);
  DacHandle.Instance = DACx;
  TIM6_Config();
  while (1)
  {
      if (ubKeyPressed != RESET)
    {
      HAL_DAC_DeInit(&DacHandle);
      if (ubSelectedWavesForm == 1)
      {
      DAC_Ch1_TriangleConfig();
      }
      else
      {
        DAC_Ch1_EscalatorConfig();
      }
      ubKeyPressed = RESET;
    }
  }
}



DAC.rar

18.04 KB

使用特权

评论回复
5
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库:
2、在Options for Target “    STM32F767ZI-Nucleo”-C/C++Define添加:ARM_MATH_CM7 __FPU_PRESENT=1
3、添加FFT_DATA.C文件
     在程序上生成了一个输入信号序列用于测试,输入信号序列表达式:
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以后的数据是前面数据的镜像。
#define BUFFER_SIZE 1024
#define FFT_LENGTH 1024

float inputbuf[BUFFER_SIZE*2];           
float outputbuf[BUFFER_SIZE];

int main(void)
{
         MPU_Config();  
  CPU_CACHE_Enable();

  HAL_Init();
  SystemClock_Config();
  BSP_LED_Init(LED3);
  UartHandle.Instance        = USARTx;
  UartHandle.Init.BaudRate   = 9600;
  UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
  UartHandle.Init.StopBits   = UART_STOPBITS_1;
  UartHandle.Init.Parity     = UART_PARITY_ODD;
  UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
  UartHandle.Init.Mode       = UART_MODE_TX_RX;
  UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&UartHandle) != HAL_OK)
  {
    Error_Handler();
  }
  printf("\n\r     STM32F767ZI-Nucleo-144 FFT demo\n\r");
                        FFT_read();        
  while (1)
  {
               
  }
}
static void CPU_CACHE_Enable(void)
{
  /* Enable I-Cache */
  SCB_EnableICache();

  /* Enable D-Cache */
  SCB_EnableDCache();
}

static void MPU_Config (void) {
  MPU_Region_InitTypeDef MPU_InitStruct;
  
  /* Disable the MPU */
  HAL_MPU_Disable();

  /* Configure the MPU attributes as WT for SRAM */
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.BaseAddress = 0x20010000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_256KB;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.SubRegionDisable = 0x00;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);

  /* Enable the MPU */
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}


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]=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;                                                                        
  }
   arm_cfft_radix4_f32(&scfft,inputbuf);                     
   arm_cmplx_mag_f32(inputbuf,outputbuf,BUFFER_SIZE);
        
                        for(i=0;i<1024;i++)
                        {                                                
                        if((uint32_t)outputbuf[i]>1)
                                {
                                printf("\n\r%4d \n\r",i);
                                printf("\n\r%f  \n\r",outputbuf[i]);
                                }        
                        }                                
}
最后。测试一下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。




使用特权

评论回复
6
Naga1991| | 2016-7-31 18:44 | 只看该作者
sky.sun.zz 发表于 2016-7-29 21:12
评测2:虚拟串口

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

为什么我接上USB后 没有虚拟串口?

使用特权

评论回复
7
sky.sun.zz|  楼主 | 2016-7-31 19:07 | 只看该作者
Naga1991 发表于 2016-7-31 18:44
为什么我接上USB后 没有虚拟串口?

应该是你的ST-LINK驱动没有安装好或者是版本较低

使用特权

评论回复
8
荣丰宇| | 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

使用特权

评论回复
9
huangcunxiake| | 2016-11-5 19:14 | 只看该作者
非常不错。虚拟串口要查看设备管理器里面看看,驱动搞定没,如果没有安装,如果用Keil,那Keil目录下就有驱动。

使用特权

评论回复
10
wahahaheihei| | 2016-11-5 19:26 | 只看该作者
没跑过这个FFT,学习下,我也找个板子试试怎么玩这个。

使用特权

评论回复
11
IanLei| | 2017-6-1 21:37 | 只看该作者
没跑过这个FFT,学习下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

728

帖子

13

粉丝