完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547

第6章   ARM DSP源码和库移植方法(MDK5的AC5和AC6)

本期教程主要讲解ARM官方DSP源码和库的移植以及一些相关知识的介绍。

目录

第6章   ARM DSP源码和库移植方法(MDK5的AC5和AC6)

6.1   初学者重要提示

6.2   DSP库的下载和说明

6.2.1  DSP库的下载

6.2.2  DSP库的说明

6.3   DSP库版本的区别

6.4   DSP库的几个重要的预定义宏含义

6.5   使用MDK的AC6编译器优势

6.6   DSP库在MDK上的移植(AC5源码移植方式)

6.6.1  第一步:建立MDK工程并添加DSP库

6.6.2  第二步:添加头文件路径

6.6.3  第三步:添加宏定义

6.6.4  第四步:开启FPU

6.6.5  第五步:添加头文件arm_math.h

6.7   DSP库在MDK上的移植(AC5库移植方式)

6.8   DSP库在MDK上的移植(AC6源码移植方式)

6.9   DSP库在MDK上的移植(AC6库移植方式)

6.10 升级到最新版DSP库的方法

6.11 简易DSP库函数验证

6.12 总结


6.1   初学者重要提示

  1. MDK请使用5.26及其以上版本,CMSIS软件包请使用5.6.0及其以上版本。
  2. MDK的工程创建,下载和调试方法,在V6用户手册有详细说明:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 。
  3. 鉴于MDK的AC6(ARM Compiler 6.X)编译器在浮点处理上的强劲性能,每个例子将必做一个AC6版,而且ARM编译好的DSP库也开始直接采用AC6。
  4. MDK AC6有两个地方在使用的时候要注意:
    • 工程目录切记不要有中文路径,而且不要太长,否则会导致无法使用go to def以及调试的时候不正常。
    • MDK AC6工程模板的汉字编码问题,在本章6.8小节有详细说明。

6.2   DSP库的下载和说明

下面详细的给大家讲解一下官方DSP库的移植。

6.2.1  DSP库的下载

DSP库是包含在CMSIS软件包(Cortex Microcontroller Software Interface Standard)里面,所以下载DSP库也就是下载CMSIS软件包。这里提供三个可以下载的地方:

  • 方式一:STM32CubeH7软件包里面。

每个版本的Cube软件包都会携带CMSIS文件夹,只是版本比较老,不推荐。即使是最新的CubeH7

软件包,包含的CMSIS软件包版本也有点低。

  • 方式二:MDK安装目录(下面是5.6.0版本的路径)。

大家安装了新版MDK后,CMSIS软件包会存在于路径:ARM\PACK\ARM\CMSIS\5.6.0\CMSIS。

如果有更新的版本,推荐大家使用最新版本,MDK的软件包下载地址:http://www.keil.com/dd2/Pack/ 。

  • 方式三:GitHub。

通过GitHub获取也比较方便,地址:https://github.com/ARM-software/CMSIS_5 。点击右上角就可以下载CMSIS软件包了。

当然,也可以在ARM官网下载,只是这两年ARM官网升级得非常频繁,通过检索功能找资料非常麻烦。所以不推荐大家到ARM官网下载资料了。

6.2.2  DSP库的说明

这里我们以CMSIS V5.6.0为标准进行移植。打开固件库里面的CMSIS文件,可以看到如下几个文件:

其中DSP文件夹是我们需要的:

Examples文件夹中的文件如下,主要是提供了一些例子:

Include文件夹里面是DSP库的头文件:

Lib文件夹里面是MDK(ARM),IAR和CGG版库文件:

Projects文件夹里面的文件如下,提供了三个版本的工程模板,每个模板里面都是把所有源码文件添加了进来:

Source文件夹中的文件如下,这个是DSP的源码文件:

6.3   DSP库版本的区别

MDK版本的DSP库如下:

  • arm_cortexM4lf_math.lib

