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

【经验分享】STM32F4 基于库函数移植DSP源码“DSP简介及工程创建“

[复制链接]
STMCU小助手 发布时间:2022-7-6 15:05
DSP简介+ r$ I5 c% U4 n+ m5 l* |" ~
STM32F4 采用 Cortex-M4 内核,相比 Cortex-M3 系列除了内置硬件 FPU 单元,在数字信
9 E5 X: c) L5 I* K$ C号处理方面还增加了 DSP 指令集,支持诸如单周期乘加指令(MAC),优化的单指令多数据指5 r; M9 ~) n" y# E7 ^. m
令(SIMD),饱和算数等多种数字信号处理指令集。相比 Cortex-M3,Cortex-M4 在数字信号处/ a' j5 D4 {* w1 ?( X  n* T
理能力方面得到了大大的提升。Cortex-M4 执行所有的 DSP 指令集都可以在单周期内完成,而# `" \5 c+ t/ ~. t: p: ^; a, ~0 b
Cortex-M3 需要多个指令和多个周期才能完成同样的功能* M' D2 r6 Z7 z

' |/ l8 S8 }  x2 @6 \5 {5 q/ O以上都不重要。重要的是,它运算快就完了!!!具体多快,我们后面会有相应测试4 y: H: e% E& M9 M- o# R# A7 Z
; X/ W  J6 Y4 S2 H
一、可供移植的DSP文件& y: }% c2 G! ?+ K* E' @2 Q' V; }
STM32F4 的 DSP 库源码和测试实例在 ST 提供的标准库,详细路径为:光盘→8,STM32  }, g8 Z8 [2 j8 b( ?
参考资料→STM32F4xx 固件库→STM32F4xx_DSP_StdPeriph_Lib_V1.4.0→Libraries→CMSIS→- W  Y4 L( i% d& M6 I/ h# ?
DSP_Lib。
  @  u: E. J5 H( O8 d- NDSP_Lib 源码包的 Source 文件夹是所有 DSP 库的源码,Examples 文件夹是相对应的一些
& w8 w0 n8 v  P! }, G测试实例。这些测试实例都是带 main 函数的,也就是拿到工程中可以直接使用。接下来我们一
2 ~7 J2 }. C$ p- O: S0 g/ O, w一讲解一下 Source 源码文件夹下面的子文件夹包含的 DSP 库的功能。7 @. {$ N7 L4 D* t& s

7 O8 C. D! s7 D' F. Y/ z$ ?; d" |BasicMathFunctions
0 s2 ~; J1 s; ]0 _! X! Z) u
基本数学函数:提供浮点数的各种基本运算函数,如向量加减乘除等运算。
9 I$ d6 i+ s+ h& a  r
6 ^3 z) G& g5 K( \4 D; NCommonTables$ Y1 \  x0 {' Q9 i8 I; g' B
arm_common_tables.c 文件提供位翻转或相关参数表。1 i% b* O3 V% o+ N/ j

. c  W. U! U% H/ ?+ n, Z1 NComplexMathFunctions: \. ^4 q- y" w) \9 B
复杂数学功能,如向量处理,求模运算的。3 n; n1 h% L  R2 ]

, x- x) o8 G, ]; DControllerFunctions
7 z4 s9 H- i# N, U控制功能函数。包括正弦余弦,PID 电机控制,矢量 Clarke 变换,矢量 Clarke 逆变换等。
3 H" g! D2 Y5 W' ^9 r$ L, G; @- f( K5 y$ B  b3 |; ?
FastMathFunctions

