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

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

[复制链接]
baiyongbin2009 发布时间:2015-3-16 11:38
本帖最后由 baiyongbin2009 于 2015-3-16 11:42 编辑
9 l4 J" X) i2 ]4 y+ i' S9 ]: j5 p6 U; w! k" @+ W2 b
特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接
; H' P& N! b" w$ }1 d5 Y
第6章 ARM官方DSP库的移植

3 i5 q# k) Z$ G
    本期教程主要讲解ARM官方DSP库的移植和一些相关知识的介绍。
    6.1 DSP库的下载和说明
    6.2 DSP库在MDK上的移植
    6.3 简易DSP库函数验证
    6.4 总结

; P) u" T9 l) e1 j/ F- W6.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表示大端格式)。
  G! U) O6 @( k) Q" g) t, T
收藏 2 评论12 发布时间:2015-3-16 11:38

举报

12个回答
baiyongbin2009 回答时间:2015-3-16 11:39:46
本帖最后由 baiyongbin2009 于 2015-3-16 11:41 编辑
/ i6 H) t; b: F2 h9 i% e! D2 J$ ?% c' F8 ?
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库中的函数验证下是否正确。
& k9 E- S; V$ e) d$ I3 z. Z
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"         /* 底层硬件驱动 */  [/ x7 t! _0 \% N/ Q
  2. #include "arm_math.h"# m# _  G  S/ L8 {8 {3 A' m5 Y  F! p

  3. / g/ A) T8 e. u* h0 {9 c0 Z
  4. /* 定义例程名和例程发布日期 */9 H0 F- x$ z' J  M0 ]  b
  5. #define EXAMPLE_NAME        "V5-900_ARM官方DSP库的移植"
    # i$ T2 D' q; c" S4 p
  6. #define EXAMPLE_DATE        "2014-08-25"# f# X5 b; \) s6 u0 @1 ~; J
  7. #define DEMO_VER         "1.0"
    1 o) w5 H6 Y1 F

  8. $ h- p+ v+ r8 V9 ]1 V% Z1 V3 ~! V
  9. /* 仅允许本文件内调用的函数声明 */
    2 A% T, l( ^$ q
  10. static void PrintfLogo(void);
    1 l" U. O. D" C) |% q2 O+ }

  11. 1 @, M7 C: X) f$ w' v
  12. /*# I/ `8 I: \' F5 j$ Z5 \
  13. *********************************************************************************************************
    ; e/ A2 H) ?: w0 A* r9 M
  14. *        函 数 名: main
    - E# ~1 a: X5 ~3 |" F
  15. *        功能说明: c程序入口0 C8 p5 Y4 ^2 L5 b1 z( K
  16. *        形 参:无
    ! Z+ b5 M' P* @1 O% b+ e2 g
  17. *        返 回 值: 错误代码(无需处理)
    9 F& B) x1 r0 Y, e
  18. *********************************************************************************************************
    ' R' }! ]  ~% I* i( p
  19. */
    . N; j& h+ y0 v
  20. int main(void)
    ' F' ^- g$ q1 _( W7 s7 l) G  b0 ?
  21. {+ [: u- s1 w( F, u' @$ n# A
  22. uint8_t ucKeyCode;         /* 按键代码 */0 [, {2 E5 i: x1 d7 _% u
  23. float32_t pSrc;
    6 q$ t+ |1 Q/ S" M, e) b
  24. float32_t pDst;* B* u2 H% _; H8 e% k
  25. q31_t pSrc1;
    7 z9 _  e9 ?! v; x+ K
  26. q31_t pDst1;
    / H0 Q2 T9 f' n* n4 v2 R) K0 W2 ~& k
  27. q15_t pSrc2;
    1 x8 Z! z3 ]: Y& m0 O  n; }% _, W3 n
  28. q15_t pDst2;, a! P9 l0 H9 h8 d) c
  29. * i2 J3 k( F( i4 ]' d; b4 |  ]
  30. bsp_Init();         /* 硬件初始化 */" k9 @/ l2 F' ^; ]0 G
  31. PrintfLogo();        /* 打印例程信息到串口1 */
    * ?; w8 S# y# {0 C/ ^
  32. * f( s  Q' A$ f( E
  33. bsp_StartAutoTimer(0, 500);        /* 启动1个500ms的自动重装的定时器 */
    6 g% {$ T  _. |" P+ p

  34. - R& [/ q; R3 `* ?& E
  35. /* 进入主程序循环体 */
    3 Q$ ]. m% l# d! ?9 w  J) [
  36. while (1): w  D6 t5 ?. f
  37. {
    8 j! p( l, C( p# [+ e) P$ n5 n
  38. bsp_Idle();         /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */* Z; x4 M% Z3 Q, k$ P& p  p

  39. ' y% ]) D3 [7 Q3 r
  40. if (bsp_CheckTimer(0))        /* 判断定时器超时时间 */6 `; i7 S/ \: r5 d
  41. {
    4 Q7 S6 l: [9 o. P. o
  42. /* 每隔500ms 进来一次 */
    1 t: V- C& s0 ~3 t1 ^/ |3 k2 x
  43. bsp_LedToggle(4);        /* 翻转LED4的状态 *// E4 \, }2 t9 d2 Q% _; U9 Q: {
  44. }
    $ K5 N$ I3 i9 _! {' O7 N' ?

  45. ' r: e1 \% B  S4 y. r, \
  46. /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */4 P5 @4 J4 t# ]/ a% _9 w3 _
  47. ucKeyCode = bsp_GetKey();        /* 读取键值, 无键按下时返回 KEY_NONE = 0 */0 G+ A. m& e7 _, X' z0 B4 r# s3 p
  48. if (ucKeyCode != KEY_NONE)
    ' ?9 H& a6 ~% R. L) u$ v
  49. {4 E  p# w, g! L% W
  50. switch (ucKeyCode)
    4 x. l# m7 g4 Y1 z. K) u
  51. {% ^/ j, h& m$ u, W
  52. case KEY_DOWN_K1:         /* K1键按下 */9 t( Y, y, ^3 P5 a
  53. pSrc -= 1.23f;
    " X* K5 [2 z3 b+ v- u/ s
  54. arm_abs_f32(&pSrc, &pDst, 1);! Z5 X- a8 D. N( X2 }3 R. F2 m
  55. printf("pDst = %f\r\n", pDst);
    $ S& ]+ f, B1 N0 l
  56. break;
    1 i# B! x+ [/ X0 P& m
  57. case KEY_DOWN_K2:         /* K2键按下 *// F+ V8 m. W1 I
  58. pSrc1 -= 1;
    ' j' D- H  K5 u0 g3 o
  59. arm_abs_q31(&pSrc1, &pDst1, 1);8 R: |- w4 {6 [
  60. printf("pDst1 = %d\r\n", pDst1);( ]8 e3 r9 T/ F/ S/ ^8 s* X1 g
  61. break;
    # y$ p: \) [8 O+ h

  62. % l7 N/ Y- h  ?, K; H2 Z/ }! h* w0 X
  63. case KEY_DOWN_K3:         /* K3键按下 */
    6 W- V/ F9 z% f" i
  64. pSrc2 -= 1;
    7 |1 f3 j/ p1 |+ y' c2 c7 J
  65. arm_abs_q15(&pSrc2, &pDst2, 1);- \3 p, J  r% A& h
  66. printf("pDst2 = %d\r\n", pDst2);# L! k: w0 c$ C+ F/ H, x" F
  67. break;
    * ?9 M' c" M( t2 L8 H- O
  68. default:& L8 }- q" @8 s: L0 C& L  `
  69. /* 其它的键值不处理 */: @2 C: c! F) A5 L1 C: B
  70. break;
    2 I1 ~7 F( t# ?
  71. }
    + R8 O+ |& c; r+ }3 {9 S8 N
  72. }
    3 G4 G, k# i' ~2 M# q6 K
  73. }
    3 G, B6 L6 h% o0 z; H9 X8 q! o
  74. }
复制代码
6.4 总结
    本期教程主要跟大家介绍了官方DSP库的移植,相对来说移植也比较简单,建议初学的同学按照这个步骤移植一遍。
/ T6 \: r  s! `! N. @. @
大浪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的,但是编译后老是出错解决不了,求解.1 [! h$ K' Z% ~
void FFTPro(void)% l0 K. Y8 Y! F; k! v5 y( h
{3 D# ^6 \6 A8 t  ?
  uint16_t i,j;6 _% a8 ^2 c$ `0 h
     arm_rfft_instance_q15 S;4 Q9 o. s/ h2 R2 ?/ L8 G8 I
     /* 实数序列FFT长度 */
% w0 K+ W  F1 w+ p1 S' g" Y$ C   uint32_t fftSize = 32;4 `$ e- h$ v! e  [- B* d9 P
     /* 正变换 */. `( i- ?: |$ J, \" h2 X$ t
   uint32_t ifftFlag = 0;
) c: C: q4 R8 P8 S  F2 D5 V# G$ I     /* 码位倒序 */9 ?" D1 ~; c& o: G9 _4 t1 u1 N) Q) Q" f
   uint32_t doBitReverse = 1;
3 `1 M+ y/ P* Y; N# z- ?   
+ J# R" t* G$ E8 j5 d' _# T" }     /* 初始化结构体S */
, L/ K  E& t) Y2 Q- C+ Q" B) Z' Q    arm_rfft_init_q15(&S, fftSize, ifftFlag, doBitReverse);7 W0 l  R7 J5 `# `( H1 C" }
    一调用这个函数就会出故障
+ L4 N1 ~1 v, rLinking
8 n. l! W( @; l+ V) d. ~2 \Error[Lp011]: section placement failed
3 h! ?. |9 M. A5 i            unable to allocate space for sections/blocks with a total estimated minimum size of 0x1456c bytes (max align 0x4) in <[0x08000000-0x0800ffff]>  
0 w1 y, c% n* P% P2 X) z(total uncommitted space 0xfe78).
2 W5 R) u, z: bError while running Linker
( c/ U# C+ {1 e$ WTotal number of errors: 1 , Y. l. \# m7 n" _! ?+ b
Total number of warnings: 2 - I# @2 @. ~2 K
. J, \& y4 I. y, Z& g' \2 r( I5 k9 U
baiyongbin2009 回答时间:2018-9-3 16:43:07
nizhenyuchina 发表于 2018-8-26 17:03
; ?& w& ^- ]% q. Z( I6 J+ R楼主我想问一下,我该怎么用iar平台来使用FFT库啊,我的芯片是64Kflash16Kram的,但是编译后老是出错解决不 ...
; C6 j" L6 ?+ y! \; c
你的Flash超了。
shidalin123 回答时间:2019-12-14 09:24:14
请问一下 STM32 F103也是按照这个方法添加使用吗

所属标签

相似分享

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