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

体验NUCLEO-G474RE板卡试用

[复制链接]
gaosmile 发布时间:2020-3-4 16:31

: z" b. K6 g+ Y) C
资源篇

& p4 c5 W: M9 ]: L% \

5 v* G+ t8 f; \- ]
外观还是一如既往的靓,简洁美观。板子搭载的是M4内核,速度快,高达170M主频,和数学运算加速器CORDIC大大提高运算能力, 输入电压范围1.71~3.6V,512Flash,128的SRAM,1个用户LED,一个用户按键,32.768khz的外部低速晶振,外接24M的高速晶振,Micro-AB连接器,Arduino™ Uno V3连接器可扩与Arduino™ Uno V3连接,板载STLINK_V3仿真调试器,调试器的主控是STM32F723,下载速度得到的很大的提高。

0 m- K; }7 K" ?' K
STM32G474资源介绍:
$ i# l* x' \0 g2 g# y" |
微信图片_20200304161117.jpg
) ]4 y# a  t$ h) c, R+ j) J
STM32G474开发板实物图:
$ h/ m# n  Z: b7 I( |, h, B* c
微信图片_20200304161126.jpg
▲ 开发板实物图
开发板分为上下两部分,上半部分为ST-LINK-V3仿真器,可以给开发板进行调试和程序下载。下半部分是G474的最小系统板:全IO引出,兼容流行的Arduino扩展口如下图所示。值得一提的是:上半部分的ST-LINK是可以通过断开跳帽之后可以单独作为调试器使用。
微信图片_20200304161133.jpg

2 y; _+ |5 O: T, m) k9 \$ N4 r) T
% m2 m8 S' L/ _5 t
4 ~. i8 i' l* k; R% Z/ [
实战篇
$ c9 B( G5 \* g4 Q: C

& V6 L( s$ u/ v- d, o
测试内容:
  • IO测试
  • 虚拟串口VCP测试
  • FPU测试
  • DSP测试
    + q% y; s4 }8 B+ W
/ Z! F, T1 q' q! `, j
1. LED和GPIO测试1
2 Q( z3 a# B" S( M
(1) 原理:短按一下按键,LED点亮,再短按一下按键LED熄灭。(2) 步骤:使用CubeCubeMx生成工程。
微信图片_20200304161144.png
▲ 引脚配置
时钟配置:外接24M晶振,高达170M主频
微信图片_20200304161151.png

$ h2 U7 m; k* k9 Y
生成工程,固件包版本V1.1.0。
0 \4 f* ]$ ^/ ]
微信图片_20200304161159.png

5 H$ v. d7 N$ ~
代码:
微信图片_20200304161209.png

