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

NUCLEO-F412ZG评测(3):浮点运算能力

[复制链接]
wenyangzeng 发布时间:2016-10-5 10:09
阅读主题, 点击返回1楼
收藏 4 评论20 发布时间:2016-10-5 10:09
20个回答
wenyangzeng 回答时间:2016-10-7 14:57:06
本帖最后由 wenyangzeng 于 2016-10-7 15:17 编辑

评测3:浮点运算能力
   
    本次通过运行一个1024点的傅里叶函数运算来测试STM32F412的浮点运算能力,这需要添加STM32 DSP库,在STM32CubeMx生成的STM32F412工程添加DSP库比F1系列要简单许多。点击MDK的“Manage Run-Time Environment->CMSIS,”DSP”打勾。在“Options for Target “XXX””的“Preprocessor Symbols”栏添加“,ARM_MATH_CM4”即可。
DSP.jpg
t3.jpg
    我们为函数设定FFT参数:
1个值为100的直流信号;
2个正弦和一个余弦信号,幅值分别为103050。时间点在14080.
Outputbuf[]数组保留了运算结果,我们其中把大于1的值通过串口送到PC机在串口小助手上显示。

FFT.jpg

    在主循环中不断运行FFT函数,每运行100次改变LED3状态,通过示波器测试其状态,可得时间周期为1.8秒,由此可知:
STM32F412每作一次1024点的傅里叶运算大概需要18mS
而相对比STM32F7671.5mSSTM32F446需要4mS。可见STM32F412的强项应该是低功耗,更何况其主频只有100Mhz。

  1. #include "stm32f4xx_hal.h"
  2. #include <stdio.h>
  3. #include "arm_math.h"
  4. __io_putchar(int ch)
  5. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  6. UART_HandleTypeDef huart3;
  7. #define BUFFER_SIZE 1024
  8. #define FFT_LENGTH 1024
  9. float inputbuf[BUFFER_SIZE*2];           
  10. float outputbuf[BUFFER_SIZE];
  11. uint32_t uhADC3ConvertedValue[BUFFER_SIZE];
  12. void SystemClock_Config(void);
  13. void Error_Handler(void);
  14. static void MX_GPIO_Init(void);
  15. static void MX_USART3_UART_Init(void);
  16. PUTCHAR_PROTOTYPE
  17. {
  18. HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xFFFF);
  19. return ch;
  20. }
  21. static void FFT_read(void)
  22. {uint16_t i;
  23. arm_cfft_radix4_instance_f32 scfft;
  24. arm_cfft_radix4_init_f32(&scfft,BUFFER_SIZE,0,1);        
  25.      for(i=0;i<BUFFER_SIZE;i++)                                                        
  26.      {  
  27.      inputbuf[2*i]=100+10*arm_sin_f32(2*PI*i/BUFFER_SIZE)+30*arm_sin_f32(2*PI*i*40/BUFFER_SIZE)+50*arm_cos_f32(2*PI*i*80/BUFFER_SIZE);
  28.           inputbuf[2*i+1]=0;                                                                        
  29.              }
  30.    arm_cfft_radix4_f32(&scfft,inputbuf);                     
  31.    arm_cmplx_mag_f32(inputbuf,outputbuf,BUFFER_SIZE);
  32. }
  33. int main(void)
  34. {
  35. uint16_t i;
  36.   HAL_Init();
  37.   SystemClock_Config();
  38.   MX_GPIO_Init();
  39.   MX_USART3_UART_Init();
  40.   printf("STM32F412GZ Nucleo FFT演示:直流分量100,外加2正弦和1个余弦信号,幅值分别为10,30,50\n\r");
  41. FFT_read();
  42.         for(i=0;i<1024;i++)
  43.       {                                                
  44.        if((uint32_t)outputbuf[i]>1)
  45.         {
  46.                                         if(i<100)
  47.           printf("\n\r原始点d:\n\r",i);
  48.                                         else
  49.                                         printf("\n\r镜像点%d:\n\r",i);
  50.            printf("\n\r%f\n\r",outputbuf[i]);
  51.         }        
  52.        }  
  53. while (1)
  54.   {
  55.                 for(i=0;i<100;i++)
  56.                 {
  57.                   FFT_read();
  58.                 }
  59.                 GPIOB->ODR ^=0X0080;
  60.   }
  61. }
  62. void SystemClock_Config(void)
  63. {
  64. RCC_OscInitTypeDef RCC_OscInitStruct;
  65. __HAL_RCC_PWR_CLK_ENABLE();
  66. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  67. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  68.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  69.   RCC_OscInitStruct.HSICalibrationValue = 16;
  70.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  71.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  72.   {
  73.     Error_Handler();
  74.   }
  75. HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  76. HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  77. HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  78. }
  79. static void MX_USART3_UART_Init(void)
  80. {
  81. huart3.Instance = USART3;
  82.   huart3.Init.BaudRate = 9600;
  83.   huart3.Init.WordLength = UART_WORDLENGTH_8B;
  84.   huart3.Init.StopBits = UART_STOPBITS_1;
  85.   huart3.Init.Parity = UART_PARITY_NONE;
  86.   huart3.Init.Mode = UART_MODE_TX_RX;
  87.   huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  88.   huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  89.   if (HAL_UART_Init(&huart3) != HAL_OK)
  90.   {
  91.     Error_Handler();
  92.   }
  93. }

  94. static void MX_GPIO_Init(void)
  95. {
  96. GPIO_InitTypeDef GPIO_InitStruct;
  97. __HAL_RCC_GPIOE_CLK_ENABLE();
  98.   __HAL_RCC_GPIOD_CLK_ENABLE();
  99.   __HAL_RCC_GPIOA_CLK_ENABLE();
  100.   __HAL_RCC_GPIOB_CLK_ENABLE();
  101. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
  102. GPIO_InitStruct.Pin = GPIO_PIN_7;
  103.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  104.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  105.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  106.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  107. }
复制代码

FFT.rar

下载

39.43 KB, 下载次数: 2

zbber 回答时间:2016-10-7 16:05:01
学习了,我只是路过打酱油的
Xinfeng 回答时间:2016-10-7 22:11:55
支持楼主,学习了
jcx0324 回答时间:2016-10-8 09:01:19
wenyangzeng 发表于 2016-10-7 14:57
评测3:浮点运算能力        本次通过运行一个1024点的傅里叶函数运算来测试STM32F412的浮点运算能力,这需 ...

这个数据很有参考价值,赞
zero99 回答时间:2016-10-8 10:26:26
支持一下
eefishing 回答时间:2016-10-10 09:40:59
学习一下新的开发板
王浩然 回答时间:2016-10-21 09:55:46
看看
myfocus-2048857 回答时间:2016-11-6 01:18:07
好,借鉴下     
xnmc2013 回答时间:2016-11-6 16:45:56
看起来挺好~~~~~~~
ST.JPG 与非.JPG
zengyi703-16313 回答时间:2016-11-7 08:17:38
感谢分享

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版