* B0 o# A, {6 T1 V快速数学功能函数。提供了一种快速的近似正弦,余弦和平方根等相比 CMSIS 计算库要快
$ P$ W) ?8 ~! t. g7 Y0 T的数学函数。( j( g% h0 K* D
) ^% x. _% Z: I# K$ \% h& z
FilteringFunctions% X0 Q9 a- R% D# G
滤波函数功能,主要为 FIR 和 LMS(最小均方根)等滤波函数。+ n1 j) ]4 G8 m2 g
% z2 ]" t/ C- ]" x
MatrixFunctions6 b1 }, }' c8 j# o5 B0 h) z! f
矩阵处理函数。包括矩阵加法、矩阵初始化、矩阵反、矩阵乘法、矩阵规模、矩阵减法、2 g: w3 x* I. n5 w+ A
矩阵转置等函数。/ E1 O! X( d4 p' B+ C  W7 i& Y. ]

, B5 W; p7 Z" p0 [( kStatisticsFunctions

, j! o2 M5 Z: E* S统计功能函数。如求平均值、最大值、最小值、计算均方根 RMS、计算方差/标准差等。
3 k7 i0 k# s1 ?3 r; U$ q6 v+ S% V/ b- G" Q+ F. J. A$ \6 o0 R
SupportFunctions

" E! Y% }5 x0 r3 A& i支持功能函数,如数据拷贝,Q 格式和浮点格式相互转换,Q 任意格式相互转换。
' x1 Z7 V  n7 |  m% v) U) `7 ~/ M1 c- ^1 j( u
TransformFunctions

" Z* R/ P3 r* M0 F: T' x4 L8 S变换功能。包括复数 FFT(CFFT)/复数 FFT 逆运算(CIFFT)、实数 FFT(RFFT)/实数
  q- R" d5 c% B9 R7 LFFT 逆运算(RIFFT)、和 DCT(离散余弦变换)和配套的初始化函数
3 W" d/ G+ I% \0 x  M9 B* P5 d# ]6 t3 d6 C/ n
!!! 所有这些 DSP 库代码合在一起是比较多的,因此,ST 为我们提了.lib 格式的文件
" Z. n: b" t+ C: n3 K8 H.lib 格式文件路径:光盘→8,STM32 参考资料→STM32F4xx固件库→STM32F4xx_DSP_StdPeriph_Lib_V1.4.0→Libraries→CMSIS→Lib→ARM。根据自己的需求选择不同的.lib文件。
3 D% f, Y4 B# K+ g3 l我们所用的STM32F4 属于 CortexM4F 内核,小端模式,应选择:arm_cortexM4lf_math.lib(浮点 Cortex-M4
$ P; m8 h" S7 U/ e# i" P9 |3 n3 a: W+ e小端模式)。
5 b, q+ j% m" w! ?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
) a) s/ b9 Q1 d/ k  }  F) n3 }2 r* ~% H& \% Q: Y" x
二、arm_cortexM4lf_math.lib

