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

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

[复制链接]
STMCU小助手 发布时间:2022-7-6 15:05
DSP简介
STM32F4 采用 Cortex-M4 内核,相比 Cortex-M3 系列除了内置硬件 FPU 单元,在数字信
号处理方面还增加了 DSP 指令集,支持诸如单周期乘加指令(MAC),优化的单指令多数据指
令(SIMD),饱和算数等多种数字信号处理指令集。相比 Cortex-M3,Cortex-M4 在数字信号处
理能力方面得到了大大的提升。Cortex-M4 执行所有的 DSP 指令集都可以在单周期内完成,而
Cortex-M3 需要多个指令和多个周期才能完成同样的功能

以上都不重要。重要的是,它运算快就完了!!!具体多快,我们后面会有相应测试

一、可供移植的DSP文件
STM32F4 的 DSP 库源码和测试实例在 ST 提供的标准库,详细路径为:光盘→8,STM32
参考资料→STM32F4xx 固件库→STM32F4xx_DSP_StdPeriph_Lib_V1.4.0→Libraries→CMSIS→
DSP_Lib。
DSP_Lib 源码包的 Source 文件夹是所有 DSP 库的源码,Examples 文件夹是相对应的一些
测试实例。这些测试实例都是带 main 函数的,也就是拿到工程中可以直接使用。接下来我们一
一讲解一下 Source 源码文件夹下面的子文件夹包含的 DSP 库的功能。

BasicMathFunctions

基本数学函数:提供浮点数的各种基本运算函数,如向量加减乘除等运算。

CommonTables
arm_common_tables.c 文件提供位翻转或相关参数表。

ComplexMathFunctions
复杂数学功能,如向量处理,求模运算的。

ControllerFunctions
控制功能函数。包括正弦余弦,PID 电机控制,矢量 Clarke 变换,矢量 Clarke 逆变换等。

FastMathFunctions

快速数学功能函数。提供了一种快速的近似正弦,余弦和平方根等相比 CMSIS 计算库要快
的数学函数。

FilteringFunctions
滤波函数功能,主要为 FIR 和 LMS(最小均方根)等滤波函数。

MatrixFunctions
矩阵处理函数。包括矩阵加法、矩阵初始化、矩阵反、矩阵乘法、矩阵规模、矩阵减法、
矩阵转置等函数。

StatisticsFunctions

统计功能函数。如求平均值、最大值、最小值、计算均方根 RMS、计算方差/标准差等。

SupportFunctions

支持功能函数,如数据拷贝,Q 格式和浮点格式相互转换,Q 任意格式相互转换。

TransformFunctions

变换功能。包括复数 FFT(CFFT)/复数 FFT 逆运算(CIFFT)、实数 FFT(RFFT)/实数
FFT 逆运算(RIFFT)、和 DCT(离散余弦变换)和配套的初始化函数

!!! 所有这些 DSP 库代码合在一起是比较多的,因此,ST 为我们提了.lib 格式的文件
.lib 格式文件路径:光盘→8,STM32 参考资料→STM32F4xx固件库→STM32F4xx_DSP_StdPeriph_Lib_V1.4.0→Libraries→CMSIS→Lib→ARM。根据自己的需求选择不同的.lib文件。
我们所用的STM32F4 属于 CortexM4F 内核,小端模式,应选择:arm_cortexM4lf_math.lib(浮点 Cortex-M4
小端模式)。
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、arm_cortexM4lf_math.lib

1.可使用的DSP函数

我们打开.lib文件可看到,里面存有编译后的.o文件,也就是提供可使用的DSP函数。
根据函数名可以粗略了解其含义,也可以度娘搜索DSP函数XXX,即可查到其含义。
后续将在实验中一一讲解。

