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

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扩展软件包
关注我们
st-img 微信公众号
st-img 手机版