Cortex-M4内核,l表示小端格式,f表示带FPU单元,M4仅支持Single Precision单精度浮点。

  • arm_cortexM4l_math.lib

Cortex-M4内核,l表示小端格式。

  • arm_cortexM4bf_math.lib

Cortex-M4内核,b表示大端格式,f表示带FPU单元,M4仅支持Single Precision单精度浮点。

  • arm_cortexM4b_math.lib

Cortex-M4内核,b表示大端格式。

STM32F4是M4内核,单精度浮点,一般使用小端格式,所以我们选择库arm_cortexM4lf_math.lib

6.4   DSP库的几个重要的预定义宏含义

根据用户的使用要求,这几个预定义宏可以添加到MDK的预定义选项中:

这里将这几个预定义宏做个介绍:

  • ARM_MATH_BIG_ENDIAN:

大端格式。

  • ARM_MATH_MATRIX_CHECK:

检测矩阵的输入输出大小

  • ARM_MATH_NEON:
  • ARM_MATH_NEON_EXPERIMENTAL:

这两个暂时用不到,因为M0,M3,M4和M7内核不支持NEON指令,需要等待升级到ARMv8.1-M架构。

  • ARM_MATH_ROUNDING:

主要用在浮点数转Q32,Q15和Q7时,类似四舍五入的处理上,其它函数没用到。

  • ARM_MATH_LOOPUNROLL:

用于4个为一组的的小批量处理上,加快执行速度。

通过下面的求绝对值函数,可以方便的看出区别:

