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

【安富莱——DSP教程】第6章 ARM官方DSP库的移植

[复制链接]
baiyongbin2009 发布时间:2015-3-16 11:38
本帖最后由 baiyongbin2009 于 2015-3-16 11:42 编辑
+ T( X  Q) W. Z& z$ w7 u* ~) H  J$ n# I( w
特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接9 F/ C. i% V3 Z: d
第6章 ARM官方DSP库的移植
6 N" A" K8 K/ s- t1 }. N
    本期教程主要讲解ARM官方DSP库的移植和一些相关知识的介绍。
    6.1 DSP库的下载和说明
    6.2 DSP库在MDK上的移植
    6.3 简易DSP库函数验证
    6.4 总结

+ a( M" R- g" \. k% `# V' }& D6.1 DSP库的下载和说明
    下面详细的给大家讲解一下官方DSP库的移植。
6.1.1 DSP库的下载
    DSP库是包含在CMSIS(Cortex Microcontroller Software Interface Standard)里面的,所以下载DSP库也就是下载CMSIS。有两个地方可以下载CMSIS,一个是ARM官网,一个是ST官网。首先说一下如何在ARM官网下载。
l 第一步:登陆ARM官方网址:http://www.arm.com/zh/
l 第二步:注册一个ID号,ARM官网不像ST官网,不注册就可以下载大部分资料,在ARM官网下载资料一定要注册一个ID。
6.1.png
l 第三步:具体注册过程就不多说了,按照提示步骤走即可。注册后可以简单的熟悉一下ARM官网的结构,然后查询我们需要下载的CMSIS,也可以直接在这里检索CMSIS即可。
6.2.png
  n 检索后打开界面如下:
6.3.png
  n 点击进去后,如下就是我们要找的CMSIS
6.4.png
关于ST官方上CMSIS的下载就不在这里赘述了,在STM32-V5开发板用户手册第5章:ST官方固件库介绍有详细的说明。
6.1.2 DSP库的说明
    这里我们以ST官方的F4系列固件库V1.3.0为标准进行移植。打开固件库里面的CMSIS文件,可以看到如下几个文件:
6.5.png
l 其中DSP_Lib中的文件如下:
6.6.png
Examples中的文件如下(这些是ARM官方提供的DSP实例):
6.7.png
Source中的文件如下(这些是DSP库的源文件):
6.8.png
一般情况下不建议将源文件加到工程里面,直接将ARM官方整理好的DSP库文件加入到工程中即可。不过需要查看库文件源码实现的话,可以加入源文件。
l Lib文件夹中就是DSP库文件
    打开后主要有以下三个文件夹:
6.9.png
    其中ARM文件夹中是我们可以加入到MDK中的DSP库,主要有以下几个版本:
6.10.png
    其中最后一个arm_cortexM4lf_math.lib是用于Cortex-M4系列带FPU的DSP库文件(l表示小端格式,b表示大端格式)。

9 W& z0 k2 z1 ?' `/ r' _+ b
收藏 2 评论12 发布时间:2015-3-16 11:38

举报

12个回答
baiyongbin2009 回答时间:2015-3-16 11:39:46
本帖最后由 baiyongbin2009 于 2015-3-16 11:41 编辑
' m2 `8 O- \( S* O( w/ b8 _3 D: m  R+ Z( F5 j4 n
6.2 DSP库在MDK上的移植
    下面我们讲解一下如何在MDK上面移植DSP库,DSP库的移植相对比较容易。这里我们仅介绍如何移植DSP库到MDK上面,官方没有IAR版本的库,所以无法提供移植(可以尝试将源码在IAR中进行编译)。
6.2.1 第一步:建立MDK工程并添加DSP库
    为了方便起见,我们这里不再专门建立一个MDK工程了,直接以V5开发板中的例子:V5-101_按键检测和LED控制例程为模板进行添加即可。打开这个实例并在左侧添加针对Cortex-M4F的DSP库。
6.11.png
6.2.2 第二步:添加头文件路径
    添加DSP所需的头文件路径,这个头文件路径是已经在工程中添加好的,这里只是跟大家强调一下。
6.12.png
6.2.3 第三步:添加宏定义
    添加宏定义如下(这里将STM3240XX换成了STM32F40_41xxx):
6.13.png
6.2.4 第四步:开启FPU
    需要客户通过MDK开启FPU,开启方法如下:
6.14.png
    另外根据ARM官方DSP库的要求,还需要设置宏__FPU_PRESENT为1,不过这个宏已经在文件stm32f4xx.h中设置了(为保险起见,建议把__FPU_PRESENT在第三步的地方也加上,因为部分DSP函数会因为没有这个声明而报错)。
6.15.png
6.2.5 第五步:添加头文件arm_math.h
    用到DSP库函数的相应的文件得添加#include "arm_math.h"的支持。
    按照上面五部操作即可完成DSP库的移植,移植好我们通过几个DSP库中的函数验证下是否正确。
4 k3 o& E8 h9 }, i" H' m- N
baiyongbin2009 回答时间:2015-3-16 11:40:46
6.3 简易DSP库函数验证
    这里我们主要运行下函数arm_abs_f32,arm_abs_q31,arm_abs_q15这三个函数,以此来验证我们移植的DSP库是否正确。
