请选择 进入手机版 | 继续访问电脑版
搜索
查看: 8909|回复: 12

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

[复制链接]

该用户从未签到

296

主题

930

帖子

29

蝴蝶豆

金牌会员

最后登录
2020-11-20
发表于 2015-3-16 11:38:28 | 显示全部楼层 |阅读模式
本帖最后由 baiyongbin2009 于 2015-3-16 11:42 编辑

特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接
第6章 ARM官方DSP库的移植

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

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表示大端格式)。

回复

使用道具 举报

该用户从未签到

296

主题

930

帖子

29

蝴蝶豆

金牌会员

最后登录
2020-11-20
 楼主| 发表于 2015-3-16 11:39:46 | 显示全部楼层
本帖最后由 baiyongbin2009 于 2015-3-16 11:41 编辑

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库中的函数验证下是否正确。

回复 支持 1 反对 0

使用道具 举报

该用户从未签到

296

主题

930

帖子

29

蝴蝶豆

金牌会员

最后登录
2020-11-20
 楼主| 发表于 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"         /* 底层硬件驱动 */
  2. #include "arm_math.h"

  3. /* 定义例程名和例程发布日期 */
  4. #define EXAMPLE_NAME        "V5-900_ARM官方DSP库的移植"
  5. #define EXAMPLE_DATE        "2014-08-25"
  6. #define DEMO_VER         "1.0"

  7. /* 仅允许本文件内调用的函数声明 */
  8. static void PrintfLogo(void);

  9. /*
  10. *********************************************************************************************************
  11. *        函 数 名: main
  12. *        功能说明: c程序入口
  13. *        形 参:无
  14. *        返 回 值: 错误代码(无需处理)
  15. *********************************************************************************************************
  16. */
  17. int main(void)
  18. {
  19. uint8_t ucKeyCode;         /* 按键代码 */
  20. float32_t pSrc;
  21. float32_t pDst;
  22. q31_t pSrc1;
  23. q31_t pDst1;
  24. q15_t pSrc2;
  25. q15_t pDst2;

  26. bsp_Init();         /* 硬件初始化 */
  27. PrintfLogo();        /* 打印例程信息到串口1 */

  28. bsp_StartAutoTimer(0, 500);        /* 启动1个500ms的自动重装的定时器 */

  29. /* 进入主程序循环体 */
  30. while (1)
  31. {
  32. bsp_Idle();         /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */

  33. if (bsp_CheckTimer(0))        /* 判断定时器超时时间 */
  34. {
  35. /* 每隔500ms 进来一次 */
  36. bsp_LedToggle(4);        /* 翻转LED4的状态 */
  37. }

  38. /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */
  39. ucKeyCode = bsp_GetKey();        /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
  40. if (ucKeyCode != KEY_NONE)
  41. {
  42. switch (ucKeyCode)
  43. {
  44. case KEY_DOWN_K1:         /* K1键按下 */
  45. pSrc -= 1.23f;
  46. arm_abs_f32(&pSrc, &pDst, 1);
  47. printf("pDst = %f\r\n", pDst);
  48. break;
  49. case KEY_DOWN_K2:         /* K2键按下 */
  50. pSrc1 -= 1;
  51. arm_abs_q31(&pSrc1, &pDst1, 1);
  52. printf("pDst1 = %d\r\n", pDst1);
  53. break;

  54. case KEY_DOWN_K3:         /* K3键按下 */
  55. pSrc2 -= 1;
  56. arm_abs_q15(&pSrc2, &pDst2, 1);
  57. printf("pDst2 = %d\r\n", pDst2);
  58. break;
  59. default:
  60. /* 其它的键值不处理 */
  61. break;
  62. }
  63. }
  64. }
  65. }
复制代码
6.4 总结
    本期教程主要跟大家介绍了官方DSP库的移植,相对来说移植也比较简单,建议初学的同学按照这个步骤移植一遍。

回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

84

帖子

0

蝴蝶豆

中级会员

最后登录
2018-5-23
发表于 2015-3-16 15:54:55 | 显示全部楼层
学习了,,,,,
回复

使用道具 举报

该用户从未签到

35

主题

639

帖子

0

蝴蝶豆

金牌会员

最后登录
2021-8-7
发表于 2015-3-16 18:28:07 | 显示全部楼层
学习了 3.gif
回复 支持 反对

使用道具 举报

该用户从未签到

93

主题

2542

帖子

4

蝴蝶豆

论坛元老

最后登录
2021-5-9
发表于 2015-3-16 19:14:41 | 显示全部楼层
学习了,支持
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

1080

帖子

2

蝴蝶豆

金牌会员

最后登录
2019-1-10
发表于 2015-3-17 00:11:34 | 显示全部楼层
很详细,期待整一个集合贴~
回复 支持 反对

使用道具 举报

该用户从未签到

53

主题

3438

帖子

61

蝴蝶豆

论坛元老

最后登录
2024-3-19
发表于 2015-3-17 09:52:11 | 显示全部楼层
谢谢分享
回复

使用道具 举报

该用户从未签到

53

主题

3438

帖子

61

蝴蝶豆

论坛元老

最后登录
2024-3-19
发表于 2015-3-17 09:53:26 | 显示全部楼层
支持一下。。。
回复

使用道具 举报

该用户从未签到

62

主题

586

帖子

0

蝴蝶豆

高级会员

最后登录
2018-8-20
发表于 2015-3-17 10:03:26 | 显示全部楼层
学习一下
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-3-29 21:19 , Processed in 0.183634 second(s), 42 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表