void arm_abs_f32(const float32_t * pSrc,float32_t * pDst,uint32_t blockSize)
{uint32_t blkCnt;                               /* Loop counter */#if defined(ARM_MATH_NEON)float32x4_t vec1;float32x4_t res;/* Compute 4 outputs at a time */blkCnt = blockSize >> 2U;while (blkCnt > 0U){/* C = |A| *//* Calculate absolute values and then store the results in the destination buffer. */vec1 = vld1q_f32(pSrc);res = vabsq_f32(vec1);vst1q_f32(pDst, res);/* Increment pointers */pSrc += 4;pDst += 4;/* Decrement the loop counter */blkCnt--;}/* Tail */blkCnt = blockSize & 0x3;#else
#if defined (ARM_MATH_LOOPUNROLL)/* Loop unrolling: Compute 4 outputs at a time */blkCnt = blockSize >> 2U;while (blkCnt > 0U){/* C = |A| *//* Calculate absolute and store result in destination buffer. */*pDst++ = fabsf(*pSrc++);*pDst++ = fabsf(*pSrc++);*pDst++ = fabsf(*pSrc++);*pDst++ = fabsf(*pSrc++);/* Decrement loop counter */blkCnt--;}/* Loop unrolling: Compute remaining outputs */blkCnt = blockSize % 0x4U;#else/* Initialize blkCnt with number of samples */blkCnt = blockSize;#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
#endif /* #if defined(ARM_MATH_NEON) */while (blkCnt > 0U){/* C = |A| *//* Calculate absolute and store result in destination buffer. */*pDst++ = fabsf(*pSrc++);/* Decrement loop counter */blkCnt--;}}

6.5   使用MDK的AC6编译器优势

涉及到的知识点比较多,专门将其整理到附件章节E。

6.6   DSP库在MDK上的移植(AC5源码移植方式)

下面我们讲解下如何在MDK上面移植DSP库源码,DSP库的移植相对比较容易。

6.6.1  第一步:建立MDK工程并添加DSP库

为了方便起见,我们这里不再专门建立一个MDK工程了,直接以V6开发板中的例子:V6-001_跑马灯例程为模板(注意,要使用我们HAL版本例子)进行添加即可。打开这个实例并在左侧添加分组CMSIS/DSP:

我们这里不需要添加每个C文件源码,仅需添加包含这些C文件的汇总文件,比如BasicMathFunctions.c文件里面包含的C文件就是:

#include "arm_abs_f32.c"
#include "arm_abs_q15.c"
#include "arm_abs_q31.c"
#include "arm_abs_q7.c"
#include "arm_add_f32.c"
#include "arm_add_q15.c"
#include "arm_add_q31.c"
#include "arm_add_q7.c"
#include "arm_dot_prod_f32.c"
#include "arm_dot_prod_q15.c"
#include "arm_dot_prod_q31.c"
#include "arm_dot_prod_q7.c"
#include "arm_mult_f32.c"
#include "arm_mult_q15.c"
#include "arm_mult_q31.c"
#include "arm_mult_q7.c"
#include "arm_negate_f32.c"
#include "arm_negate_q15.c"
#include "arm_negate_q31.c"
#include "arm_negate_q7.c"
#include "arm_offset_f32.c"
#include "arm_offset_q15.c"
#include "arm_offset_q31.c"
#include "arm_offset_q7.c"
#include "arm_scale_f32.c"
#include "arm_scale_q15.c"
#include "arm_scale_q31.c"
#include "arm_scale_q7.c"
#include "arm_shift_q15.c"
#include "arm_shift_q31.c"
#include "arm_shift_q7.c"
#include "arm_sub_f32.c"
#include "arm_sub_q15.c"
#include "arm_sub_q31.c"
#include "arm_sub_q7.c"

这样一来,MDK编译后会自动关联,查看源码非常方便:

6.6.2  第二步:添加头文件路径

添加DSP所需的头文件路径,这个头文件路径是已经在模板工程中添加好的,这里只是跟大家强调一下:

这里要注意一点,为什么直接添加路径Libraries\CMSIS\Include里面的头文件即可,而没有添加Libraries\CMSIS\DSP\Include,这是因为路径Libraries\CMSIS\Include里面已经包含了DSP库的头文件。

6.6.3  第三步:添加宏定义

我们这里仅使能一个宏定义ARM_MATH_LOOPUNROLL:

6.6.4  第四步:开启FPU

需要客户通过MDK开启FPU,由于STM32F4支持单精度浮点,这里要开启Single Precision。

6.6.5  第五步:添加头文件arm_math.h

用到DSP库函数的文件得添加#include "arm_math.h"就可以调用DSP库的API了。至此就完成了DSP库的移植。

6.7   DSP库在MDK上的移植(AC5库移植方式)

移植方法与本章6.5小节的相同,仅第1步不同,将源码的添加修改为库添加:

6.8   DSP库在MDK上的移植(AC6源码移植方式)

AC6的DSP源码移植与本章6.5小节里面的AC5移植完全相同,没有区别。但AC5和AC6工程上有三处区别,这里着重指出下:

  • 第1处,采用AC6编译器

  • 第2处,警告类型选择AC5-lik

  • 第3处,MDK的AC6工程代码如果有源文件是GBK编码,而且使用汉字,MDK编译时会报错,需要用记事本打开使用汉字的源码文件,另存为UTF-8。比如main.c文件的串口打印函数printf用到了汉字,那么就需要做如下修改

然后再重新编译就不会报错了。同时,串口打印时,使用的串口助手要支持UTF-8,推荐用SecureCRT,下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=91718 。

设置如下:

6.9   DSP库在MDK上的移植(AC6库移植方式)

AC6的DSP库移植与本章6.6小节里面的AC5移植完全相同,没有区别。不过要注意6.8小节中所讲解的问题即可。

6.10 升级到最新版DSP库的方法

由于CMSIS软件包是实时更新的,这里提供一种升级的简单办法,按照本章6.1小节的说明下载到最新版CMSIS软件包,然后直接覆盖DSP工程里面的CMSIS文件夹即可。

6.11 简易DSP库函数验证

这里我们主要运行arm_abs_f32,arm_abs_q31,arm_abs_q15这三个函数,以此来验证我们移植的DSP库是否正确。

配套例子:

本章配套了如下两个例子:

  • V6-200_DSP程序模板(源码方式)
  • V6-201_DSP程序模板(库方式)

每个例子都配套了MDK的AC5和AC6两个版本的工程。

实验目的:

1. 学习官方DSP库的移植

实验内容:

1. 按下按键K1, 串口打印函数arm_abs_f32的输出结果

2. 按下按键K2, 串口打印函数arm_abs_q31的输出结果

3. 按下按键K3, 串口打印函数arm_abs_q15的输出结果

实验现象:

通过串口上位机软件SecureCRT看打印信息现象如下(分别按几次K1,K2,K3)。如果编译的是MDK的AC6工程,特别要注意本章6.7小节所说的问题。

程序设计:

程序的设计也比较简单,通过按下不同的按键从而打印不同的DSP库函数执行结果,主程序如下:

#include "bsp.h"            /* 底层硬件驱动 */
#include "arm_math.h"/* 定义例程名和例程发布日期 */
#define EXAMPLE_NAME    "V7-ARM的DSP移植模板(源码方式)"
#define EXAMPLE_DATE    "2019-07-31"
#define DEMO_VER        "1.0"static void PrintfLogo(void);
static void PrintfHelp(void);/*
*********************************************************************************************************
*    函 数 名: main
*    功能说明: c程序入口
*    形    参: 无
*    返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{uint8_t ucKeyCode;        /* 按键代码 */float32_t pSrc;float32_t pDst;q31_t pSrc1;q31_t pDst1;q15_t pSrc2;q15_t pDst2;bsp_Init();        /* 硬件初始化 */PrintfLogo();    /* 打印例程名称和版本等信息 */PrintfHelp();    /* 打印操作提示 */bsp_StartAutoTimer(0, 100);    /* 启动1个100ms的自动重装的定时器 *//* 主程序大循环 */while (1){/* CPU空闲时执行的函数,在 bsp.c */bsp_Idle();        /* 判断定时器超时时间 */if (bsp_CheckTimer(0))    {/* 每隔100ms 进来一次 *//* 翻转LED2的状态 */bsp_LedToggle(2);    }/* 处理按键事件 */ucKeyCode = bsp_GetKey();if (ucKeyCode > 0){/* 有键按下 */switch (ucKeyCode){case KEY_DOWN_K1:               /* K1键按下 */pSrc -= 1.23f;arm_abs_f32(&pSrc, &pDst, 1);printf("pDst = %f\r\n", pDst);break;case KEY_DOWN_K2:              /* K2键按下 */pSrc1 -= 1;arm_abs_q31(&pSrc1, &pDst1, 1);printf("pDst1 = %d\r\n", pDst1);break;case KEY_DOWN_K3:              /* K3键按下 */pSrc2 -= 1;arm_abs_q15(&pSrc2, &pDst2, 1);printf("pDst2 = %d\r\n", pDst2);break;default:break;}}}
}