实验目的:
    1. 学习官方DSP库的移植
实验内容:
    1. 按下按键K1, 串口打印函数arm_abs_f32的输出结果
    2. 按下按键K2, 串口打印函数arm_abs_q31的输出结果
    3. 按下按键K3, 串口打印函数arm_abs_q15的输出结果
实验现象:
    通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下(分别按几次K1,K2,K3):
6.16.png
程序设计:
    程序的设计也比较简单,通过按下不同的按键从而打印不同的DSP库函数执行结果,主程序如下:
  1. #include "bsp.h"         /* 底层硬件驱动 */$ x) Q& {7 I4 x3 e+ e0 N
  2. #include "arm_math.h"
    # b4 S& J: q% v  m4 C+ _2 E% q; ]

  3. 7 a4 v# F4 K5 u$ H& C( ~" \) |
  4. /* 定义例程名和例程发布日期 */
    - d: V4 P6 D  q6 G$ d: m0 [* b$ m0 n  K
  5. #define EXAMPLE_NAME        "V5-900_ARM官方DSP库的移植"; N  u0 u; |& t! q% j
  6. #define EXAMPLE_DATE        "2014-08-25"% V5 s9 {9 M2 ~% u
  7. #define DEMO_VER         "1.0"* Z' J" @: W( N- O

  8. . I. M+ }- h( H( t* E
  9. /* 仅允许本文件内调用的函数声明 */& }; ~, R( r  q% g: H/ W: h; P
  10. static void PrintfLogo(void);6 w( R) Z  R: B& b! e! a% i

  11. 9 J. A9 a: u& n( V) `: v
  12. /*) j2 H( d4 G) b# w
  13. *********************************************************************************************************
    * L- s* o2 N8 I2 s7 l
  14. *        函 数 名: main" g8 k4 c* f2 ?# e& t5 F- h
  15. *        功能说明: c程序入口
    5 f+ V0 E- l+ n* ~( M
  16. *        形 参:无, j) U2 _7 H! j4 a
  17. *        返 回 值: 错误代码(无需处理)
    9 ]! s' U% @. G' r2 _- i
  18. *********************************************************************************************************
    1 D- ^7 b/ I; E! G& b7 H
  19. */. _4 H1 j+ Q6 t9 a2 _" v8 i
  20. int main(void)
    6 Q2 B- k* Y# m
  21. {
    9 a7 A/ w7 d% j6 ?( K: D7 y
  22. uint8_t ucKeyCode;         /* 按键代码 */
    : n; \7 T8 \: y! Q, I
  23. float32_t pSrc;
      }% H' Y( K& o# w2 J' k9 |
  24. float32_t pDst;
    / P( J9 B' S# k8 Z) H: O
  25. q31_t pSrc1;$ Q: j& M( }( v0 b" p" H
  26. q31_t pDst1;
    ; s8 z) M; c* h8 ^+ P
  27. q15_t pSrc2;/ H. J. r$ v+ N; d1 I
  28. q15_t pDst2;
    1 L. j/ l# p, Q& z3 B4 e
  29. - G2 ?2 e1 f- b& M  A
  30. bsp_Init();         /* 硬件初始化 */# [* ^8 ~3 {: r; \( t
  31. PrintfLogo();        /* 打印例程信息到串口1 */
    . f7 y9 d0 v. ^  B$ e1 k. V

  32. 3 D+ f9 O4 B2 l
  33. bsp_StartAutoTimer(0, 500);        /* 启动1个500ms的自动重装的定时器 */% t( e! S7 A( M, ^; G2 e0 b5 a

  34. : u. Y  }- l, O0 Z
  35. /* 进入主程序循环体 */+ h* h  W6 ~$ A
  36. while (1)
    3 ^( _. I" E9 E0 y' s
  37. {
      p9 h4 b6 O' k' s
  38. bsp_Idle();         /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */- k% i. [$ A% a2 d* W

  39. - D/ l; o6 Y, h7 f4 f* ]+ s( T
  40. if (bsp_CheckTimer(0))        /* 判断定时器超时时间 */
    ( f4 ]2 z; k- Y) _' S9 P- s5 _
  41. {
    7 }* c, g! e9 |0 I' ~: G
  42. /* 每隔500ms 进来一次 */4 ?! v8 C  S, h
  43. bsp_LedToggle(4);        /* 翻转LED4的状态 */  r8 M5 ~3 z& ^# u1 i7 b8 F
  44. }9 D! g4 f) _  o

  45. 6 I4 v8 Y* ]' f, h- O+ O( N
  46. /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */
    3 r7 N9 r. D' H3 V
  47. ucKeyCode = bsp_GetKey();        /* 读取键值, 无键按下时返回 KEY_NONE = 0 */$ R6 N9 N6 G: n: K
  48. if (ucKeyCode != KEY_NONE)
    # }' ]# K) k5 ]' h
  49. {( o1 Q$ R* l1 b+ f8 M- `% C
  50. switch (ucKeyCode)' Q4 z5 F6 R0 Y  c" T, Y4 ~; _& j
  51. {
    - s  M' ^6 U! V' P+ O+ _
  52. case KEY_DOWN_K1:         /* K1键按下 */
    ( x: Z5 e( `+ X6 ~+ d* |9 m$ U
  53. pSrc -= 1.23f;
    9 L1 N1 X0 @7 p
  54. arm_abs_f32(&pSrc, &pDst, 1);5 V9 U. S6 Y7 k& q( E6 A8 t0 O' u
  55. printf("pDst = %f\r\n", pDst);( [3 A* X( Y/ t, Y7 p  a$ }
  56. break;- K7 |0 ?2 j, q- j3 F$ T
  57. case KEY_DOWN_K2:         /* K2键按下 */# S3 ?% i' l* P9 k+ a2 \3 }* ^
  58. pSrc1 -= 1;
    , Q6 S2 |% D# H% u- p7 L0 _
  59. arm_abs_q31(&pSrc1, &pDst1, 1);
    $ M8 ^8 o( n5 N+ N) P4 D/ D- C
  60. printf("pDst1 = %d\r\n", pDst1);
    7 J! d- ?) A. y7 `
  61. break;6 t5 d  c, V6 m2 n  T5 [- _
  62. + h+ K* [' G* G4 U8 W. {7 M
  63. case KEY_DOWN_K3:         /* K3键按下 */1 i" z% }) t% u$ u- b
  64. pSrc2 -= 1;
    2 h1 x0 J# L' T+ U+ L) m( T
  65. arm_abs_q15(&pSrc2, &pDst2, 1);
    , o, }6 s* u- I6 `6 L* G) F
  66. printf("pDst2 = %d\r\n", pDst2);* Y2 a- Q3 M, I* w4 \3 Y& X
  67. break;+ X$ I) I' ~. G: o! {$ F9 c# c8 h
  68. default:
    4 `- o- M. @7 C8 b! |% Y! H* X$ ~: f
  69. /* 其它的键值不处理 */
    / g9 D, L! q' C- o: G) M, f, }- {
  70. break;
    3 L4 k* T5 g  d3 ?2 ^
  71. }! Z/ ]: q. o" _& [/ J3 s9 n
  72. }
    . U# I% k# N) ^9 {6 J! S3 A
  73. }, ~! L, ]: I( \  u" b; A1 M. Z3 A
  74. }
复制代码
6.4 总结
    本期教程主要跟大家介绍了官方DSP库的移植,相对来说移植也比较简单,建议初学的同学按照这个步骤移植一遍。
0 x1 Y5 R& r% S& b
大浪10010 回答时间:2015-3-16 15:54:55
学习了,,,,,
kqh1120 回答时间:2015-3-16 18:28:07
学习了 3.gif
wamcncn 回答时间:2015-3-16 19:14:41
学习了,支持
wu1169668869 回答时间:2015-3-17 00:11:34
很详细,期待整一个集合贴~
wyxy163@126.com 回答时间:2015-3-17 09:52:11
提示: 作者被禁止或删除 内容自动屏蔽
wyxy163@126.com 回答时间:2015-3-17 09:53:26
提示: 作者被禁止或删除 内容自动屏蔽
w小菜才 回答时间:2015-3-17 10:03:26
学习一下
nizhenyuchina 回答时间:2018-8-26 17:03:05
楼主我想问一下,我该怎么用iar平台来使用FFT库啊,我的芯片是64Kflash16Kram的,但是编译后老是出错解决不了,求解.. r+ S3 g! t) u- M% u' L* H
void FFTPro(void)
* J$ c' p2 D$ P{& t2 P$ D  v  {! E9 a; w
  uint16_t i,j;