% i/ s) j. e9 @: k
结果:短按一下按键,LED点亮,再短按一下按键LED熄灭。
! h( ]- C1 v& L: Y1 E: B2 h
结论:使用MX配置简单快速。
' |$ |- Y- C/ u) O4 o5 H$ g0 }
2. VCP虚拟串口测试1
9 N  t) i. P$ i' ?" V
(1) 原理:
MCU与stlik连接
微信图片_20200304161216.png
: j: ]  l. z. `* T" {& ^
虚拟串口连接MCU的LPUART1
# T) i1 \5 [8 W9 A  A8 n
微信图片_20200304161224.png
(2) 配置工程:
微信图片_20200304161240.jpg
- v/ w9 N- c2 j. b8 ~
相关代码:
微信图片_20200304161249.png

; L5 {( F' t7 K8 X9 K
微信图片_20200304161258.png
; t; Z. K% D; W* i
(3)结果:如下所示,按一次按键就打印一个“OK”,LED一亮灭交替。
微信图片_20200304161307.png
  Z' u- k. Z/ v. n: v1 z
结论:这个功能在我们调试的时候十分方便,节省了很多的资源和时间。
" ?: |. y; ?* j* F
3.FPU性能测试1

  D: r, T+ p! p8 Y4 C+ G5 X
原理:
FPU浮点运算单元,如果CPU上没有FPU进行浮点运算的话必须按照IEEE标准进行运算十分的耗时,相较之下具有FPU的处理器在计算浮点运算是非常快的,G474Nucleo板载FPU运算加速器,运算性能非常出色,我们可以通过简单的测试来测一下板子的FPU的性能,可以通过计算使用FPU时单精度的乘除法使用的时间和没有使用FPU时消耗的时间进行比较来得出结论,其中时间的计数我们使用的是systick定时器。
! N1 y, E" G2 Z* z0 ?" ?
6 ~- p& P4 s0 O2 j# d) g9 R! \* y% m8 _
步骤:
首先我们要学会打开硬件FPU,我们要设置 CPACR寄存器,其中在SystemInit函数中已经写好怎么配置,如下图:
微信图片_20200304161315.png

% o/ I. q- h7 k/ w
我们只需要添加宏定义__FPU_PRESENT =1 ,_FPU_USED=1就可以了,而默认已经定义了__FPU_PRESENT =1,我们还需要添加_FPU_USED=1,在target 的Code Generation 选single Precision 就行了,如下图。

* w$ e* E7 f, u' D
微信图片_20200304161323.png

% B7 {- i. W% T3 k( v* N
相关代码如下:双精度和单精度计算函数4 q+ S9 j1 Z6 O
  1. 2 G) K" `) A* }( _7 u& ^) [
  2. /**
    * @. T6 O% J, l; @- F" q5 t
  3.   * @name  DoubleD
    + B* I+ L' J% D$ l: H% B$ Q
  4.   * @brief 双精度乘除法.; B4 |8 e! i& R4 U; @* b
  5.   * @param angle:起始值,times:计算次数,
    0 p. H3 W3 v/ e' y
  6. *mod:1除法0乘法' Q- X3 G- t: M3 Q4 O/ k' g3 I
  7.   */# |# l$ N: ]5 v7 H9 @& T
  8. void DoubleD(double angle,uint32_t times,uint8_t mode)
    - z& J! h) P' U6 C1 U
  9. {  u* ?( {7 o8 S6 D) b) Q
  10.     uint32_t i;
    0 Y1 N& E2 w8 X9 j# j' n5 \# \
  11.     double result;
    . b4 I; s8 M' Q0 L* N  A. o
  12.     if(mode)//除法9 e: J$ P# S  Y5 k
  13.     {  k" B% e  F3 o4 ?( C4 E- m
  14.         for(i=0;i<times;i++)
    8 r, @1 G/ h# ^: u& Q% F
  15.         {6 {4 L. f. p9 d& s
  16.             result = angle/PI;
    " M/ l. }7 }7 N0 L7 _
  17.             angle += 0.00001f;
    4 F- b3 M& [( R% z: F
  18.         }        
    " A" ]. \5 F7 i1 u( |
  19.     }) h6 v5 t" l# J( B
  20.     else//乘法
    0 q" }2 L. i2 Z. ~
  21.     {2 V* D" {) q8 |
  22.         for(i=0;i<times;i++)
    8 d0 s/ Z' c$ Q1 b9 I# R# v
  23.         {9 b/ d* }+ }4 L, h
  24.             result = angle*PI;5 m+ |( a1 w6 A# ^% |7 U
  25.             angle += 0.00001f;  f7 E+ [* O- o# z1 |* T
  26.         }
    7 u  F: P+ C9 m  I- W4 L% Y
  27.     }0 |; c( b7 P* N  ^
  28. }
复制代码

+ p" ^" p: K6 D* H+ ~; j/ g+ ?
3 j7 N. Z* G9 j8 u
6 |3 f/ m6 @' X5 N; ?8 C5 L: b

" b! b% Y7 t* j, y0 e/ H6 G
  1. , A( }8 Y0 n; Q; l5 Y* j, x. i
  2. /**  C1 G2 |* j! x3 u
  3.   * @name  FloatXFloat
    3 N" n8 C) d1 g; u' x2 t+ y
  4.   * @brief 单精度乘除法.
    + L3 c1 k; @5 D# q$ V! Q8 |
  5. * @param angle:起始值,times:计算次数,*mod:1除法0乘法
    $ }2 M  z5 O$ K$ H% {- \/ u) M
  6.   */0 N# d  }+ M. k# J* t6 q
  7. void FloatXFloat(float angle,uint32_t times,uint8_t mode)
    3 X7 M+ k& Q9 k2 p# A6 G* ?
  8. {
    ; N+ g/ X2 c7 J  d9 g$ q
  9.     uint32_t i;( w. p/ k8 c& b& u
  10.     float result;
    / N* x; r% w, ^: e3 k
  11.     if(mode)//除法8 _: i' I% f- i, g9 G
  12.     {
    1 Q7 H$ q. ~: F3 v9 x0 c
  13.         for(i=0;i<times;i++)
    3 L4 U+ h. v  r' k) n  \2 T+ N
  14.         {+ ~6 i7 d+ N, n
  15.             result = angle/PI;( j3 ^( x) w: w! a$ H
  16.             angle += 0.00001f;
    7 I, d: [5 ^% _2 q
  17.         }        
    * Q; d6 h( L, ]
  18.     }) a1 q. y$ a8 E/ k0 u
  19.     else//乘法) A" ~; P' Z# _
  20.     {$ m# ^8 c4 k& G+ d8 c' j% ?
  21.         for(i=0;i<times;i++); W+ b$ E- ^  \- R3 {; _5 W- m8 m
  22.         {& b# \" l) O5 y& s( H
  23.             result = angle*PI;/ @1 }. I4 _- ^9 p! |$ {
  24.             angle += 0.00001f;
    % ?& E8 x# i* J! w. h0 M5 B
  25.         }* @( }5 H+ q% I3 m: [
  26.     }. Y+ u0 s  F5 u' A. [7 H4 n
  27. }
    ; G' X& C0 K% y
复制代码

' J" T; o6 n2 E/ k
5 ?$ ]5 I8 x( _
主函数
/ b8 V: r3 c8 R; }; d8 Q. b" M
  1. 3 x1 Z1 ]4 q- L- c
  2. int main(void)( O; p5 Y# j( c; }  R
  3. {
    - r; y* f, k. V2 }1 u) @6 @7 n
  4.   /* USER CODE BEGIN 1 */- o) p4 z/ G1 D" ^9 E
  5.   /* USER CODE END 1 */. A/ x8 ?( e9 t
  6.   /* MCU Configuration--------------------------------------------------------*) n6 M  D. H* _& ?( T
  7.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */* d" K1 r& M5 f$ _
  8.   HAL_Init();
    6 ~4 Z# X. s  O. ?! c, @- Q& y+ m
  9.   /* USER CODE BEGIN Init */, n# A5 ~5 t( ]" G! h/ V
  10.   /* USER CODE END Init */# q; m5 k2 v! ~% o5 k" v) N$ a
  11.   /* Configure the system clock */! P8 q: R& @# A
  12.   SystemClock_Config();
    * E3 _& b" ]/ Y9 |+ d8 t; I
  13.   /* USER CODE BEGIN SysInit */
    / m$ R* k5 S% f% e) ^& s
  14.   /* USER CODE END SysInit */* w2 l" T, E6 M- K1 O$ a
  15.   /* Initialize all configured peripherals */4 k9 s6 U+ @4 K" \6 ^' M8 z
  16.   MX_GPIO_Init();( y7 I7 Z* _9 c0 z+ N! Q
  17.   MX_USART1_UART_Init();2 k+ a: _( J5 I& d/ y6 V
  18.   MX_LPUART1_UART_Init();  b" q# Y8 j( L& O; Q
  19.   /* USER CODE BEGIN 2 */
    9 n1 \) J; v3 `8 t
  20.   HAL_Init();
    . \; d8 N; d5 T7 ^: B  g" q. J
  21.   /* USER CODE END 2 */' L! ~! i' _1 s5 a  ^' T$ M
  22. /* Infinite loop */" S1 C: a5 {# i; a$ P5 _
  23.   /* USER CODE BEGIN WHILE */8 U3 {6 x/ \9 x- C# L
  24.   while (1)
    1 b% `, v. t* F2 G% J  }! `( k
  25.   {- F5 `' G: ^; b# a+ N
  26.     /* USER CODE END WHILE */  `; E+ Y; S( a: v: S" M4 z* N
  27.     /* USER CODE BEGIN 3 */
    3 t" E; ^2 N$ w7 M( E7 n& B
  28.     printf("---------------NOT USER FPU----------------------\n");
    7 \+ D& V0 L; T% a
  29.     //-------------------测试单精度乘法----------------------------------------8 v! r# A5 S$ @, n' ]- p
  30.     start_tim = HAL_GetTick();    $ K3 S& E5 u6 ]4 S
  31.     //乘法
    . B7 c/ Z( Y! `. I; \8 G- C
  32.     FloatXFloat(PI/6,TIMES,0);      
    8 X8 g/ `+ y5 `5 l
  33.     end_tim = HAL_GetTick();+ t9 b. B( f. ?1 c# _3 ~6 D  M
  34.     if(end_tim > start_tim)
    - i+ n  z3 g) K1 V
  35.     {1 [9 F$ j2 a$ A  u: u+ N( ?
  36.         tim_cnt = end_tim - start_tim;7 L/ i0 C0 X7 B8 V
  37.     }
    . t0 r# f4 H& \; P+ z
  38.     else
    ; z( R1 t+ c4 ~: S0 @& N' E8 E  i
  39.     {
    / P0 Q3 D2 U" O0 u
  40.         tim_cnt = 0xffffffff - start_tim + end_tim;
    $ X: }# u" k% u
  41.     }6 c5 R* z6 A0 P5 t* b
  42.     printf("单精度乘法-- %d ms\r\n",tim_cnt);    //显示运行时间  
    8 m. a3 p* T6 u) ^% ~9 N
  43.     //-----------------测试单精度除法-------------------------------------------0 B6 K' K$ u% y9 [& g
  44.     start_tim = HAL_GetTick();2 z2 O  Z1 @' l" ~- R
  45.     //除法3 u1 y7 L' t5 T9 v$ Y5 N
  46.     FloatXFloat(PI/6,TIMES,1);- `/ S+ U  K' g+ o  g' y% g
  47.     end_tim = HAL_GetTick();
    : f; {' Y$ H: `) W$ M# b. W) t; N
  48.     if(end_tim > start_tim)
    % v2 T' U5 F( T# p8 B  S5 [
  49.     {
    2 U; d2 T, t  d. U) L
  50.         tim_cnt = end_tim - start_tim;
    6 e9 V' K; N3 U* p- q
  51.     }
    - F9 V: S/ B' K) Y& ]" r
  52.     else
    3 a7 k5 B$ x1 _( o8 U% d
  53.     {( H3 V" v& U/ D$ k0 f5 x8 ]9 q
  54.         tim_cnt = 0xffffffff - start_tim + end_tim;
    4 a5 n$ Q+ @+ |+ ]' g* f9 Q# H
  55.     }2 t1 M3 U& h' H* z
  56.     printf("单精度除法-- %d ms\r\n",tim_cnt);    //显示运行时间 7 U+ i1 ~, r; ^3 i4 A+ l9 d
  57.     //-----------------测试双精度乘法-------------------------------------------
    % y6 F: |4 I+ ^/ V
  58.     start_tim = HAL_GetTick();
    ' d8 j% d' p! F9 [8 f
  59.     //乘法/ A9 E9 A1 ~8 v* h- ~" Y
  60.     DoubleD(PI/6,TIMES,1);
    2 G% q7 D% m3 o. |
  61.     end_tim = HAL_GetTick();
    % P6 ~' |4 M1 G2 C8 ]7 x6 l* n( a) J
  62.     if(end_tim > start_tim)2 X4 _5 `9 O( M6 L  }
  63.     {
    ( c( o( k  F1 u# Z+ K" T
  64.         tim_cnt = end_tim - start_tim;: F7 }) A) d- T0 L
  65.     }% k( a2 {3 L# P) A9 W  K
  66.     else
    0 |4 q+ T# ?& h  q' H, \. K
  67.     {8 v  F$ w/ R$ `
  68.         tim_cnt = 0xffffffff - start_tim + end_tim;
    8 G2 [, I- W  r1 f: w4 {
  69.     }
    6 P* G5 c% C& G% n
  70.     printf("双精度乘法-- %d ms\r\n",tim_cnt);    //显示运行时间     7 g9 U8 e9 J  h; L; s) O
  71.     //-----------------测试双精度除法-------------------------------------------+ q1 A; O1 N2 \8 A/ d
  72.     start_tim = HAL_GetTick();9 T7 [# A, `% N- o- g8 @
  73.     //除法
    6 ^3 k- O5 p+ O
  74.     DoubleD(PI/6,TIMES,1);" d0 j$ l7 C# @" O, ]4 Q; S) `
  75. 4 ]" @9 w+ }; Z4 n4 g" `! v! u
  76.     end_tim = HAL_GetTick();0 X. U7 B5 z* j0 O, t
  77.     if(end_tim > start_tim)  I6 ~4 R7 V3 U2 y; f! e: @
  78.     {
    4 R/ [5 M7 a5 P; e! G
  79.         tim_cnt = end_tim - start_tim;
    4 I/ j! h7 p7 H" s8 o
  80.     }
    ) |! r! d; k7 o+ D/ x7 {6 _
  81.     else$ Q7 R+ X% P3 ^' u6 ]) M
  82.     {& J* t2 Y6 n9 Q# e4 Y6 z
  83.         tim_cnt = 0xffffffff - start_tim + end_tim;
    - {5 U, O% P, R6 V. E* ]1 _
  84.     }& e5 \0 X9 K( L1 c, M8 H
  85.     printf("双精度除法-- %d ms\r\n",tim_cnt);    //显示运行时间 4 {/ Q% H: i! ^: h
  86. 6 G( O) d; n- c5 i4 G) Y
  87. ) Y- ?% w" j7 m2 k  x- ^
  88.     HAL_GPIO_TogglePin(USER_LED_GPIO_Port,USER_LED_Pin);       2 d7 v/ C0 T! O  Y  I3 M7 p
  89.     HAL_Delay(500);
    $ Y/ s. P5 x) }& @! J
  90.   }( z/ m+ z' I+ e
  91.   /* USER CODE END 3 */
    . Q: W, h7 ^: H0 A
  92. }
复制代码
$ e$ {4 H/ U3 v+ k
, K" F7 `% W& J3 T$ F

* F$ l) Q  G9 {5 Q8 s  E% X; @
测试结果:
! f9 D' l( G8 y) ^7 R0 w& \
条件:输入参数angle:起始值 = π/6,times:计算次数 = 20000(两万),mod:乘除法时。
5 I+ V+ i+ h6 u) W- ^1 {
(1)没有打开FPU
微信图片_20200304161329.png

3 a' Y2 j4 @# X+ {; W+ V
(2)打开FPU
微信图片_20200304161336.png
/ z+ j& I) J4 B. Y
数据比较
  a) ?! Q) o  ^