6.12 总结

本期教程主要跟大家介绍了官方DSP库的移植,相对来说移植也比较简单,建议初学的同学按照这个步骤移植一遍。

【STM32F429的DSP教程】第6章 ARM DSP源码和库移植方法(MDK5的AC5和AC6)相关推荐

  1. 【RTX操作系统教程】第6章 RTX操作系统源码方式移植

    原文来源:http://forum.armfly.com/forum.php?mod=viewthread&tid=16616&highlight=RTX%B2%D9%D7%F7%CF ...

  2. 老男孩GO语言线下培训班1期整套教程(完整18天含源码)

    老男孩GO语言线下培训班1期整套教程(完整18天含源码) 老男孩教育-Go语言第一期(共18天 含课程源码) 课程详细目录: ├─L001-Go语言-mp4 │      01 Go开发1期 day1 ...

  3. android修改原生代码,【ROM教程】安卓原生ROM修改源码消除WIFI叹号教程

    [ROM教程]安卓原生ROM修改源码消除WIFI叹号教程.Android为了对网络状态进行检测,采用了一种叫做captive detection的方式进行网络状态检测.其实说起来很简单,每当连接到一个 ...

  4. 四千GB电脑技术高清视频教程和23万套各类源码模板

    四千GB电脑技术高清视频教程和23万套各类源码模板 1.二千多GB各类电脑技术高清视频教程 2.17万本电脑技术相关的电子书籍 3.23万套各类VIP源码.商业源码.泄密源码.破解源码 4.一万多套淘 ...

  5. 第6章 RTX 操作系统源码方式移植

    以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章教程为大家将介绍 RTX 操作系统源码方式移植,移植工作比较简单,只需要用户添加需要的源码文件即可, ...

  6. .NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入

    写在前面 上篇文章我给大家讲解了ASP.NET Core的概念及为什么使用它,接着带着你一步一步的配置了.NET Core的开发环境并创建了一个ASP.NET Core的mvc项目,同时又通过一个实战 ...

  7. 【华为云技术分享】手把手教你如何在ARM上源码编译Redis

    一.基础环境信息 OS: Euler OS 2.8 CPU: ARM 二.编译和安装Redis步骤如下 执行如下命令,获取Redis源码. wget http://download.redis.io/ ...

  8. c++贪吃蛇_细致的C语言写贪吃蛇教程+详细思路-适合新手附源码

    在有用C写贪吃蛇的一个想法之后,上网查了几个教程,觉得不是很能看懂.恩...或者说不是一下子就能看出来思路+具体怎么实现.所以,我花了早自习的时间想了想如何用最简单的方法实现,晚上大约两个小时写了出来 ...

  9. ajax资料收集-Ajax文章(教程和实例)---Ajax资源下载(源码和教程)---Ajax规范标准

    CSDN Blog Ajax文章搜索: http://search.csdn.net/search/ajax/1/blog/ 专题:Ajax技术应用开发 http://www.51cto.com/ht ...

