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

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

[复制链接]
baiyongbin2009 发布时间:2015-3-16 11:38
本帖最后由 baiyongbin2009 于 2015-3-16 11:42 编辑 ( @. ^$ z: D( s" r3 s* C, v% P

3 [. D$ m: [2 o* p$ @3 }2 o/ l0 y特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接- L* _  P( g1 N# h3 `- P& X
第6章 ARM官方DSP库的移植

- N2 P" R: m! ?0 V9 b5 o6 }# E9 H
    本期教程主要讲解ARM官方DSP库的移植和一些相关知识的介绍。
    6.1 DSP库的下载和说明
    6.2 DSP库在MDK上的移植
    6.3 简易DSP库函数验证
    6.4 总结
& p2 p8 q3 n7 }* l
6.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表示大端格式)。

7 n2 v9 z7 e0 I- z$ x, i
收藏 2 评论12 发布时间:2015-3-16 11:38

举报

12个回答
baiyongbin2009 回答时间:2015-3-16 11:39:46
本帖最后由 baiyongbin2009 于 2015-3-16 11:41 编辑
; X4 J" ~. e9 B: q1 ?8 N7 _* Q8 V0 O' v# |
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 V, b, j2 }. X6 a& ^* g8 k  `; ^
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"         /* 底层硬件驱动 */
    * y/ X5 h5 ?7 ^0 |8 ~
  2. #include "arm_math.h"
    8 K2 F* E  d5 l
  3.   z: n, ?' V( B* Z7 Y0 a
  4. /* 定义例程名和例程发布日期 */6 c- O/ L& ~6 e, z' _" Z: T
  5. #define EXAMPLE_NAME        "V5-900_ARM官方DSP库的移植"
      _# S( P; e) w4 y- \9 g
  6. #define EXAMPLE_DATE        "2014-08-25"3 S8 L5 t+ Y; ~0 i" }1 S( ?
  7. #define DEMO_VER         "1.0"
    / Z* U. b. e  P  P9 \+ C5 T6 B

  8. 6 B, F1 J, H0 |3 l' N
  9. /* 仅允许本文件内调用的函数声明 */- I8 T" f$ o, C$ n+ B
  10. static void PrintfLogo(void);* ~: s1 x2 @9 ~8 ]5 o3 v3 K# A; m; z7 D
  11. & J) f7 F) L2 {( i% f
  12. /*: m! E. t: V1 r, m
  13. *********************************************************************************************************
    ( x" y- k& I+ D: T0 \- A! L
  14. *        函 数 名: main. B$ f/ ?0 M( `+ f
  15. *        功能说明: c程序入口
    - x% P7 y& N% u( o0 H4 f
  16. *        形 参:无
    2 T% T. J; t3 o! O, O& i& P& c! Z
  17. *        返 回 值: 错误代码(无需处理)* r2 l: N, O! ~' F: n' O4 R
  18. *********************************************************************************************************1 r+ g1 i2 A; _3 X
  19. */
    2 c  H5 y9 {. X* b; L
  20. int main(void)
    9 ]; I! p8 e0 w% l+ z. B9 S
  21. {; l2 J' f# d& g: e) P+ Q
  22. uint8_t ucKeyCode;         /* 按键代码 */
    " G* g+ n8 H# F) e% m
  23. float32_t pSrc;5 N# U6 H* K# m1 j; D# I
  24. float32_t pDst;
      v( e3 U$ J9 l# }$ Z: n/ g' \
  25. q31_t pSrc1;) g8 b. u( g1 v# v4 _2 |  L# y- l( s. W
  26. q31_t pDst1;
    # }! j" U  a1 r/ m) `6 A
  27. q15_t pSrc2;
    % O1 P' _$ P' Y$ x' D3 V) ~
  28. q15_t pDst2;0 \# g$ {2 T) r9 @
  29. - F7 l2 x" u! o9 ~& D7 o
  30. bsp_Init();         /* 硬件初始化 */3 b# p& @/ m8 h
  31. PrintfLogo();        /* 打印例程信息到串口1 */
    9 N, U. u( `% A3 ?) F; M

  32. 3 E4 s3 {8 N6 H8 k
  33. bsp_StartAutoTimer(0, 500);        /* 启动1个500ms的自动重装的定时器 */0 o; K+ W' s# R8 s4 d
  34. 7 m) z! U' L" V2 c- l/ v9 @2 X9 q
  35. /* 进入主程序循环体 */
    3 G0 D& U: b) E+ h0 g
  36. while (1)
    - g: _5 U6 P' c/ G
  37. {3 J/ @" \" ~1 Z
  38. bsp_Idle();         /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */
    ; o) h! ~4 N: h3 Z  k  V. \, Q% U

  39. % ?6 ?  u( W9 g
  40. if (bsp_CheckTimer(0))        /* 判断定时器超时时间 */& m% |3 ~) I6 k4 n9 B7 e
  41. {
    ! X9 I& V) q1 e- A) C& ~! d6 w- _
  42. /* 每隔500ms 进来一次 */
    3 D* R' ]' `1 s" d9 z/ f  `
  43. bsp_LedToggle(4);        /* 翻转LED4的状态 */
    - w, K9 w7 H! Y4 q1 k& ]
  44. }
    0 F7 E! F6 h9 ^! T
  45.   b  P8 z* E% y( @' g, o1 E
  46. /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */
    - x( ^: @0 S# t4 `
  47. ucKeyCode = bsp_GetKey();        /* 读取键值, 无键按下时返回 KEY_NONE = 0 */: B6 @6 p6 H, t0 J; \2 F
  48. if (ucKeyCode != KEY_NONE)% {. l% p0 j& t' {8 V  ?$ d
  49. {: H8 N* y. W1 c5 K: k5 E3 G
  50. switch (ucKeyCode)  z4 I' S+ {$ }
  51. {
    + p$ I% A" X' z% U
  52. case KEY_DOWN_K1:         /* K1键按下 */
    4 a. C3 u* j! n- p' V# x
  53. pSrc -= 1.23f;: t  d" E' ^& n) y( g4 V1 ]
  54. arm_abs_f32(&pSrc, &pDst, 1);
    ! A0 g0 n6 s* W! {/ d
  55. printf("pDst = %f\r\n", pDst);8 S) X. F* v! M. L
  56. break;
    - q. C" N8 b1 {' U" o: A
  57. case KEY_DOWN_K2:         /* K2键按下 */. {1 v( U; e- `* F& l
  58. pSrc1 -= 1;1 m# G7 ]* H, J8 {  t
  59. arm_abs_q31(&pSrc1, &pDst1, 1);
    ( ~3 s- n& s: c
  60. printf("pDst1 = %d\r\n", pDst1);6 ^; n, t" D$ b) D2 `3 D1 m  H
  61. break;4 Y6 k9 b  w- r

  62. ! O: ~! d3 X$ C8 s& M- |% a% w3 w
  63. case KEY_DOWN_K3:         /* K3键按下 */7 c- U1 Y2 V- t7 L$ Q: s
  64. pSrc2 -= 1;: O" L! q. J' Q& s, c$ u$ Y1 X
  65. arm_abs_q15(&pSrc2, &pDst2, 1);! }! N. _$ s$ n
  66. printf("pDst2 = %d\r\n", pDst2);; U' K; _9 ?0 K' A! I, V2 {: q# I
  67. break;0 C/ l5 I4 x7 s, b
  68. default:) ]  c2 E' N( |9 h! x( a3 E* a& ~
  69. /* 其它的键值不处理 */  `) f1 L  v* ^
  70. break;( |+ \8 v' l# |- e9 \+ Q0 W/ E
  71. }# h9 o1 ]' R4 R' i5 d3 h) U
  72. }2 n+ g' U6 R. _, S& p+ a4 G- [
  73. }" {! ?5 H' A+ C) U( S" M
  74. }
复制代码
6.4 总结
    本期教程主要跟大家介绍了官方DSP库的移植,相对来说移植也比较简单,建议初学的同学按照这个步骤移植一遍。
' K# j8 u* Q9 g5 a
大浪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的,但是编译后老是出错解决不了,求解.& c! W6 @! j* Y% Z
void FFTPro(void), r/ T& N! d9 K4 }2 }! D" r3 K: K
{
0 J8 ^1 C" d8 T2 {  |" ?  uint16_t i,j;3 U+ }5 o5 M9 g2 w1 @$ p. q, F
     arm_rfft_instance_q15 S;
0 `% z- g2 {1 A% B: _* U1 R     /* 实数序列FFT长度 */
7 w- E5 ^5 j4 m9 M9 R3 O# c! y   uint32_t fftSize = 32;3 ]/ b1 n) s; y* u. O% ^, ]% \% B' r
     /* 正变换 */
2 R) k1 F6 ^# U& |& ~   uint32_t ifftFlag = 0;
8 _3 ~  l6 K* k     /* 码位倒序 */# P. E* D8 O! F2 L
   uint32_t doBitReverse = 1;5 s4 R' \6 ?' Q( \& A7 N
    8 W6 T1 t# h+ t! F* X
     /* 初始化结构体S */( x, S0 _; x/ p3 ?
    arm_rfft_init_q15(&S, fftSize, ifftFlag, doBitReverse);
9 R% y; K" ]' r# ~, E' ^    一调用这个函数就会出故障1 M2 T. u/ d4 N8 r
Linking ( K# T: b8 I/ [- n* O: P) R+ p7 L+ N
Error[Lp011]: section placement failed ' E* R! m( T) n# Y% q' D/ y
            unable to allocate space for sections/blocks with a total estimated minimum size of 0x1456c bytes (max align 0x4) in <[0x08000000-0x0800ffff]>  - D- R# ]/ k+ Y# W- f3 t
(total uncommitted space 0xfe78).
' P6 e, R* P! D& S3 MError while running Linker
" v/ I8 p* \! a$ v: _: CTotal number of errors: 1
. T+ u) J' q- m, zTotal number of warnings: 2
0 h. I5 Q1 I7 s/ F7 k% ?# f$ p+ Z: e( {  X; r. E9 X6 j1 D
baiyongbin2009 回答时间:2018-9-3 16:43:07
nizhenyuchina 发表于 2018-8-26 17:03
; y/ P+ X# _% l' q' I  f楼主我想问一下,我该怎么用iar平台来使用FFT库啊,我的芯片是64Kflash16Kram的,但是编译后老是出错解决不 ...
2 m/ _- K$ |. x
你的Flash超了。
shidalin123 回答时间:2019-12-14 09:24:14
请问一下 STM32 F103也是按照这个方法添加使用吗

所属标签

相似分享

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