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

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

[复制链接]
baiyongbin2009 发布时间:2015-3-16 11:38
本帖最后由 baiyongbin2009 于 2015-3-16 11:42 编辑 ' ]2 x+ M* i, X, o7 x
% S* q( Z8 b( C/ z8 Z3 o: Z/ s5 X
特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接* r; [- Q6 N# }
第6章 ARM官方DSP库的移植

% P6 B* ~  y; }2 b* _4 i
    本期教程主要讲解ARM官方DSP库的移植和一些相关知识的介绍。
    6.1 DSP库的下载和说明
    6.2 DSP库在MDK上的移植
    6.3 简易DSP库函数验证
    6.4 总结

. O" V  n7 n( m% @; o# o6.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表示大端格式)。
* `/ t- i$ u  E& o3 y
收藏 2 评论12 发布时间:2015-3-16 11:38

举报

12个回答
baiyongbin2009 回答时间:2015-3-16 11:39:46
本帖最后由 baiyongbin2009 于 2015-3-16 11:41 编辑 4 A$ ~+ x; c4 d9 U" \; W: e

) B7 g# {3 Q+ g9 q6 ~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库中的函数验证下是否正确。

3 g7 N6 h" `  Z. J, w3 R9 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"         /* 底层硬件驱动 */* J9 C/ F" c* Q8 ]7 Y7 L7 v
  2. #include "arm_math.h"
    3 F" R8 N5 [; H! W
  3. & v* `9 i* T  Q/ d$ e) W! d5 v, \) O
  4. /* 定义例程名和例程发布日期 */- B6 i; ~' f3 V1 M* D" f* \. h
  5. #define EXAMPLE_NAME        "V5-900_ARM官方DSP库的移植"% N; l+ F6 o) P4 m$ p
  6. #define EXAMPLE_DATE        "2014-08-25"
    ) ]# @+ m! f; q
  7. #define DEMO_VER         "1.0"3 F' k7 M/ [2 D! X

  8. # b4 ]. v9 |" M+ M. E! ]
  9. /* 仅允许本文件内调用的函数声明 */8 a5 i- M( y% F  ^, A- {
  10. static void PrintfLogo(void);
    4 r, W* k2 m) Z/ G' v
  11. # r2 K( W# G1 O8 R7 k! C
  12. /*
    7 ?) V/ I* m3 t& c7 E  H
  13. *********************************************************************************************************
    0 W* `( T- q3 K. z
  14. *        函 数 名: main% q5 x. t. A6 j9 i
  15. *        功能说明: c程序入口
    5 {# H! r' l5 ?9 k6 W* h
  16. *        形 参:无+ H, n0 W) i! m( m  E
  17. *        返 回 值: 错误代码(无需处理)
    ; n( D; P1 i: O' J4 ?8 U  F
  18. *********************************************************************************************************
    + s1 ^- s/ e/ j. h4 @- V: q/ n; l
  19. */
    - f* q- H7 _7 G/ Y
  20. int main(void)
    6 v: [' s4 [0 p" F
  21. {
    5 X$ t, X; c* t! s) U- X/ H8 O
  22. uint8_t ucKeyCode;         /* 按键代码 */
    " q+ U4 s" h  }
  23. float32_t pSrc;+ u" h: N/ U- }+ Q9 T
  24. float32_t pDst;) D! }$ E& D+ @( A, `  s- I& {
  25. q31_t pSrc1;
    4 ]* C8 q( t$ r8 Y4 h
  26. q31_t pDst1;0 v9 D# g: ~+ U: \" a
  27. q15_t pSrc2;, l, m/ f# |9 b' G. O
  28. q15_t pDst2;
    ! r( L7 M& J" n7 N7 J
  29. 3 B3 o# v; J5 o( X3 L
  30. bsp_Init();         /* 硬件初始化 */
    8 S, A5 K' C. |- f
  31. PrintfLogo();        /* 打印例程信息到串口1 */
    3 P) T1 ~2 }/ o. d+ Y5 w( k9 y7 p! U0 P

  32. 2 n& ~# S, H2 B: g& f
  33. bsp_StartAutoTimer(0, 500);        /* 启动1个500ms的自动重装的定时器 */) M. Y% s  A/ m7 y: |, M; [* b
  34. 4 `' V9 X/ g0 R6 w
  35. /* 进入主程序循环体 */, S; S2 e/ G6 T
  36. while (1)
    9 S8 x7 I8 d  [+ o6 n
  37. {; j2 h+ }6 i3 @( y" O
  38. bsp_Idle();         /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */) J( o( z, o- B- a+ @

  39. / e1 E7 v; q3 E! v
  40. if (bsp_CheckTimer(0))        /* 判断定时器超时时间 */
    8 f. J* W0 q! f" I, G9 A
  41. {
    & ^5 F8 _% y& J$ e2 o
  42. /* 每隔500ms 进来一次 */5 J9 g, t/ j: A! Z) Y' q
  43. bsp_LedToggle(4);        /* 翻转LED4的状态 */
    9 W7 E( j0 {  N. j: c% J
  44. }
    ( W# g% H3 x/ Z
  45.   |, W" g8 T4 k- C. ?, c7 ?
  46. /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */- H9 ?! F) H; J. d' \1 d+ F
  47. ucKeyCode = bsp_GetKey();        /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
    , S4 g5 o$ A; h1 F6 `- J
  48. if (ucKeyCode != KEY_NONE)
    0 K! D  s3 ]3 Q- f
  49. {
      B# d: {  m: `8 z
  50. switch (ucKeyCode): G# ?* Y9 @( i3 M
  51. {' y! q3 y( b. D9 Y
  52. case KEY_DOWN_K1:         /* K1键按下 */8 q9 M5 ^: O4 _
  53. pSrc -= 1.23f;
    ' D. Z  p$ |0 Q2 j- y
  54. arm_abs_f32(&pSrc, &pDst, 1);+ w& Q% v; |' f* ^: A9 M9 n
  55. printf("pDst = %f\r\n", pDst);
    ' i- T7 ~2 o5 P  T) z3 k+ i* A
  56. break;
    $ S2 e* g& W3 T1 v; ]3 b
  57. case KEY_DOWN_K2:         /* K2键按下 */8 N1 B5 v4 f' `- i2 i
  58. pSrc1 -= 1;/ A$ ?! t2 |- D
  59. arm_abs_q31(&pSrc1, &pDst1, 1);1 o- J7 v1 D( s+ Z- z# z
  60. printf("pDst1 = %d\r\n", pDst1);
    4 W: L" Z& l7 M( m
  61. break;
    8 ?* ?4 X* B3 [7 B
  62. ! J" U: g, J) A+ H- z5 Y
  63. case KEY_DOWN_K3:         /* K3键按下 */
    9 B7 Y8 j' A4 K: S) b1 u; K9 q
  64. pSrc2 -= 1;: V) a4 s* }5 d  b" _; r" U; E
  65. arm_abs_q15(&pSrc2, &pDst2, 1);* |* z9 d8 U/ T! \
  66. printf("pDst2 = %d\r\n", pDst2);- Q2 X0 C8 ^6 q2 u& l
  67. break;
    : t6 B  j) X; R: n
  68. default:
    . e, d3 H; g1 B" l
  69. /* 其它的键值不处理 */1 L( Z+ s) B0 ?+ S
  70. break;
    ; t' `9 ?6 D; g* b9 a3 v
  71. }
    6 O3 B  p, ^! H: _) q
  72. }; u1 i, W: @6 k
  73. }
    1 [( g/ ^8 d8 g- E
  74. }
复制代码
6.4 总结
    本期教程主要跟大家介绍了官方DSP库的移植,相对来说移植也比较简单,建议初学的同学按照这个步骤移植一遍。

, p4 Q/ ?2 }. E1 U' C6 U% F
大浪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的,但是编译后老是出错解决不了,求解.% f6 r2 A6 V) z4 Z  t5 Y; O
void FFTPro(void)* A, r  \9 m7 P" M" u3 s
{
9 I8 i4 H+ o: ?% n4 l* l# d, U  uint16_t i,j;) B% t3 b) k: |& Q4 r; ]( P9 H6 B
     arm_rfft_instance_q15 S;' E% D# H: o4 D9 B2 z9 Y
     /* 实数序列FFT长度 */
  I# S4 u+ N4 M+ E5 g- w( J   uint32_t fftSize = 32;4 l" e5 V) F' u# z' b
     /* 正变换 */3 Z( ~! x* Z+ U' y' E
   uint32_t ifftFlag = 0;, d9 `! s' I4 k1 C/ F
     /* 码位倒序 */
5 H6 u! V6 b: s. a& C   uint32_t doBitReverse = 1;
2 Q+ u( K5 \3 b+ @$ F    " Z2 u7 N8 {8 ]
     /* 初始化结构体S */
6 z, K9 c* k" l& V8 R    arm_rfft_init_q15(&S, fftSize, ifftFlag, doBitReverse);
2 y  A8 L2 a! B% I! v$ q    一调用这个函数就会出故障
. P, W' {/ ^0 ?  E! V0 o. B! u) pLinking , X& h  ^4 x, e5 _
Error[Lp011]: section placement failed
8 g! w( V9 P; |; m: ~8 @, Y            unable to allocate space for sections/blocks with a total estimated minimum size of 0x1456c bytes (max align 0x4) in <[0x08000000-0x0800ffff]>  , i8 L% E9 J3 _" K6 f! Q) \9 _+ J
(total uncommitted space 0xfe78).
) I0 i9 ^- n3 B8 k1 Y6 y% vError while running Linker
3 j- A1 A: R3 J: F% zTotal number of errors: 1 ! B+ _+ `+ W* n! z
Total number of warnings: 2
# J4 T! k: @7 L: ]- ]9 E" m
4 F( r$ W% [5 n) b( i- i
baiyongbin2009 回答时间:2018-9-3 16:43:07
nizhenyuchina 发表于 2018-8-26 17:03
2 ^3 O+ w1 v7 K% o) a( f# V; }# ]! q2 q楼主我想问一下,我该怎么用iar平台来使用FFT库啊,我的芯片是64Kflash16Kram的,但是编译后老是出错解决不 ...

& a- V- H. h$ U你的Flash超了。
shidalin123 回答时间:2019-12-14 09:24:14
请问一下 STM32 F103也是按照这个方法添加使用吗

所属标签

相似分享

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