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

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

[复制链接]
wenyangzeng 发布时间:2016-10-5 10:09
本帖最后由 wenyangzeng 于 2017-1-3 13:43 编辑

评测1:初试NUCLEO-F412ZG(在1楼)

评测2:USART3串口通信(在5楼)

评测3:浮点运算能力(在11楼)
   有幸收到ST社区送来的NUCLEO-F412ZG进行性能评测。


t1.JPG
   相比STM32F767 Nucleo,预留的以太网接口未焊接零件。


t2.JPG


       正面


t3.JPG
             背面

t4.jpg
                 IO接线


      这款STM32F412ZG是最新推出的基于 ARM Cortex-M4 32 位 RISC 内核,具有浮点单元 (FPU)。 以高达 100 MHz 运行,且同时在运行和停止模式下具有出色的低功耗性能。
      自适应实时 (ART) 加速器可允许通过嵌入式闪存进行零等待操作。 批量采集模式 (BAM) 可在批量处理数据过程中提高电源效率。
      STM32F412xE/G 包含高速嵌入式存储器(高达 1 MB 闪存,256 K SRAM)。 可将广泛的增强型输入/输出和外围设备连接至两根 APB 总线、三根 AHB 总线和 32 位多 AHB 总线矩阵。
      所有设备均提供一个 12 位模拟到数字转换器 (ADC)、一个低功率实时时钟 (RTC) 和十二个 16 位计时器。 两个脉冲宽度调制 (PWM) 计时器,用于电动机控制,还提供两个通用 32 位计时器。
      它们还具有标准和高级通信接口。
      STM32F412利用大量数据获取模式(BAM)将批量数据处理进行功耗优化,将动态功耗效率提升到了一个新的水平。 BAM允许通信外设实现批量数据交换,同时器件的其它部分(包括CPU)可保持在省电模式。
•        性能: 在100 MHz频率下,借助意法半导体的ART加速器,STM32F412能够实现125 DMIPS/339 CoreMark性能,并实现了从Flash存储器零等待执行。 DSP指令和浮点运算单元扩大了产品的应用范围。
•        功效: ST该系列产品采用意法半导体90 nm工艺,使用ART加速器和动态功耗调整功能,从Flash存储器执行指令,运行模式下可实现低至112 µA/MHz的电流消耗。 停机模式下,功耗低至18 µA。
•        集成度:STM32F412器件内置高达512至1024 KB的Flash存储器和高达256 KB的SRAM。
具备从48到144引脚各类封装。
o        4路USART,速率可高达12.5 Mbit/s
o        5路SPI(与I²S复用 ),速度高达50 Mbit/s
o        4个I²C,高达1Mbps
o        2x CAN(2.0B有效)
o        所有封装都带1个SDIO,时钟高达48MHz
o        1个全速USB 2.0 OTG
o        2个全双工I²S,最高32-bit/192 kHz
o        3个单工I²S,最高32-bit/192 kHz
o        2个数字滤波器,用于∑Δ调制器
o        4个PDM接口,支持立体声麦克风
o        速度高达2.4 MSPS的12位ADC,
o        14个定时器,频率高达100 MHz的16和32位定时器
o        硬件随机数发生器


t0.jpg
要让STM32F412动起来,首先要从http://www.keil.com/dd2/stmicroe ... tx/#/eula-container下载Keil.STM32F4xx_DFP.2.10.0.pack驱动。
T5.jpg
              添加的驱动


T6.jpg
           KEIL已经找到芯片的驱动了
  对NUCLEO-F412ZG的评测过程,将不断与各位分享。










评分

参与人数 1 ST金币 +20 收起 理由
zero99 + 20

查看全部评分

收藏 4 评论20 发布时间:2016-10-5 10:09

举报

20个回答
wenyangzeng 回答时间:2016-10-5 14:12:30
本帖最后由 wenyangzeng 于 2016-10-5 14:28 编辑