最新文章

  1. 字符串留用与字符串池
  2. 香港大学顾佳涛:非自回归神经机器翻译 | 直播预告
  3. cad蜂鸟工具_蜂鸟视图地图数据中台,全面提升商业地产的可视化信息管控
  4. OpenCV3.2+VS2013+Tesseract3.02.02配置
  5. java怎么通过字段去获取对象_通过java反射获取任意对象的字段名及字段值
  6. redis decr 防止超卖_Redis基础、高级特性与性能调优——一篇文章搞定
  7. 光凭 5G 根本无法解决宽带问题!
  8. 操,escape sequence的输入方法我以前找过一次,这次又忘了,又找了一次,记下来,...
  9. python鼠标键盘事件代码_Python+selenium鼠标、键盘事件
  10. SVN安装及使用+SVN汉化
  11. 第二章 2.群中的等价关系 -- 陪集,共轭,正规子群与商群
  12. 浏览器存储cookie
  13. 计算机考研各科时间安排,计算机考研专业课复习全程的时间安排
  14. 终极单词index 排序 G-H
  15. 0xc0000142应用程序无法正常启动
  16. 达梦数据库迁移数据报错 字符串截断
  17. 安装Apache24服务时出现的AH00526错误解决办法
  18. 西门子PLC协议-S7COMM
  19. 初识 love2d. Hello World lua 调试 iOS 环境运行
  20. PDManer支持的数据库系统

热门文章

  1. WWDC2019:离开手机,苹果靠什么“挽尊”
  2. python中global和def_Python中 Global和Nonlocal的用法详解
  3. [转载]从春招到秋招,一个本科生的求职之路。
  4. BK芯片,Wi-Fi6-数传ble-BK7256 BK7235 BK7258 BK7231 BK3633 BK3432 BK3437 BL2028
  5. 网格顶点法向量从世界坐标到切空间坐标转换:法向贴图高低模烘焙
  6. 云端服务器跑python代码,断开后台运行
  7. WPF制作贪吃蛇小游戏
  8. 堆——以洛谷p3378,p1334,p1628,p1878为例
  9. vue中日期格式转化
  10. STM32单片机---外部中断