打开FPU(ms)
关闭FPU(ms)
比例
单精度乘法
1
9
9
单精度除法
3
13
4.3
双精度乘法
17
16
0.9
双精度乘法
21
21
1
微信图片_20200304161343.jpg

; A2 d$ ]* O& N$ v# |) s5 D8 z
得出结论
打开FPU和没有打开FPU在浮点计算性能上有明显的提高,测试中可以看出在单精度乘法上性能上比较明显,速度大概是没有打开FPU的9倍左右,单精度除法则提升没有那么高4.3倍左右,在双精度上的运算则没有起到作用,耗时基本相同,所以FPU在单精度上计算速度上比较快对于双精度计算则不起作用。

/ h: O( I# R7 l* |) o
4. DSP测试1
7 H$ P: V) V$ x8 P2 d3 i" j2 J
原理:
M4内核除了集成硬件FPU外,还带有DSP指令,还有相应的加速单元增加了数据的处理能力和运算速度,ST还提供了DSP算法相关的库 ,大大的提高了我们开发速度和效率 ,为了展示DSP的性能,我使用ST提供的标准库数学运算的运算速度和使用DSP库的提供的数学函数的运算速度比较,参考原子的比较方式,现在我们用过sin(x)² +cos(x)² = 1 这个运算,首先我们以x为变量,x从π/6开始,每次累加0.001,累加200000次,每次的结果的误差不能大于0.00005的运算时间进行比较,可以得到使用DSP和不使用DSP运算速度上的差别。
步骤:
在原来的工程上加入DSP库的头文件和源文件,并包含头文件路径,还要打开硬件FPU,添加宏定义,添加头文件和lib。
微信图片_20200304161357.png