代码如下(示例):

  1. arm_dot_prod_f32.o/
  2. arm_dot_prod_q7.o/
  3. arm_dot_prod_q15.o/
  4. arm_dot_prod_q31.o/
  5. arm_negate_f32.o/
  6. arm_negate_q15.o/
  7. arm_negate_q31.o/
  8. arm_offset_f32.o/
  9. arm_offset_q15.o/
  10. arm_offset_q31.o/
  11. arm_cmplx_conj_f32.o/
  12. arm_cmplx_conj_q15.o/
  13. arm_cmplx_conj_q31.o/
  14. arm_cmplx_dot_prod_f32.o/
  15. arm_cmplx_dot_prod_q15.o/
  16. arm_cmplx_dot_prod_q31.o/
  17. arm_cmplx_mag_f32.o/
  18. arm_cmplx_mag_q15.o/
  19. arm_cmplx_mag_q31.o/
  20. arm_cmplx_mag_squared_f32.o/
  21. arm_cmplx_mag_squared_q15.o/
  22. arm_cmplx_mag_squared_q31.o/
  23. arm_cmplx_mult_cmplx_f32.o/
  24. arm_cmplx_mult_cmplx_q15.o/
  25. arm_cmplx_mult_cmplx_q31.o/
  26. arm_cmplx_mult_real_f32.o/
  27. arm_cmplx_mult_real_q15.o/
  28. arm_cmplx_mult_real_q31.o/
  29. arm_biquad_cascade_df1_32x64_init_q31.o/
  30. arm_biquad_cascade_df1_32x64_q31.o/
  31. arm_biquad_cascade_df1_f32.o/
  32. arm_biquad_cascade_df1_fast_q15.o/
  33. arm_biquad_cascade_df1_fast_q31.o/
  34. arm_biquad_cascade_df1_init_f32.o/
  35. arm_biquad_cascade_df1_init_q15.o/
  36. arm_biquad_cascade_df1_init_q31.o/
  37. arm_biquad_cascade_df1_q15.o/
  38. arm_biquad_cascade_df1_q31.o/
  39. arm_biquad_cascade_df2t_f32.o/
  40. arm_biquad_cascade_df2t_init_f32.o/
  41. arm_conv_fast_opt_q15.o/
  42. arm_conv_fast_q15.o/
  43. arm_conv_fast_q31.o/
  44. arm_conv_opt_q7.o/
  45. arm_conv_opt_q15.o/
  46. arm_conv_partial_f32.o/
  47. arm_conv_partial_fast_opt_q15.o/
  48. arm_conv_partial_fast_q15.o/
  49. arm_conv_partial_fast_q31.o/
  50. arm_conv_partial_opt_q7.o/
  51. arm_conv_partial_opt_q15.o/
  52. arm_conv_partial_q7.o/
  53. arm_conv_partial_q15.o/
  54. arm_conv_partial_q31.o/
  55. arm_correlate_f32.o/
  56. arm_correlate_fast_opt_q15.o/
  57. arm_correlate_fast_q15.o/
  58. arm_correlate_fast_q31.o/
  59. arm_correlate_opt_q7.o/
  60. arm_correlate_opt_q15.o/
  61. arm_correlate_q7.o/
  62. arm_correlate_q15.o/
  63. arm_correlate_q31.o/
  64. arm_fir_decimate_f32.o/
  65. arm_fir_decimate_fast_q15.o/
  66. arm_fir_decimate_fast_q31.o/
  67. arm_fir_decimate_init_f32.o/
  68. arm_fir_decimate_init_q15.o/
  69. arm_fir_decimate_init_q31.o/
  70. arm_fir_decimate_q15.o/
  71. arm_fir_decimate_q31.o/
  72. arm_fir_fast_q15.o/
  73. arm_fir_fast_q31.o/
  74. arm_fir_init_f32.o/
  75. arm_fir_init_q7.o/
  76. arm_fir_init_q15.o/
  77. arm_fir_init_q31.o/
  78. arm_fir_interpolate_f32.o/
  79. arm_fir_interpolate_init_f32.o/
  80. arm_fir_interpolate_init_q15.o/
  81. arm_fir_interpolate_init_q31.o/
  82. arm_fir_interpolate_q15.o/
  83. arm_fir_interpolate_q31.o/
  84. arm_fir_lattice_f32.o/
  85. arm_fir_lattice_init_f32.o/
  86. arm_fir_lattice_init_q15.o/
  87. arm_fir_lattice_init_q31.o/
  88. arm_fir_lattice_q15.o/
  89. arm_fir_lattice_q31.o/
  90. arm_fir_sparse_f32.o/
  91. arm_fir_sparse_init_f32.o/
  92. arm_fir_sparse_init_q7.o/
  93. arm_fir_sparse_init_q15.o/
  94. arm_fir_sparse_init_q31.o/
  95. arm_fir_sparse_q7.o/
  96. arm_fir_sparse_q15.o/
  97. arm_fir_sparse_q31.o/
  98. arm_iir_lattice_f32.o/
  99. arm_iir_lattice_init_f32.o/
  100. arm_iir_lattice_init_q15.o/
  101. arm_iir_lattice_init_q31.o/
  102. arm_iir_lattice_q15.o/
  103. arm_iir_lattice_q31.o/
  104. arm_lms_init_f32.o/
  105. arm_lms_init_q15.o/
  106. arm_lms_init_q31.o/
  107. arm_lms_norm_f32.o/
  108. arm_lms_norm_init_f32.o/
  109. arm_lms_norm_init_q15.o/
  110. arm_lms_norm_init_q31.o/
  111. arm_lms_norm_q15.o/
  112. arm_lms_norm_q31.o/
  113. arm_mat_add_f32.o/
  114. arm_mat_add_q15.o/
  115. arm_mat_add_q31.o/
  116. arm_mat_init_f32.o/
  117. arm_mat_init_q15.o/
  118. arm_mat_init_q31.o/
  119. arm_mat_inverse_f32.o/
  120. arm_mat_mult_f32.o/
  121. arm_mat_mult_fast_q15.o/
  122. arm_mat_mult_fast_q31.o/
  123. arm_mat_mult_q15.o/
  124. arm_mat_mult_q31.o/
  125. arm_mat_scale_f32.o/
  126. arm_mat_scale_q15.o/
  127. arm_mat_scale_q31.o/
  128. arm_mat_sub_f32.o/
  129. arm_mat_sub_q15.o/
  130. arm_mat_sub_q31.o/
  131. arm_mat_trans_f32.o/
  132. arm_mat_trans_q15.o/
  133. arm_mat_trans_q31.o/
  134. arm_bitreversal.o/
  135. arm_bitreversal2.o/
  136. arm_cfft_radix2_f32.o/
  137. arm_cfft_radix2_init_f32.o/
  138. arm_cfft_radix2_init_q15.o/
  139. arm_cfft_radix2_init_q31.o/
  140. arm_cfft_radix2_q15.o/
  141. arm_cfft_radix2_q31.o/
  142. arm_cfft_radix4_f32.o/
  143. arm_cfft_radix4_init_f32.o/
  144. arm_cfft_radix4_init_q15.o/
  145. arm_cfft_radix4_init_q31.o/
  146. arm_cfft_radix4_q15.o/
  147. arm_cfft_radix4_q31.o/
  148. arm_cfft_radix8_f32.o/
  149. arm_dct4_init_f32.o/
  150. arm_dct4_init_q15.o/
  151. arm_dct4_init_q31.o/
  152. arm_rfft_fast_f32.o/
  153. arm_rfft_fast_init_f32.o/
  154. arm_rfft_init_f32.o/
  155. arm_rfft_init_q15.o/
  156. arm_rfft_init_q31.o/
  157. arm_pid_init_f32.o/
  158. arm_pid_init_q15.o/
  159. arm_pid_init_q31.o/
  160. arm_pid_reset_f32.o/
  161. arm_pid_reset_q15.o/
  162. arm_pid_reset_q31.o/
  163. arm_sin_cos_f32.o/
  164. arm_sin_cos_q31.o/
  165. arm_float_to_q7.o/
  166. arm_float_to_q15.o/
  167. arm_float_to_q31.o/
  168. arm_q7_to_float.o/
  169. arm_q15_to_float.o/
  170. arm_q15_to_q31.o/
  171. arm_q31_to_float.o/
  172. arm_q31_to_q15.o/
  173. arm_common_tables.o/