评测2:USART3串口通信
        当我们用USB连接线连接PC机到Nucleo-F412ZG后,在PC机的“设备管理器”的端口栏将会出现一个虚拟的串口设备,在我的机器上显示是COM6,根据用户机器配置的不同可能会有所不同。
COM_6.jpg
       现在,我们可以在不增加硬件资源的情况下利用这个虚拟串口来调试软件了。


      打开STM32Cube MX,选择STM32F412ZG Tx,将PD8,PD9配置成USART3模式。生成代码。
CUBE_MX.jpg
    修改main.C,填加部分代码:
  1. #include "stm32f4xx_hal.h"
  2. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  3. UART_HandleTypeDef huart3;
  4. void SystemClock_Config(void);
  5. void Error_Handler(void);
  6. static void MX_GPIO_Init(void);
  7. static void MX_USART3_UART_Init(void);
  8. PUTCHAR_PROTOTYPE
  9. {
  10.   HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xFFFF);
  11.   return ch;
  12. }
  13. int main(void)
  14. {
  15.   HAL_Init();
  16.   SystemClock_Config();
  17.   MX_GPIO_Init();
  18.   MX_USART3_UART_Init();
  19.   printf("\n\r UART Printf Example: retarget the C library printf function to the UART\n\r\n\r");
  20.   printf("** STM32F412GZ Nucleo Test finished successfully. ** \n\r");
  21. while (1)
  22.   {
  23.   }
  24. }
  25. void SystemClock_Config(void)
  26. {
  27.   RCC_OscInitTypeDef RCC_OscInitStruct;
  28.   __HAL_RCC_PWR_CLK_ENABLE();
  29.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  30.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  31.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  32.   RCC_OscInitStruct.HSICalibrationValue = 16;
  33.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  34.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  35.   {
  36.     Error_Handler();
  37.   }
  38.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  39.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  40.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  41. }
  42. static void MX_USART3_UART_Init(void)
  43. {
  44.   huart3.Instance = USART3;
  45.   huart3.Init.BaudRate = 9600;
  46.   huart3.Init.WordLength = UART_WORDLENGTH_8B;
  47.   huart3.Init.StopBits = UART_STOPBITS_1;
  48.   huart3.Init.Parity = UART_PARITY_NONE;
  49.   huart3.Init.Mode = UART_MODE_TX_RX;
  50.   huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  51.   huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  52.   if (HAL_UART_Init(&huart3) != HAL_OK)
  53.   {
  54.     Error_Handler();
  55.   }

  56. }
  57. static void MX_GPIO_Init(void)
  58. {
  59.   __HAL_RCC_GPIOE_CLK_ENABLE();
  60.   __HAL_RCC_GPIOD_CLK_ENABLE();
  61.   __HAL_RCC_GPIOA_CLK_ENABLE();
  62.   __HAL_RCC_GPIOB_CLK_ENABLE();
  63. }
复制代码


   打开串口通讯小助手,配置好端口和通讯参数,现在,Nucleo-F412ZG已经能够发送信息在PC机上显示了。
USART.jpg



main.rar

下载

4.13 KB, 下载次数: 3

usart3

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

stary666 回答时间:2016-10-5 10:37:00
顶一下,,,,,,,,,,
190637r537m8rmdq8wakwd.jpg
st.png
ChunMan 回答时间:2016-10-5 10:40:49
后排支持观望下!
lisingch 回答时间:2016-10-5 11:46:45
支持支持!
原田夜舞love 回答时间:2016-10-5 20:46:41
学习了!
assssdz 回答时间:2016-10-5 21:33:04
:):)
zhangdaijin 回答时间:2016-10-6 07:36:48
   谢谢LZ
zcl201207 回答时间:2016-10-6 23:27:36
zhangdaijin 回答时间:2016-10-7 09:10:31
持续关注
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
支持一下
12下一页

所属标签

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