4 f1 r' ^. u  r3 P1.可使用的DSP函数

) X8 X3 E% Z8 J" Y我们打开.lib文件可看到,里面存有编译后的.o文件,也就是提供可使用的DSP函数。( ?2 b8 i: N4 J/ k  Z+ g7 w( L
根据函数名可以粗略了解其含义,也可以度娘搜索DSP函数XXX,即可查到其含义。) v8 o' o+ m3 d7 ~0 i; `" H
后续将在实验中一一讲解。
& t( o6 `" s9 ]6 z1 m4 U
- {- F2 E0 F- O( {1 B  m代码如下(示例):
5 Q2 n- l7 n# Y2 `  ]+ W
# F/ a" v9 i8 ^5 E4 a: }+ Q& m
  1. arm_dot_prod_f32.o/
    & K2 i: K- t7 y1 S
  2. arm_dot_prod_q7.o/
    / _0 M' k  _+ S* c
  3. arm_dot_prod_q15.o/
    0 \4 e  d' j- O% M/ L! M  K
  4. arm_dot_prod_q31.o/
    ! l1 g! S$ O9 e( W* k
  5. arm_negate_f32.o/0 m( F$ A2 h3 B) c
  6. arm_negate_q15.o/+ e- H, s2 i2 x* |& y) u1 B7 a
  7. arm_negate_q31.o/
    ) R$ t! S/ ?3 T$ h6 E
  8. arm_offset_f32.o/0 |, G( G, Z! J, o% A# [0 _
  9. arm_offset_q15.o/* c2 |0 e) B* _: J0 e* c5 I
  10. arm_offset_q31.o/" D0 }# J) e  \! D- w
  11. arm_cmplx_conj_f32.o/4 O5 S- R: T$ |* Q$ S4 U' x5 R
  12. arm_cmplx_conj_q15.o/1 X1 |* K, r, u
  13. arm_cmplx_conj_q31.o/
    2 ~& Q& V2 U2 c  N+ |7 V7 x
  14. arm_cmplx_dot_prod_f32.o/* c+ R( B' u) s) q9 p4 P* n
  15. arm_cmplx_dot_prod_q15.o/* M" E' Q* I1 ]# ]
  16. arm_cmplx_dot_prod_q31.o/! E" N2 M" g: K4 R9 i& k
  17. arm_cmplx_mag_f32.o/1 }. c1 E  A" y3 d( j# T% n7 v& c
  18. arm_cmplx_mag_q15.o/. s1 ]' o9 D' p& x. m, k5 `7 m
  19. arm_cmplx_mag_q31.o/
    . J: V4 y: G  U+ n# W  x7 {8 m
  20. arm_cmplx_mag_squared_f32.o/2 T, L1 u* O# |  i2 k( v
  21. arm_cmplx_mag_squared_q15.o/
    ( ^7 g* Z0 f) v' v) Z/ y
  22. arm_cmplx_mag_squared_q31.o/
    + o1 `' k0 X* o5 V
  23. arm_cmplx_mult_cmplx_f32.o/+ X) Q# A' h" n" J' `$ X
  24. arm_cmplx_mult_cmplx_q15.o/
    " ~7 ?+ I8 `& V8 i. h7 t- M
  25. arm_cmplx_mult_cmplx_q31.o/
    & G4 y" `8 w+ c/ k) q* T% J1 \
  26. arm_cmplx_mult_real_f32.o/
    6 n9 S  P" J" b8 P1 U- [
  27. arm_cmplx_mult_real_q15.o/
    - f& |- Y5 G& ?7 J( Z7 G+ q
  28. arm_cmplx_mult_real_q31.o/5 f& {+ h' B! h; Q" V7 f7 t
  29. arm_biquad_cascade_df1_32x64_init_q31.o/
    / L9 T9 r% ]: S& n
  30. arm_biquad_cascade_df1_32x64_q31.o/; Z+ E7 c! v* r
  31. arm_biquad_cascade_df1_f32.o/6 h- y, L, D! g/ s; q6 L
  32. arm_biquad_cascade_df1_fast_q15.o/
    7 g; @$ ~1 ~' O4 t  g9 r9 A
  33. arm_biquad_cascade_df1_fast_q31.o/
    5 P4 m# v$ F2 [2 J# o1 i
  34. arm_biquad_cascade_df1_init_f32.o/
    ! E8 c4 q/ u; ?" T6 ~
  35. arm_biquad_cascade_df1_init_q15.o/
    7 \  M' U* c/ b' V
  36. arm_biquad_cascade_df1_init_q31.o/
    % n5 Q3 w3 v: u7 f% @% r
  37. arm_biquad_cascade_df1_q15.o/8 H/ y  a4 o( h4 j' A
  38. arm_biquad_cascade_df1_q31.o/
    ; x. ~) S  z( B* q6 C
  39. arm_biquad_cascade_df2t_f32.o/
    : A+ f/ f- o( r7 u  `4 P" b1 P3 k
  40. arm_biquad_cascade_df2t_init_f32.o/
    : S& s! S) G4 x' A0 }
  41. arm_conv_fast_opt_q15.o/; M- _' F: y3 V" H
  42. arm_conv_fast_q15.o/
    7 U/ ~' f, k1 j) [
  43. arm_conv_fast_q31.o/
    ( B/ U  y% K5 C5 V
  44. arm_conv_opt_q7.o/) a# i+ i* M/ F( ^3 ], h0 B- F+ ?
  45. arm_conv_opt_q15.o/
    9 h- k) M4 E9 Z
  46. arm_conv_partial_f32.o/
    & a3 z- \6 ?2 n
  47. arm_conv_partial_fast_opt_q15.o/
    - l7 F  @) s# V( y. S
  48. arm_conv_partial_fast_q15.o/
    7 v& ?" z  |3 }9 ~8 A
  49. arm_conv_partial_fast_q31.o/8 T' {; p2 ~5 h; |& w7 c0 a! J1 X  [
  50. arm_conv_partial_opt_q7.o/
    7 ?1 @1 z! `6 d. J: F" e
  51. arm_conv_partial_opt_q15.o/4 }9 j/ E# P4 D2 V9 V' \- Z
  52. arm_conv_partial_q7.o/1 a2 u: s8 Z, t2 q5 [  b
  53. arm_conv_partial_q15.o/* M% c- I- g* X/ H$ Q
  54. arm_conv_partial_q31.o/; y/ K+ L$ d/ \, a3 \" y4 T
  55. arm_correlate_f32.o// ?: x$ B' ~2 U* s7 G
  56. arm_correlate_fast_opt_q15.o/# |" H& }1 a, k2 N2 ^0 C7 R
  57. arm_correlate_fast_q15.o/
    * S- l/ c& l# V5 D/ p2 |
  58. arm_correlate_fast_q31.o/
    1 L. v9 C( {* d* o) v+ S
  59. arm_correlate_opt_q7.o/% q8 D1 J: o  [' |( \# C# R
  60. arm_correlate_opt_q15.o/
    ; w8 e6 _( Z( r
  61. arm_correlate_q7.o/2 `6 h2 @& j$ A
  62. arm_correlate_q15.o/
    ! Q9 v3 ^# s% I8 x  s
  63. arm_correlate_q31.o/
    . G' ?1 j* w$ U$ d% x' O0 s, e
  64. arm_fir_decimate_f32.o/+ F) O# J3 ], ]! ^( A
  65. arm_fir_decimate_fast_q15.o/
    % q& Q* k0 i$ d  ~  `
  66. arm_fir_decimate_fast_q31.o/
    9 L9 z8 B1 C2 R) e- d9 l
  67. arm_fir_decimate_init_f32.o/
    0 p# N1 s6 n& ?4 R2 R
  68. arm_fir_decimate_init_q15.o/
    0 N5 c5 m* h1 m: j, |
  69. arm_fir_decimate_init_q31.o/
    ( I1 W& @* |' I" ]) J
  70. arm_fir_decimate_q15.o/
    5 o# d% ?- n" ~0 R2 Y# i) w
  71. arm_fir_decimate_q31.o/" Y6 p( B7 X: A
  72. arm_fir_fast_q15.o/
    5 }, W; G1 o  H) [1 X9 L) W
  73. arm_fir_fast_q31.o/  }4 e+ H+ m, W
  74. arm_fir_init_f32.o/7 D- R6 W7 n* u6 C: Z/ U  |
  75. arm_fir_init_q7.o/. e7 [0 \% B3 a* @% o" U
  76. arm_fir_init_q15.o/
    . B0 N" r; l/ o& S! U) I
  77. arm_fir_init_q31.o/
    % _: G: D. Q) g- H# t3 c
  78. arm_fir_interpolate_f32.o/
    1 C2 x7 T8 u" z
  79. arm_fir_interpolate_init_f32.o/
    % h! G7 k/ L+ ?+ j5 A* c) U
  80. arm_fir_interpolate_init_q15.o/
    2 m# G: p7 i% n  h& n9 x7 M# D* v0 V
  81. arm_fir_interpolate_init_q31.o/
    % M9 ]  N: j1 J1 s8 O
  82. arm_fir_interpolate_q15.o/
    3 i( i" [/ e/ O. V
  83. arm_fir_interpolate_q31.o/) @! A7 q2 c9 n/ H3 n  e
  84. arm_fir_lattice_f32.o/; }: w: E, ]. \+ e+ Y  ]
  85. arm_fir_lattice_init_f32.o/9 I6 H8 z: p- ]7 U+ l0 H/ x; N
  86. arm_fir_lattice_init_q15.o/; m; m; X4 F8 Q  ^$ H6 r; G7 J% U8 B
  87. arm_fir_lattice_init_q31.o/  ?  N& l' k- k/ I* G
  88. arm_fir_lattice_q15.o/& Z3 R1 s1 o: h; U- f
  89. arm_fir_lattice_q31.o/
    * l" M7 _- H- f# C; T# z7 z
  90. arm_fir_sparse_f32.o/
    0 k. B6 D8 ?" ^1 i
  91. arm_fir_sparse_init_f32.o/
    " V, G/ Y: u- V# ]
  92. arm_fir_sparse_init_q7.o/
    * L4 r* z1 K+ t/ M; B
  93. arm_fir_sparse_init_q15.o/
    , s4 K4 o) r3 q; i6 B5 V
  94. arm_fir_sparse_init_q31.o/( R4 _- p4 j7 E$ C" X) `! y
  95. arm_fir_sparse_q7.o/
    % j) i1 c/ r$ @, ^
  96. arm_fir_sparse_q15.o/& k* i. g! C* t* ~8 m, E1 g
  97. arm_fir_sparse_q31.o/
    9 ]# e7 U4 B. P+ J5 d- U; Z
  98. arm_iir_lattice_f32.o/
    # a: |! ^) y+ Z- X
  99. arm_iir_lattice_init_f32.o/
    0 M4 c; P; V( q0 N# e( y
  100. arm_iir_lattice_init_q15.o/
    # L; Z! j2 U2 h% G( U
  101. arm_iir_lattice_init_q31.o/4 _" z! `( S6 O/ T
  102. arm_iir_lattice_q15.o/9 c* ~6 p( m& T# ?
  103. arm_iir_lattice_q31.o/* m  c4 o. r/ Q# q4 W/ z
  104. arm_lms_init_f32.o/- Z' R* q: b8 M2 W2 B7 ?7 w) h( k
  105. arm_lms_init_q15.o/
    9 V9 o( k6 @) a
  106. arm_lms_init_q31.o/& t' |: N6 v4 |5 n  h2 z
  107. arm_lms_norm_f32.o/' a& X4 a/ n' ~
  108. arm_lms_norm_init_f32.o/- j; y+ O/ K, @& c  n
  109. arm_lms_norm_init_q15.o/
    ) X) @4 k3 u; ^# U0 @/ i
  110. arm_lms_norm_init_q31.o/5 g4 O, O1 z2 F9 p& i
  111. arm_lms_norm_q15.o/* f7 F4 w5 i+ t; F% `
  112. arm_lms_norm_q31.o/7 N' X4 m4 x& ~$ N* P3 a* a; q
  113. arm_mat_add_f32.o/  h9 g3 \3 R, V2 I7 B4 {" @, Z
  114. arm_mat_add_q15.o/
    3 x, z% B# `4 R+ {* P! u; f
  115. arm_mat_add_q31.o/
    ) F9 o, w! a+ l8 F7 X6 w
  116. arm_mat_init_f32.o/
    0 v, [5 o( x( N" r7 i' R* {8 ?- l
  117. arm_mat_init_q15.o/
    ) F- M0 E! Z; i& H
  118. arm_mat_init_q31.o/
    3 q$ F) a/ x9 V. s8 R) U6 `
  119. arm_mat_inverse_f32.o/
    3 f1 |/ N, h4 Q8 U- K8 b
  120. arm_mat_mult_f32.o/$ G% ]5 n3 Q# q6 l
  121. arm_mat_mult_fast_q15.o/4 ]1 c8 ^7 i. ~4 O* M$ z
  122. arm_mat_mult_fast_q31.o/0 j0 E$ Q5 ^- r& l
  123. arm_mat_mult_q15.o/
    5 A( G( d$ E: e* n2 B4 s  s1 U
  124. arm_mat_mult_q31.o/
    ' r8 w: E4 k& ?& h  `
  125. arm_mat_scale_f32.o/# r" l, X- B( O) w
  126. arm_mat_scale_q15.o/
    : j4 t/ q8 e  V/ c1 {5 p6 j% n
  127. arm_mat_scale_q31.o/) g( w1 F6 U4 f
  128. arm_mat_sub_f32.o/% x; n2 k7 M: ~' z6 O
  129. arm_mat_sub_q15.o/
    ; T1 Q8 R! ]6 Y$ k0 q7 m
  130. arm_mat_sub_q31.o/
    - A: G3 I4 U* W+ O, f; P# n" I7 P
  131. arm_mat_trans_f32.o/
    # y% D9 Y6 }5 d0 F$ }
  132. arm_mat_trans_q15.o/7 a/ _. H# c! y
  133. arm_mat_trans_q31.o/8 Z1 N* |. z, b3 `( Z) H
  134. arm_bitreversal.o/9 S* \: y0 `6 M6 o3 t- K
  135. arm_bitreversal2.o/
      _. Q9 m( w' x$ U! C  b
  136. arm_cfft_radix2_f32.o/* m8 F* j# ~+ u6 F$ N( P  [
  137. arm_cfft_radix2_init_f32.o/
    / V+ Y9 G! w. p
  138. arm_cfft_radix2_init_q15.o/9 w- ~3 j: K( q
  139. arm_cfft_radix2_init_q31.o/
    / @, G* W9 {, f% V+ q5 `5 \( {
  140. arm_cfft_radix2_q15.o/
    8 B3 y; \+ I" J% l* Y
  141. arm_cfft_radix2_q31.o/. f0 g  V- a( ?3 d5 ~- c
  142. arm_cfft_radix4_f32.o/
    8 F  f) \  a5 x2 P
  143. arm_cfft_radix4_init_f32.o/6 N" X# B  c. e$ P  x
  144. arm_cfft_radix4_init_q15.o/5 Y9 @( S) U* `( ?. M2 A
  145. arm_cfft_radix4_init_q31.o/" Y. w& ?6 z- ^
  146. arm_cfft_radix4_q15.o/0 G5 O$ ?5 n, e( I" n/ N
  147. arm_cfft_radix4_q31.o/1 M- U; v6 h0 [
  148. arm_cfft_radix8_f32.o/. j( e" t' L0 E, J, M, A
  149. arm_dct4_init_f32.o/. m* j6 C* d5 N  [% @2 N: O
  150. arm_dct4_init_q15.o/
    % f' R: ?0 ?8 g6 _) G
  151. arm_dct4_init_q31.o/
    9 q' M1 z0 R* g4 P7 @
  152. arm_rfft_fast_f32.o/
    1 }: w- M; b, T. s3 S
  153. arm_rfft_fast_init_f32.o/
    ' X; V, n% C! I0 _0 A4 `3 n  t
  154. arm_rfft_init_f32.o/: O4 C. V9 a7 a% p% U
  155. arm_rfft_init_q15.o/5 m8 c7 x1 s9 \, V5 q) H
  156. arm_rfft_init_q31.o/
    % \  s* T- Q4 j9 \4 V; @: `
  157. arm_pid_init_f32.o/- Y$ ~( m* m8 ^
  158. arm_pid_init_q15.o/
    ( B, k) @, g1 Y8 h+ J5 X
  159. arm_pid_init_q31.o/* k; n, f0 N- z, ^, l. B, F8 [; y
  160. arm_pid_reset_f32.o/
    9 {- z# y- B) G
  161. arm_pid_reset_q15.o/* Q# f* h. z% r& |2 D5 f
  162. arm_pid_reset_q31.o/
    ; l7 K, N1 Z+ o) c% N- X4 b
  163. arm_sin_cos_f32.o/  s3 f# ~  `% b& ?& z/ ~6 f+ t' q
  164. arm_sin_cos_q31.o/
    : B* V; M3 q* H' z6 u
  165. arm_float_to_q7.o/( v, }  S( B2 `4 x( k, ?$ e$ b
  166. arm_float_to_q15.o/! P5 h0 y$ c# q2 j
  167. arm_float_to_q31.o/% [/ V' f& n7 j1 A, k
  168. arm_q7_to_float.o/& e9 s' \& b0 A/ Z( R
  169. arm_q15_to_float.o/' T" h, `0 I+ H7 F
  170. arm_q15_to_q31.o/4 c4 Z6 G; m6 K# R
  171. arm_q31_to_float.o/. l: L3 K; k- O4 x+ K7 [( {/ M
  172. arm_q31_to_q15.o/
      k1 T( b7 ]6 N
  173. arm_common_tables.o/
复制代码
* u; m- B! g% d0 c8 M) R, T
2.工程移植
7 {; V2 k* Y! x# Z1、添加文件。
$ q. ^0 b, R/ q9 O首先,我们在例程工程目录下新建:DSP_LIB 文件夹,存放我们将要添加的文件:arm_cortexM4lf_math.lib 和相关头文件,然后,打开工程,新建 DSP_LIB 分组,并将 arm_cortexM4lf_math.lib 添加到工程里面。: R) A/ ?6 R: ~1 Q
( E, F# y) j& y9 S! V% b% q4 D- n
2、 添加头文件包含路径0 F3 n  C1 K2 x
添加好.lib 文件后,我们要添加头文件包含路径,将第一步拷贝的 Include 文件夹和 DSP_LIB5 e/ r, {4 G# W: ]3 \9 x, r$ i2 K
文件夹,加入头文件包含路径。
, r- v: K; k" z8 Z
& ]' f6 ]: g' ]) U3 i3、 添加全局宏定义
3 u/ t; j  n- ~5 @) a) Y8 x7 j最后,为了使用 DSP 库的所有功能,我们还需要添加几个全局宏定义:
0 Y" E; `: J2 q" s$ Q1,__FPU_USED
' B" K  T0 O# A$ Y* I2 n2,__FPU_PRESENT
" z" H# ]4 |/ ~$ M/ o" _, `' Y+ I5 A3,ARM_MATH_CM42 ]; W) `. k' L# H( ~; }
4,__CC_ARM! k. K- b! o: p8 V+ v' n: F
5,ARM_MATH_MATRIX_CHECK' N  \; N8 v% u; Q5 @( i% S
6,ARM_MATH_ROUNDING
. ]; r2 ?0 W$ v% d3 w5 F3 K) W8 V' T; g; L: B8 E
eea0a91185c910db704ae6364241a6e2.png : E9 h5 v1 i+ b' _) Q" X
1 R/ p. M4 i9 B
这里,两个宏之间用“,”隔开。并且,上面的全局宏里面,我们没有添加__FPU_USED,
7 ]8 C8 E! o! U4 s% c因为这个宏定义在 Target 选项卡设置 Code Generation 的时候(上一章有介绍),选择了:Use FPU
8 T1 o$ R1 a8 s: a" O(如果没有设置 Use FPU,则必须设置!!),故 MDK 会自动添加这个全局宏,因此不需要我们/ _! p  O9 U- \& D0 C
手动添加了。同时__FPU_PRESENT 全局宏我们 FPU 实验已经讲解,这个宏定义在 stm32f4xx.h9 s+ G5 f2 H- K+ u9 t$ N8 v
头文件里面已经定义。 这样,在 Define 处 要 输 入 的 所 有 宏 为 :
5 Z. u# I( S8 A; Q, B% |1 tSTM32F40_41xxx,USE_STDPERIPH_DRIVER,ARM_MATH_CM4,__CC_ARM,ARM_MATH_M
6 s: e: Q! ~- X1 K6 QATRIX_CHECK,ARM_MATH_ROUNDING 共 6 个。
  g8 O0 h; _  T3 o" ?至此,STM32F4 的 DSP 库运行环境就搭建完成了。特别注意,为了方便调试,本章例程我们将 MDK 的优化设置为-O0 优化,以得到最好的调试效果。, C, j2 {) M& z' ~) F. @
0 f, r1 t! b/ U+ r1 B' X4 y
2 e1 L( Q" C0 @. ~2 f8 I2 l
收藏 评论0 发布时间:2022-7-6 15:05

举报

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