复制代码

2.工程移植
1、添加文件。
首先,我们在例程工程目录下新建:DSP_LIB 文件夹,存放我们将要添加的文件:arm_cortexM4lf_math.lib 和相关头文件,然后,打开工程,新建 DSP_LIB 分组,并将 arm_cortexM4lf_math.lib 添加到工程里面。

2、 添加头文件包含路径
添加好.lib 文件后,我们要添加头文件包含路径,将第一步拷贝的 Include 文件夹和 DSP_LIB
文件夹,加入头文件包含路径。

3、 添加全局宏定义
最后,为了使用 DSP 库的所有功能,我们还需要添加几个全局宏定义:
1,__FPU_USED
2,__FPU_PRESENT
3,ARM_MATH_CM4
4,__CC_ARM
5,ARM_MATH_MATRIX_CHECK
6,ARM_MATH_ROUNDING

eea0a91185c910db704ae6364241a6e2.png

这里,两个宏之间用“,”隔开。并且,上面的全局宏里面,我们没有添加__FPU_USED,
因为这个宏定义在 Target 选项卡设置 Code Generation 的时候(上一章有介绍),选择了:Use FPU
(如果没有设置 Use FPU,则必须设置!!),故 MDK 会自动添加这个全局宏,因此不需要我们
手动添加了。同时__FPU_PRESENT 全局宏我们 FPU 实验已经讲解,这个宏定义在 stm32f4xx.h
头文件里面已经定义。 这样,在 Define 处 要 输 入 的 所 有 宏 为 :
STM32F40_41xxx,USE_STDPERIPH_DRIVER,ARM_MATH_CM4,__CC_ARM,ARM_MATH_M
ATRIX_CHECK,ARM_MATH_ROUNDING 共 6 个。
至此,STM32F4 的 DSP 库运行环境就搭建完成了。特别注意,为了方便调试,本章例程我们将 MDK 的优化设置为-O0 优化,以得到最好的调试效果。


收藏 评论0 发布时间:2022-7-6 15:05

举报

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