1 b* E6 @" l8 D     arm_rfft_instance_q15 S;9 |* u- z( e3 h5 |2 l, h" i
     /* 实数序列FFT长度 */" |$ _0 ?2 p1 Q2 J
   uint32_t fftSize = 32;: X6 ^/ E- s0 B
     /* 正变换 */
6 Q+ a0 E1 J$ C3 v9 l6 e, O   uint32_t ifftFlag = 0;) U9 y9 l7 U5 ~! B, X/ i7 \
     /* 码位倒序 */% P, Q* f& x# [1 ]
   uint32_t doBitReverse = 1;2 c; Q8 J0 t4 D" S: d
   
) z8 K5 [$ ]* H' y4 f8 v0 h+ H     /* 初始化结构体S */
) i: H- @4 ^0 @( J3 d7 R7 o    arm_rfft_init_q15(&S, fftSize, ifftFlag, doBitReverse);! l: b4 L' q* F# K) f# Z! G4 x- ~
    一调用这个函数就会出故障
6 p* E: a! e+ L' ?8 l9 vLinking 6 N/ R6 s( Z* g+ ~' j0 K
Error[Lp011]: section placement failed
- u! g0 w/ y9 C5 ^3 y            unable to allocate space for sections/blocks with a total estimated minimum size of 0x1456c bytes (max align 0x4) in <[0x08000000-0x0800ffff]>  
; m% H; H* `' T(total uncommitted space 0xfe78). * X2 V0 a0 v% E/ {1 X
Error while running Linker 4 x/ s1 H) }; K$ \: X2 \: I
Total number of errors: 1 - U; m4 q% n. p* ~8 k2 O% O
Total number of warnings: 2 , P8 c* v0 r9 J4 y  L

, ~+ b/ D+ n$ B3 y) ?( t
baiyongbin2009 回答时间:2018-9-3 16:43:07
nizhenyuchina 发表于 2018-8-26 17:03/ J! C6 J/ `3 |
楼主我想问一下,我该怎么用iar平台来使用FFT库啊,我的芯片是64Kflash16Kram的,但是编译后老是出错解决不 ...
" q1 z) g2 t$ u% T
你的Flash超了。
shidalin123 回答时间:2019-12-14 09:24:14
请问一下 STM32 F103也是按照这个方法添加使用吗

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版