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

体验NUCLEO-G474RE板卡试用

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

  B* A& m% ?' i( y
资源篇

' Q' {1 A% _  ]; T: t' q6 i
8 u6 Q. j9 S( A( ^- D& m
外观还是一如既往的靓,简洁美观。板子搭载的是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,下载速度得到的很大的提高。

( L2 I' L& l. z" K# G
STM32G474资源介绍:

9 {# t& D8 G: e; ~; z
微信图片_20200304161117.jpg

+ b; J! X) g2 P
STM32G474开发板实物图:

4 v1 ?  K* E% f3 c' j" D2 x( n
微信图片_20200304161126.jpg
▲ 开发板实物图
开发板分为上下两部分,上半部分为ST-LINK-V3仿真器,可以给开发板进行调试和程序下载。下半部分是G474的最小系统板:全IO引出,兼容流行的Arduino扩展口如下图所示。值得一提的是:上半部分的ST-LINK是可以通过断开跳帽之后可以单独作为调试器使用。
微信图片_20200304161133.jpg
- A; h, h+ u) t9 [1 \

0 b/ k- o, [" N* U& ?
* e" Z& A; K0 H
实战篇

" i1 f' t! x, ]3 N9 G+ |) ^

! x. A4 I  |. {3 r
测试内容:
  • IO测试
  • 虚拟串口VCP测试
  • FPU测试
  • DSP测试0 d" q. I. W& a1 f  m
4 R6 k8 `! {# K8 S2 d, w/ _: O4 p
1. LED和GPIO测试1
' |7 W9 D: W! `0 m! J
(1) 原理:短按一下按键,LED点亮,再短按一下按键LED熄灭。(2) 步骤:使用CubeCubeMx生成工程。
微信图片_20200304161144.png
▲ 引脚配置
时钟配置:外接24M晶振,高达170M主频
微信图片_20200304161151.png

7 C! R* f7 K# {
生成工程,固件包版本V1.1.0。

- h; |( r. Y+ N4 T( S- @! w
微信图片_20200304161159.png
7 y3 U: L3 S9 C' m" m
代码:
微信图片_20200304161209.png

2 T: h# u% \* P# e" `
结果:短按一下按键,LED点亮,再短按一下按键LED熄灭。
1 o; ^, v3 }" I& ^: P
结论:使用MX配置简单快速。
' G- h# ?, P: {: q, E, w
2. VCP虚拟串口测试1

( i9 H" D. Y- k! |: M% z* `& S
(1) 原理:
MCU与stlik连接
微信图片_20200304161216.png

6 E4 g9 Q% r6 {! S$ U; l
虚拟串口连接MCU的LPUART1
. X1 n; I/ F3 k& H8 w  J' J0 ?
微信图片_20200304161224.png
(2) 配置工程:
微信图片_20200304161240.jpg
0 ?  s7 M7 ^" Q& }1 H
相关代码:
微信图片_20200304161249.png

  y3 T( L3 T6 [2 I5 T  j4 ~
微信图片_20200304161258.png

9 s" L7 V$ H7 Z# H' s; Y6 e/ o
(3)结果:如下所示,按一次按键就打印一个“OK”,LED一亮灭交替。
微信图片_20200304161307.png

; j% v! N& B  j# B! ^( L0 K
结论:这个功能在我们调试的时候十分方便,节省了很多的资源和时间。

& o5 P% v5 X3 P; }8 R
3.FPU性能测试1
) P! ~) K  i. |, C
原理:
FPU浮点运算单元,如果CPU上没有FPU进行浮点运算的话必须按照IEEE标准进行运算十分的耗时,相较之下具有FPU的处理器在计算浮点运算是非常快的,G474Nucleo板载FPU运算加速器,运算性能非常出色,我们可以通过简单的测试来测一下板子的FPU的性能,可以通过计算使用FPU时单精度的乘除法使用的时间和没有使用FPU时消耗的时间进行比较来得出结论,其中时间的计数我们使用的是systick定时器。1 C9 z2 O/ O5 z# G9 u/ @6 P4 f
( ^; b, h! i. H# l2 f; ~- X4 B
步骤:
首先我们要学会打开硬件FPU,我们要设置 CPACR寄存器,其中在SystemInit函数中已经写好怎么配置,如下图:
微信图片_20200304161315.png
6 e  w9 M/ g& A. ?! M' K' j) z5 p2 C
我们只需要添加宏定义__FPU_PRESENT =1 ,_FPU_USED=1就可以了,而默认已经定义了__FPU_PRESENT =1,我们还需要添加_FPU_USED=1,在target 的Code Generation 选single Precision 就行了,如下图。

+ _. h, @+ `" p1 O( Q
微信图片_20200304161323.png
. `- \2 V9 o) t1 M$ T3 k1 p" J
相关代码如下:双精度和单精度计算函数0 _+ I! b5 [2 y2 C

  1. + @( e( l6 a2 j+ F
  2. /**
    ' n( O" f1 q$ g1 ~
  3.   * @name  DoubleD
    ) a7 c7 F9 V9 L- l0 e" C
  4.   * @brief 双精度乘除法.
    & M$ c3 b6 b. ?7 g" k  q8 v  M
  5.   * @param angle:起始值,times:计算次数,8 i6 L; y6 \& `  f% q& K7 `
  6. *mod:1除法0乘法
    + W# t' T, @6 Y7 @7 ?1 q# a. J& ^- W
  7.   */
    ( `' i2 z0 K+ R
  8. void DoubleD(double angle,uint32_t times,uint8_t mode)
    % n/ z" l" S7 D: R- Z7 \2 j8 }& F
  9. {& v! w3 V; E/ H5 F, ^! L/ w0 s
  10.     uint32_t i;! T/ \) {; Z8 E7 v1 g/ E/ t3 x
  11.     double result;
    2 V" k, i& Y; S2 G
  12.     if(mode)//除法; U, K& |/ A+ ?9 L; \: u9 Q
  13.     {
    , ]; v8 ^, k- s7 g, O
  14.         for(i=0;i<times;i++)
    - J; x# }9 P$ ~3 j0 S+ U: ^
  15.         {
    4 c5 I$ k$ k! `+ l7 L/ \8 l# |
  16.             result = angle/PI;; F6 @/ {5 t) j. ?7 E$ P
  17.             angle += 0.00001f;
    $ N3 ~4 T0 c* w$ H
  18.         }        
    4 W$ p) K9 u) F  ^% V* y
  19.     }0 n3 t4 U: N8 p* V0 L% q
  20.     else//乘法9 |+ N& G( H# G" u- n4 Y
  21.     {' s! K& C* y6 K9 [
  22.         for(i=0;i<times;i++)3 x! j  N) H$ s4 o1 g7 m
  23.         {
    : W( w; i0 D% L. m+ C# g2 N
  24.             result = angle*PI;9 D# Y* k, C6 Q# L$ J  j# p* ~' g
  25.             angle += 0.00001f;
    5 N+ g! ?( y/ e& z! y) n9 K, Z
  26.         }1 U- i: \$ w" s7 R2 ^. k
  27.     }+ k6 f& w% h$ v6 j% @8 _+ {* B/ L
  28. }
复制代码

( I4 o6 K- }% w1 a4 r% m, I
# }/ t2 H+ `. t- Q
3 E, O& e8 r- O: h- f+ K1 N

# {, {2 I' v" C& {

  1. . x  _' ^' p. {% t& z  m* L
  2. /**# ]! x- L5 G5 M6 K
  3.   * @name  FloatXFloat4 ?7 q- j7 R8 f9 }+ l. k1 c+ [
  4.   * @brief 单精度乘除法.
    4 G! t2 f2 M/ e! E# f, H5 b2 ]
  5. * @param angle:起始值,times:计算次数,*mod:1除法0乘法) v, N9 A* P/ g5 ?" `1 C5 W  J: v
  6.   */, d# T* i4 Z5 r. R+ _# z, a& F& t
  7. void FloatXFloat(float angle,uint32_t times,uint8_t mode)
    . D: K+ ?! D' ?) ^- w
  8. {
    , U2 w  }8 _3 z. M- D/ W9 f- t
  9.     uint32_t i;
    5 ^" _4 O4 O8 S, D
  10.     float result;
    $ W* ~% N1 {. q9 K
  11.     if(mode)//除法
    2 z2 @7 j( m1 y0 C4 W/ o& a
  12.     {
    ) Q2 q# _7 G+ F" U% k% d) t
  13.         for(i=0;i<times;i++)
    " h* [. b  Y; I( J
  14.         {
    , G: j' ~0 f8 k6 \  ]
  15.             result = angle/PI;7 G% p' M$ _) x) t/ N$ L
  16.             angle += 0.00001f;3 T6 a$ N* q; S0 t( \
  17.         }        
    $ G4 u# F3 W+ G/ C' b9 B* a
  18.     }3 b5 n% R: C! B- ~' _3 x
  19.     else//乘法
      W1 d# Y4 @" N3 L
  20.     {, e6 K, l! k7 C& J* g
  21.         for(i=0;i<times;i++)
    7 V6 E, H5 H' v- Z. v3 u! o3 c6 S
  22.         {
    & D* n7 G) X' V/ {
  23.             result = angle*PI;
    ' _6 j: ]) D) {( ^
  24.             angle += 0.00001f;. U9 ?$ J& N4 {$ V
  25.         }2 Z0 J* r7 p2 i: ^/ Z% L
  26.     }
    # m4 v9 Y/ a# X, L% s% Z8 h9 ~
  27. }+ F' ^+ R0 M+ M: m' u: R4 A. P# ]; h
复制代码
/ g' d6 r6 a+ V9 C- X$ |

& G* S. V7 _+ t* l$ w" _/ v$ `
主函数
1 N9 y& M7 y5 A0 R/ J

  1. 0 q  u! R2 h2 k! n6 D) p) I
  2. int main(void). t/ e6 Z" ^$ X; W# n+ o( ^: `' |, G
  3. {: [; j$ m2 {/ V$ X
  4.   /* USER CODE BEGIN 1 */, \( A  a* F$ i: E8 `. e  j% ?5 R
  5.   /* USER CODE END 1 */1 d9 @( ~, p6 Y
  6.   /* MCU Configuration--------------------------------------------------------*
    + U0 {7 o6 \( S! g3 l
  7.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    + i% {& H2 e3 Q5 W7 b! S
  8.   HAL_Init();: S6 n* F) ]) W! C
  9.   /* USER CODE BEGIN Init */
    5 P5 q; D7 @0 V- D3 R' w0 N0 Q& @
  10.   /* USER CODE END Init */0 \1 b  |+ ]/ @* i' \% b' T
  11.   /* Configure the system clock */6 r: [3 w: T) E3 K
  12.   SystemClock_Config();
    : e) i4 U0 [/ {9 D
  13.   /* USER CODE BEGIN SysInit */4 Q' N& r1 k- A# z& A) J. c& T- W8 M
  14.   /* USER CODE END SysInit */: T' O: q+ Q6 N( X% w( \
  15.   /* Initialize all configured peripherals */1 X. M  w+ J) a% v8 v
  16.   MX_GPIO_Init();) @9 N, G; b+ J( N
  17.   MX_USART1_UART_Init();
    - `2 U2 x& J5 x4 {; m
  18.   MX_LPUART1_UART_Init();# s* p' a* ~; f5 R8 v
  19.   /* USER CODE BEGIN 2 */" l7 Q3 J6 d# M3 i/ G& |
  20.   HAL_Init();6 j8 S  u' _4 a: x. X6 g
  21.   /* USER CODE END 2 */
    * m' O# {* L. k, u. `( J
  22. /* Infinite loop */- l3 c4 ?/ H+ D) m
  23.   /* USER CODE BEGIN WHILE */8 o" J* k) X; g( S7 d) K
  24.   while (1)- E$ m' W- Y. g0 u9 Q
  25.   {1 o& O9 _6 O4 t/ P- A. H, c
  26.     /* USER CODE END WHILE */
    , `% T. F1 z; ?8 p+ r: f
  27.     /* USER CODE BEGIN 3 */
    - g& T7 v/ S9 [. j1 `
  28.     printf("---------------NOT USER FPU----------------------\n");7 S9 ?: q) `% s( \9 N
  29.     //-------------------测试单精度乘法----------------------------------------
    2 A# |6 Q0 F4 `& t- \
  30.     start_tim = HAL_GetTick();    / i! i1 v$ Z$ H+ X5 J! X/ f
  31.     //乘法
    / Z1 b! u* ]. K8 B( R* c, Y/ q. J+ l
  32.     FloatXFloat(PI/6,TIMES,0);      
    0 v  ]9 G* U2 `4 Y& ?
  33.     end_tim = HAL_GetTick();" q( f3 O$ A, @/ C0 N
  34.     if(end_tim > start_tim)
    + P  f8 O- c8 ?" i5 Z7 k
  35.     {
    5 [+ L) W5 W( \& p* }. K6 x
  36.         tim_cnt = end_tim - start_tim;
      w7 d0 W% w( v9 N7 f* L
  37.     }
    & q  Q* j6 z6 K8 e- Q+ ^/ ^
  38.     else2 ]% p- p9 t- H% Q" U! c/ v
  39.     {
    $ T: N& d! o4 o  h% G% y- p! |
  40.         tim_cnt = 0xffffffff - start_tim + end_tim;! S; X6 }; k7 Y  i
  41.     }
    / a( l5 x$ o. ]" v7 o, n7 N
  42.     printf("单精度乘法-- %d ms\r\n",tim_cnt);    //显示运行时间  2 l( j* c" g. W5 K0 v
  43.     //-----------------测试单精度除法-------------------------------------------
    % D8 d/ {! x) I
  44.     start_tim = HAL_GetTick();
    # L) B( U0 K2 G! k
  45.     //除法
    + u; m  X5 M, v) o$ a, C) m$ P% O
  46.     FloatXFloat(PI/6,TIMES,1);
    1 R& R+ k7 V1 w  Y
  47.     end_tim = HAL_GetTick();6 v8 K/ u: E5 R! I
  48.     if(end_tim > start_tim)) y- x5 v1 Y) E6 O6 D
  49.     {3 R/ A. |2 W, d8 S
  50.         tim_cnt = end_tim - start_tim;3 d. z7 X3 L$ A) f
  51.     }
    " o2 W! d* _& \' z1 U
  52.     else
    . T9 M/ l/ X9 O6 O8 l
  53.     {- ]9 L3 ~7 t- S1 ]
  54.         tim_cnt = 0xffffffff - start_tim + end_tim;/ g/ ^+ k) ]  O$ G
  55.     }
    ) A: L: C- \# {+ [  j7 z- Q
  56.     printf("单精度除法-- %d ms\r\n",tim_cnt);    //显示运行时间
    4 S. M7 [2 U% Q' E5 \0 Z
  57.     //-----------------测试双精度乘法-------------------------------------------  o  m' f5 K: S- m- o
  58.     start_tim = HAL_GetTick();+ U: H% Z3 w( p
  59.     //乘法
    1 x' ?+ X4 v# G' T
  60.     DoubleD(PI/6,TIMES,1);
    , ^! j3 w  e: O: R$ E2 j$ H
  61.     end_tim = HAL_GetTick();  y. i5 |# e& U
  62.     if(end_tim > start_tim)
    ; k* F/ V$ z  m
  63.     {
    # T) Q8 J) P- F" ?
  64.         tim_cnt = end_tim - start_tim;
    : q# m# t: y1 ^- c2 r7 s: I2 S
  65.     }, p" y4 {7 x% ~5 i
  66.     else; h2 t* m4 [# i8 ^( ?
  67.     {) B! E8 K/ W/ D5 V* \$ V. s: x: @
  68.         tim_cnt = 0xffffffff - start_tim + end_tim;% f( K" b( n" f' K: M) R: O
  69.     }+ f/ w5 X9 H, v7 H* h: j! S
  70.     printf("双精度乘法-- %d ms\r\n",tim_cnt);    //显示运行时间     6 Q9 ^' r  c0 v0 N3 f7 A
  71.     //-----------------测试双精度除法-------------------------------------------: \6 j  ?2 e: _, G! J6 @. Z% J
  72.     start_tim = HAL_GetTick();
    ; W' |- ?" T4 t5 j9 a
  73.     //除法
    2 j7 b# o$ ?/ j5 b. W
  74.     DoubleD(PI/6,TIMES,1);, Z' A( f( o  f6 G

  75. , o# B$ K! ?& I2 `2 z  b& I
  76.     end_tim = HAL_GetTick();5 K$ n, z" D% C( A
  77.     if(end_tim > start_tim)
    ; u. [1 D( X* D5 Y/ N
  78.     {% {0 Y  @1 Y8 x7 q+ F0 d
  79.         tim_cnt = end_tim - start_tim;
      [* A7 D, H# R
  80.     }
    & D: O, t9 ]3 E- e: S$ m
  81.     else5 _! b! L: W/ s# n- E
  82.     {
    " p# ~, z7 n$ _7 r( e
  83.         tim_cnt = 0xffffffff - start_tim + end_tim;3 L# e: T2 b  o0 Y+ I0 P: d6 b( v
  84.     }
    9 |6 a) |: }4 E8 M
  85.     printf("双精度除法-- %d ms\r\n",tim_cnt);    //显示运行时间 " V* A, O8 M6 C% y

  86. ! g0 F" s; t3 x2 s# P
  87. 8 h/ W0 B' O% m0 P7 Y
  88.     HAL_GPIO_TogglePin(USER_LED_GPIO_Port,USER_LED_Pin);      
    ) i/ p7 d6 _3 o4 A% s* k
  89.     HAL_Delay(500);
    ' M  j6 K" H0 j
  90.   }# O/ S& s! q  l
  91.   /* USER CODE END 3 */# o- H% M0 _& p5 M+ _0 k
  92. }
复制代码
) ]- U, g; J5 B9 g) B8 v& h
/ k: B" n# G, o3 ~( Q5 u( `
( e- C: |2 k! L' y* _6 w
测试结果:6 Z' Q% v+ J1 T/ p4 R
条件:输入参数angle:起始值 = π/6,times:计算次数 = 20000(两万),mod:乘除法时。

) m2 E- n( W$ @3 r; z! o  y- i
(1)没有打开FPU
微信图片_20200304161329.png

) z5 Y: @  k- K) }7 r9 F0 N- ?& w/ ^
(2)打开FPU
微信图片_20200304161336.png

& B- t, ~' Z* `
数据比较

/ E' [# I4 }% c) ^+ f, u
打开FPU(ms)
关闭FPU(ms)
比例
单精度乘法
1
9
9
单精度除法
3
13
4.3
双精度乘法
17
16
0.9
双精度乘法
21
21
1
微信图片_20200304161343.jpg

7 r$ g9 |  z) V7 C
得出结论
打开FPU和没有打开FPU在浮点计算性能上有明显的提高,测试中可以看出在单精度乘法上性能上比较明显,速度大概是没有打开FPU的9倍左右,单精度除法则提升没有那么高4.3倍左右,在双精度上的运算则没有起到作用,耗时基本相同,所以FPU在单精度上计算速度上比较快对于双精度计算则不起作用。
% n' z# m# k5 E& K
4. DSP测试1

) {, ?# t" q  N5 B: c0 x3 }
原理:
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
& {2 B' v& o9 |0 ]$ t$ u* Z8 ?
微信图片_20200304161404.png
( ^" ?+ A8 ]7 Z* t6 \
打开FPU,在target 的Code Generation 选singlePrecision。
微信图片_20200304161411.png
! t+ T8 G9 v. {
减价宏定义ARM_MATH_CM4。
微信图片_20200304161418.png

* y0 v( i4 c' q4 O2 D
测试主要代码:
运算函数:

  1. $ G$ Q) K( W  |4 Y; |
  2. //sin cos测试
    & R% i2 H; j' W3 ?7 {* R
  3. //angle:起始角度; ]" ?% E6 q& e
  4. //times:运算次数+ m0 g, `7 X  }4 \% @
  5. //mode:0,不使用DSP库;1,使用DSP库: `" O+ C/ @7 k- c( @6 b
  6. //返回值:0,成功;0XFF,出错
    ' m- y! }5 R. k1 ~) {& O
  7. uint8_t sin_cos_test(float angle,uint32_t times,uint8_t mode)
    7 P  A% e8 m4 c
  8. {
    ! y5 Z& z, b: {
  9.     float sinx,cosx;
    1 n8 G# P: y& \
  10.     float result;4 E7 a5 j& N4 w# T
  11.     uint32_t i=0;0 x: _4 l9 y) \+ ]' _
  12.     if(mode==0)7 Q; B, z" ]) `
  13.     {8 w1 J! S  t  D8 D' q7 C& b/ M
  14.         for(i=0;i<times;i++)7 D: Y. G: H+ W4 X8 ]
  15.         {5 J& Z  p  s" H
  16.             cosx=cosf(angle);  //不使用DSP优化的sin,cos函数
    # O6 O4 b; H2 c1 c9 Y4 H+ `
  17.             sinx=sinf(angle);" o! U, t% k$ A! h3 }
  18.             result=sinx*sinx+cosx*cosx;//计算结果应该等于1  ( [, g/ ~! m, v. V6 @
  19.             result=fabsf(result-1.0f);//对比与1的差值2 l5 L7 m1 c3 C+ I
  20.             if(result>DELTA)
    4 \  u3 ]/ W% j) g' |
  21.             {! a( W% ]' y. H8 Z/ {7 M# o' h, N
  22.                 return 0XFF;      //判断失败 + C, t9 }6 q# ^5 _' ]
  23.             }
      b8 B1 S3 P; P
  24.             angle+=0.001f;         //角度自增
    1 {5 D$ a0 x, J, \
  25.         }
    ; t" S. k- p! {! u5 [3 {/ o
  26.     }2 _! B2 `, ^8 i1 x0 u$ G; p
  27.     else5 p, m; q0 M( o5 e; J
  28.     {
    : e8 u8 |2 Y$ ]( L" Y7 g+ }7 q
  29.         for(i=0;i<times;i++)
    ( C7 s0 h- Y$ e! D
  30.         {( X2 F+ g. I, R/ g% l
  31.             cosx=arm_cos_f32(angle);//使用DSP优化的sin,cos函数
    & b( F. q$ i* x) B6 V
  32.             sinx=arm_sin_f32(angle);
    ) [" _( j* f2 O
  33.             result=sinx*sinx+cosx*cosx; //计算结果应该等于1  
    ; z" G0 ]7 a: r7 Z7 s, H- D, `& ?
  34.             result=fabsf(result-1.0f);    //对比与1的差值' }! P3 t) S( I  ^# t- l/ v" u9 {
  35.             if(result>DELTA)
    ' ]3 d+ q4 J/ I5 T3 _4 A
  36.             {
    / J$ p$ E+ z+ p# n% j$ ^
  37.                 return 0XFF;//判断失败# H! y4 x8 h8 q6 U/ w
  38.             }
    : U' S: R1 x1 q: t
  39.             angle+=0.001f;                //角度自增+ f9 U) Y* `  N! N/ f, z# Q- K
  40.         }
    3 v! ?# l/ x8 t' f7 k0 N/ }
  41.     }7 G6 n; R2 R* I2 F8 W! Q- |: {
  42.     return 0;//任务完成
    ! ^( }" d; G: M7 ^4 k
  43. }
复制代码

% c& }. B  o% @2 y/ D
; {( V* x7 V& H% e1 W
函数中当输入参数mode为1时使用DSP库提供的arm_cos_f32和arm_sin_f32计算sin(x)² +cos(x)² = 1,输入参数angle为其实角度,计算一次增加0.001,输入的参数timers是要计算的次数,计算的次数越多越消耗时间,对硬件的资源要求就越高,mode为1时则使用st标准库提供的sin,cos函数,所以通过两者的比较得出那种方式比较节省时间。

/ C, u: d* @& K/ T( }. m
主函数
  1. : r; _3 l0 |6 m7 x! p
  2. /**
    6 e1 f% I  a' G, c( F4 p5 J
  3.   * @brief  The application entry point.+ J0 f3 H8 x/ k' Q
  4.   * @retval int
    : s& D# H4 M' r- O
  5.   */
    2 F; o  ^$ z4 X9 R( v; U: m6 [
  6. int main(void)3 N! J* ?/ G1 K: C
  7. {" c) \2 h0 i/ ]9 W# Q
  8.   /* USER CODE BEGIN 1 */
    , @$ N) w2 d1 {0 u9 C) l4 O$ s/ j
  9.   /* USER CODE END 1 */
    7 H  h; D: P9 i1 Z+ ?& I7 p( c. Q
  10.   /* MCU Configuration--------------------------------------------------------*/7 p2 A$ g4 O; c5 `
  11.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    + ~3 R, J: d( o7 i
  12.   HAL_Init();8 W9 h6 x' f3 S! o; _3 `: ?- a
  13.   /* USER CODE BEGIN Init */2 m1 v* p% o6 o9 o! h
  14.   /* USER CODE END Init */3 i2 _& d' k& V
  15.   /* Configure the system clock */
    , |% d1 S6 t; ^# m/ z/ @8 ]; I
  16.   SystemClock_Config();
      h0 _+ Q3 y0 N* V1 B6 u+ f8 R) g. [% ?
  17.   /* USER CODE BEGIN SysInit */3 i/ U# d& r  E, t# }1 z! Q
  18.   /* USER CODE END SysInit */
    0 a1 I5 d6 J' }( s- i& |: {
  19.   /* Initialize all configured peripherals */  @& `$ W3 `& h3 S4 P
  20.   MX_GPIO_Init();
    / z! {& v0 F* n! H
  21.   MX_USART1_UART_Init();
    5 M" _  A8 r3 B
  22.   MX_LPUART1_UART_Init();
    7 }6 G: o! G  x, \" b
  23.   /* USER CODE BEGIN 2 */
    + d2 O* G4 i0 G
  24.   HAL_Init();
    % h. l, D; U. R+ K0 W- b5 ]/ Q
  25.   /* USER CODE END 2 */9 M* e/ X- C4 U" y
  26.   /* Infinite loop */5 ]. F, E+ y1 m
  27.   /* USER CODE BEGIN WHILE */
    5 J, B0 ^9 ]4 S/ t
  28.   while (1); Z) p$ \2 B1 F! _$ P* d
  29.   {0 @8 n( e$ q# \) \; l& J1 n
  30.     /* USER CODE END WHILE */
    ) u( P! g7 Z: j7 N
  31.     /* USER CODE BEGIN 3 */# b  U; K6 c. u) o
  32.      //使用DSP优化
    ! J' V- C  D, p2 e9 k
  33.     start_tim = HAL_GetTick();+ m8 k# V! V" ]& V1 H3 W( s; |0 K
  34.     status = sin_cos_test(PI/6,200000,1);
    ; E$ Y9 n/ Z; o2 @; `3 j
  35.     end_tim = HAL_GetTick();
    6 b  O9 I2 R8 r! x* @! i& s/ M
  36.     if(end_tim > start_tim)
    & p" Z' U1 ?8 J! `* L
  37.     {* M% N, j6 b5 ^( Q+ U
  38.         tim_cnt = end_tim - start_tim;
    ' w$ l5 L" ?& Q% l) i3 B
  39.     }
    , d7 f( W4 X* K2 T) n
  40.     else6 l: C4 S3 d) L/ q- ~4 A
  41.     {! Z5 F. }9 H# _8 L  ^! t
  42.         tim_cnt = 0xffffffff - start_tim + end_tim;
    $ W8 i5 @. x7 w" S$ _
  43.     }+ ^0 x0 Q; b1 d8 d  q3 o
  44.     if(status==0)3 X  J* Y! ]5 J) |% {6 o$ a  D
  45.     {
    & X8 U; j& e' X2 J4 S( L, U% _
  46.         printf("USER DSP-- %d ms\r\n",tim_cnt);    //显示运行时间  
    ) d- v  g4 q) {  v
  47.     }      
    * F9 O1 U3 E9 w. \; u# ^4 _1 J( x
  48.     else' ^1 |9 m# R" v  k
  49.     {' a: I! u8 e- m2 \1 Q9 W0 u! [
  50.         printf("USER DSP ERROR\n");    //显示当前运行情况   
    * |& `; C! Q: ^
  51.     }      
    ( d+ d# F& B0 [0 x# X0 I; P" s7 S+ h
  52.     //不使用DSP优化        , ~. g6 i: [  u& [' E4 N+ a3 ]
  53.     start_tim = HAL_GetTick();1 J. ]) N: ^9 T+ ?8 j
  54.     status = sin_cos_test(PI/6,200000,0);
    : b  m6 _) T7 b5 @  Q) H
  55.     end_tim = HAL_GetTick();8 B$ j8 E% @1 v! Y  G* a
  56.     if(end_tim > start_tim)6 Q9 ^2 c- c" i1 `3 \( R" l
  57.     {, n( i' _$ u  M! X5 W* u
  58.         tim_cnt = end_tim - start_tim;
    : h6 S3 U, _! N- Y: P' `0 p6 o
  59.     }: ^/ K! z, N) |1 Z; ~& z; w0 W7 T
  60.     else
    , X& f9 M/ h( H
  61.     {
    ) \% n& A; Y  a* {# M
  62.         tim_cnt = 0xffffffff - start_tim + end_tim;
    8 G( K) \. Q7 a6 J& K4 j6 c' c
  63.     }    / a' U# l# F  @$ ^& ~+ N
  64. $ y8 J9 c1 W' Y# ]) q! n
  65.     if(status==0)
    5 C5 |# J$ A" d% v4 O) ^
  66.     {5 g5 |2 U  r7 _& d: k1 k2 j
  67.         printf("NOT USER DSP-- %d-ms\r\n",tim_cnt);    //显示运行时间  - e3 n1 E5 }: \- a' _/ r3 o: E7 E
  68.     }      
    & \4 B/ z( S' Y  ]
  69.     else
    ; E. c6 K$ m0 C
  70.     {
    * q, W$ M' R, u
  71.         printf("NOT USER DSP ERROR\n");    //显示当前运行情况   
    # v! G$ p7 W+ @
  72.     }   
    1 D% m* T+ \# g
  73.     HAL_GPIO_TogglePin(USER_LED_GPIO_Port,USER_LED_Pin);      
    3 J* t( S4 l- u3 ?$ {
  74.     HAL_Delay(500);
复制代码
4 {' r3 D0 s: d$ g% N+ w' G. w

# z4 ?# d2 z, k) [
参数:angle : 起始角度 = π/6 ; times : 运算次数 = 10 000(1万);" ]' H/ {9 M" [3 W* V# i
' p6 e$ e, p* `& Z, u& e
结果如下图:使用DSP是8ms,没有使用DSP是12ms;12/8= 1.5倍。
微信图片_20200304161428.png
参数:angle : 起始角度 = π/6 ; times : 运算次数 = 100 000(10万);
: X, ^5 |$ V+ |* {( r8 p. e
结果如下图:使用DSP是86ms,没有使用DSP是129ms;129/86= 1.5倍。
微信图片_20200304161435.png

2 A! H, f/ j- Q! o8 Q5 `4 O
参数:angle : 起始角度 = π/6 ; times : 运算次数 = 200000(20万);

7 R% S- h! g+ t7 o
结果如下图:使用DSP是172ms,没有使用DSP是258ms;258/172= 1.5倍。
微信图片_20200304161441.png
( V+ l0 r0 c2 i8 P5 G" h$ d
总结:在单精度数学运算方面使用DSP加数的效果还是比较明显的,平均来说是没有说使用DSP的15倍。
2 x" o1 e, b- P# \! X( R
收藏 评论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 手机版