4 _# Z" W4 t4 W
微信图片_20200304161404.png
/ j, W9 w! R3 U' U2 z
打开FPU,在target 的Code Generation 选singlePrecision。
微信图片_20200304161411.png
& `0 r( n( C" ?8 {
减价宏定义ARM_MATH_CM4。
微信图片_20200304161418.png

6 c" o  y- \3 _& ?2 {2 b9 T
测试主要代码:
运算函数:

  1. ' ~8 d9 |1 ?; x; `8 s2 f+ Y
  2. //sin cos测试1 }0 K$ `. ^0 a1 ~& r) w
  3. //angle:起始角度
    + P: Q8 x; I7 c: O4 o/ F3 n; c
  4. //times:运算次数* A) o$ `, A6 I
  5. //mode:0,不使用DSP库;1,使用DSP库
      x9 {' W: y3 y; w- D
  6. //返回值:0,成功;0XFF,出错2 D2 n, l- a0 D
  7. uint8_t sin_cos_test(float angle,uint32_t times,uint8_t mode)! f% T9 x  K. x
  8. {
    * v0 F1 d, M2 ^( _3 h% Q' n$ E
  9.     float sinx,cosx;
    - P6 b$ W1 I6 V7 s0 e$ _
  10.     float result;& e7 C, M3 B! M" v7 q& w
  11.     uint32_t i=0;5 @, k% [' \$ f6 y: }4 |
  12.     if(mode==0)
    1 `9 U, r/ x4 V2 s
  13.     {
    ' `4 i( r" Z+ K' I$ D& }
  14.         for(i=0;i<times;i++)
    + F7 R3 s7 S* ?
  15.         {
    ! T. [; t" h; o) ?
  16.             cosx=cosf(angle);  //不使用DSP优化的sin,cos函数6 V# j9 R6 s$ a7 G6 z
  17.             sinx=sinf(angle);
    , _/ K- u. \3 `# V9 h4 M* F
  18.             result=sinx*sinx+cosx*cosx;//计算结果应该等于1  
      [/ i; A$ ^+ t, Q, B8 c% |
  19.             result=fabsf(result-1.0f);//对比与1的差值
    : D+ n7 k, K7 |* E! y/ J- A0 ]# s
  20.             if(result>DELTA)* x- B3 n+ d( m1 y
  21.             {0 ?- m# K1 W* h9 [5 g5 ^4 O/ m
  22.                 return 0XFF;      //判断失败 ( `. O' W# I( A% A
  23.             }) e; K; l/ ?1 V, H# h2 I/ \
  24.             angle+=0.001f;         //角度自增
    % `1 J, z" U& [2 S& p6 T
  25.         }
    , k5 R* K/ ]& n, g
  26.     }
    1 Z( t+ `& C) d  ]
  27.     else" w8 j" D: W5 F5 |1 p/ j
  28.     {
    , `, D+ k8 h' Y8 J; g
  29.         for(i=0;i<times;i++)
    / Z: i8 g/ G, |% ?$ Q$ y+ a
  30.         {
    & [/ I. B8 \% ]- I" Q5 u8 Y; _$ J
  31.             cosx=arm_cos_f32(angle);//使用DSP优化的sin,cos函数
    0 }* f. W; |0 L0 f6 d# q: ^# _
  32.             sinx=arm_sin_f32(angle);: E7 W- P- ?/ ?* P8 q
  33.             result=sinx*sinx+cosx*cosx; //计算结果应该等于1  4 }; H( I0 _7 y+ D! C, ]  {2 r
  34.             result=fabsf(result-1.0f);    //对比与1的差值
    5 R1 q: L; o: k6 U+ ^! y
  35.             if(result>DELTA)9 }" z- Y( X' Q- U) b2 Z, s" m
  36.             {
    ) G# \0 N. z7 A& S2 i
  37.                 return 0XFF;//判断失败
    " g* V) d: @, M- b  c
  38.             }
    2 E0 T+ L1 H6 Q/ |4 |/ i; |
  39.             angle+=0.001f;                //角度自增
    4 p% x3 l' @5 J2 f* U8 ~: H
  40.         }
    ' `4 x8 p( }; E) ?9 y0 `. a+ x
  41.     }+ S- `3 J; c3 ~7 u- [
  42.     return 0;//任务完成/ M, ]/ \' Q8 Z  w: d, M
  43. }
复制代码

% y# O$ Q. k% M, R
: i, q: w3 M& l( X) N) D- Z7 v  z
函数中当输入参数mode为1时使用DSP库提供的arm_cos_f32和arm_sin_f32计算sin(x)² +cos(x)² = 1,输入参数angle为其实角度,计算一次增加0.001,输入的参数timers是要计算的次数,计算的次数越多越消耗时间,对硬件的资源要求就越高,mode为1时则使用st标准库提供的sin,cos函数,所以通过两者的比较得出那种方式比较节省时间。
4 i% @1 w1 r( l! \, D/ R
主函数

  1. * C8 u: T8 }* w
  2. /**
    8 O2 O$ i$ J: F8 n/ j
  3.   * @brief  The application entry point.
    + f) p9 [' ^4 R& W; y# d- E2 t
  4.   * @retval int( E+ ?: N0 G7 Q" o- N
  5.   */
    : V6 |3 h, h! {8 ]' A/ m3 Y( h
  6. int main(void)
    2 X& z9 z  s: J* U( K1 D, H
  7. {
    : w) ~/ k) d$ I) s0 ^
  8.   /* USER CODE BEGIN 1 */
    # ^/ j+ M# x5 e  w4 |# Q
  9.   /* USER CODE END 1 */
    6 |4 X9 Q4 ~# M8 l1 u8 D
  10.   /* MCU Configuration--------------------------------------------------------*/, F6 f4 e6 t4 }9 |7 |- O
  11.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */' t& t$ ~* `6 l; ]" |$ q5 b5 W2 |
  12.   HAL_Init();
    1 u/ R: ~) P. T; V( t: H
  13.   /* USER CODE BEGIN Init */& @* j4 J1 [7 D0 G. h# v! @
  14.   /* USER CODE END Init */" r: m/ Z2 a" {& ]" S4 J
  15.   /* Configure the system clock */& T5 X, Z( o& y) s+ N: `
  16.   SystemClock_Config();
    ' ?) ?, `! J( O/ K: a' _  e
  17.   /* USER CODE BEGIN SysInit */
    + x: f; ?% K# N4 f. p
  18.   /* USER CODE END SysInit */
    & m0 ~: Y, p; ]) }+ p  d* @
  19.   /* Initialize all configured peripherals */
    , U  d" M$ _7 W$ ^1 \
  20.   MX_GPIO_Init();2 H$ _. d  L: r4 R6 Z
  21.   MX_USART1_UART_Init();
    " R( P% Z, A" P. x9 A: M% d& {& W, T9 {
  22.   MX_LPUART1_UART_Init();1 e4 W! T' o5 O$ l/ u, X0 j
  23.   /* USER CODE BEGIN 2 */
    ! z. k- c" L7 c3 ^9 {
  24.   HAL_Init();& A$ o/ n$ P1 J- F4 [0 L/ O
  25.   /* USER CODE END 2 */
    0 @3 T" {0 f7 `6 a
  26.   /* Infinite loop */
    ; L9 o% {) o( J5 s! r* B1 o. }
  27.   /* USER CODE BEGIN WHILE */
    * L; ]4 p8 c4 h9 |7 M; J
  28.   while (1)1 T' u: _# |- h6 C/ w
  29.   {4 h9 L4 [! _% I% N  i) \/ A
  30.     /* USER CODE END WHILE */
    0 V4 a# k- Y! [) ]0 I( h
  31.     /* USER CODE BEGIN 3 */9 @( j9 k7 B5 o1 m; b
  32.      //使用DSP优化8 D( N1 M6 I+ d& w
  33.     start_tim = HAL_GetTick();7 ~% z' f' K6 E! |! k9 @# v8 Q
  34.     status = sin_cos_test(PI/6,200000,1);
      @% P/ Q0 A; l" ]8 a
  35.     end_tim = HAL_GetTick();
    9 F# Q" K! Y+ t+ k; a+ c) s4 `
  36.     if(end_tim > start_tim), j) l+ o( p8 u/ a: Z
  37.     {3 K( _, d& O8 C
  38.         tim_cnt = end_tim - start_tim;1 K9 k: e4 u, Z* @0 |, e
  39.     }# A' `" t- \' T" i9 \! q" }
  40.     else: ^6 Y* ^2 \) e0 K; y1 h
  41.     {
    8 ?8 d1 A( [1 ]% D0 S. O0 v- u% _
  42.         tim_cnt = 0xffffffff - start_tim + end_tim;
    + F& o* b. [4 l' c+ ~
  43.     }2 l9 F+ t) n4 q  I; U5 `
  44.     if(status==0)
    9 A0 \  \  P2 t' M- G0 u
  45.     {
    ; n0 y$ Z. Y# z! T" i, M
  46.         printf("USER DSP-- %d ms\r\n",tim_cnt);    //显示运行时间  , Q# @5 ^: E0 o
  47.     }      
    ! r( }. N" X0 O* j( _
  48.     else
    & |; S: E: }" Z. y# j
  49.     {
    " u1 b2 Y! B0 x* k6 E) j* D* P  I9 @
  50.         printf("USER DSP ERROR\n");    //显示当前运行情况   
    8 q& z: L" X# E8 ]* C" f
  51.     }       " r8 T1 g1 k5 z
  52.     //不使用DSP优化        $ i( l( Y6 S0 o: v9 x+ u# M7 \6 ^2 k$ i
  53.     start_tim = HAL_GetTick();. S! _! B4 |$ i/ U+ [2 X" |) f
  54.     status = sin_cos_test(PI/6,200000,0);! r5 F7 m3 X' V
  55.     end_tim = HAL_GetTick();
    9 `3 z- o' I' @5 L8 k  K; P
  56.     if(end_tim > start_tim)$ m: J7 g0 O# P! d* i6 f1 I
  57.     {" o2 c/ w6 x2 K; d6 ?
  58.         tim_cnt = end_tim - start_tim;
    , [. F/ ^5 a* b5 D
  59.     }% q0 W) }- v" O8 F  L
  60.     else
    ; |1 J+ X8 }) Q1 L7 n$ W8 @1 a# D
  61.     {
    # r+ a3 n  i$ c/ r$ |
  62.         tim_cnt = 0xffffffff - start_tim + end_tim;, \+ E* O/ s  w" P
  63.     }   
    7 Z$ {" e+ Z& B$ x6 u# q

  64. 0 ~8 D* A( c; n" p* u% g$ n* \/ k
  65.     if(status==0)
    ; V# p  `! H* _5 x7 C" B1 s- K9 h4 l7 t
  66.     {5 @! p6 b/ @6 j& \: [4 n
  67.         printf("NOT USER DSP-- %d-ms\r\n",tim_cnt);    //显示运行时间  & b6 [" B: n* `
  68.     }      " f4 Z- I  {" o& h& I" A- @
  69.     else( n8 }% Z1 y" T) i
  70.     {: P6 x3 ^; ~6 {0 u. i; x6 k7 L' |) ^
  71.         printf("NOT USER DSP ERROR\n");    //显示当前运行情况   
    : O8 C) t4 ]! [/ J* M/ F0 T; y, ~' Y
  72.     }   
    $ @1 a7 T7 n/ p0 h! g/ c" r
  73.     HAL_GPIO_TogglePin(USER_LED_GPIO_Port,USER_LED_Pin);       " z" d3 {& [- r
  74.     HAL_Delay(500);
复制代码
4 o& Z& l* W% Z% R, N

! l4 Q9 J) M' I! P% W- Q0 c7 A6 m2 r
参数:angle : 起始角度 = π/6 ; times : 运算次数 = 10 000(1万);" x. L4 H$ x4 i, F
: a+ {" ]4 X( W) f/ ]1 X/ |# v" C
结果如下图:使用DSP是8ms,没有使用DSP是12ms;12/8= 1.5倍。
微信图片_20200304161428.png
参数:angle : 起始角度 = π/6 ; times : 运算次数 = 100 000(10万);

1 C5 w, {2 z5 _2 m3 S
结果如下图:使用DSP是86ms,没有使用DSP是129ms;129/86= 1.5倍。
微信图片_20200304161435.png

7 O' m) d$ F# Z4 Z5 r- W) E! g
参数:angle : 起始角度 = π/6 ; times : 运算次数 = 200000(20万);
- {0 J" Y' s0 {' N; T' r- e; ?
结果如下图:使用DSP是172ms,没有使用DSP是258ms;258/172= 1.5倍。
微信图片_20200304161441.png

# q5 \3 Y6 V4 M* Z6 g# n
总结:在单精度数学运算方面使用DSP加数的效果还是比较明显的,平均来说是没有说使用DSP的15倍。
1 A! H/ `$ m5 B& e' g0 f, g- Z8 ^
收藏 评论1 发布时间:2020-3-4 16:31

举报

1个回答
goodgft 回答时间:2021-8-20 09:07:31
板子的原理图在哪里找的啊?

所属标签

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