【STM32H7的DSP教程】第7章 ARM DSP源码和库移植方法(IAR8)

article/2025/10/7 11:12:17

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

第7章   ARM DSP源码和库移植方法(IAR8)

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

目录

第7章   ARM DSP源码和库移植方法(IAR8)

7.1   初学者重要提示

7.2   DSP库的下载和说明

7.2.1  DSP库的下载

7.2.2  DSP库的说明

7.3   DSP库版本的区别

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

7.5   DSP库在IAR上的移植(源码移植方式)

7.5.1  第一步:建立IAR工程并添加DSP库

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

7.5.3  第三步:添加宏定义

7.5.4  第四步:开启FPU

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

7.6   DSP库在IAR上的移植(库移植方式)

7.7   升级到最新版DSP库方法

7.8   简易DSP库函数验证

7.9   总结


 

7.1   初学者重要提示

  1.   IAR请使用8.30及其以上版本,CMSIS请使用5.6.0及其以上版本。
  2.   IAR的工程创建,下载和调试方法,在V7用户手册有详细说明:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 。

7.2   DSP库的下载和说明

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

7.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官网下载资料了。

7.2.2  DSP库的说明

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

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

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

 

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

 

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

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

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

7.3   DSP库版本的区别

IAR版本的DSP库如下:

 

  •   iar_cortexM7ls_math.a

Cortex-M7内核,l表示小端格式,s表示带FPU单元,Single Precision单精度浮点。iar_cortexM7lf_math.a

Cortex-M7内核,l表示小端格式,f表示带FPU单元, Double Precision双精度浮点。

  •   iar_cortexM7l_math.a

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

  •   iar_cortexM7bs_math.a

Cortex-M7内核,b表示大端格式,s表示带FPU单元,Single Precision单精度浮点。

  •   iar_cortexM7bf_math.a

Cortex-M7内核,b表示大端格式,f表示带FPU单元, Double Precision双精度浮点。

  •   iar_cortexM7b_math.a

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

 

STM32H7是M7内核,双精度浮点,一般使用小端格式,所以我们选择库iar_cortexM7lf_math.a

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

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

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

  •   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--;}}

 

7.5   DSP库在IAR上的移植(源码移植方式)

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

7.5.1  第一步:建立IAR工程并添加DSP库

为了方便起见,我们这里不再专门建立一个MDK工程了,直接以V7开发板中的例子:V7-001_跑马灯例程为模板进行添加即可。打开这个实例并在左侧添加分组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"

 

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

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

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

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

7.5.3  第三步:添加宏定义

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

7.5.4  第四步:开启FPU

需要客户通过MDK开启FPU,由于STM32H7支持双精度浮点,这里要开启Double Precision。

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

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

7.6   DSP库在IAR上的移植(库移植方式)

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

7.7   升级到最新版DSP库方法

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

7.8   简易DSP库函数验证

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

配套例子:

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

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

实验目的:

1. 学习官方DSP库的移植

实验内容:

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

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

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

实验现象:

       通过串口上位机软件SecureCRT看打印信息现象如下(分别按几次K1,K2,K3)。如果编译的是MDK的AC6工程,特别要注意本章7.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;}}}
}

 

7.9   总结

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

 


http://chatgpt.dhexx.cn/article/c3p90Vi4.shtml

相关文章

【STM32H7的DSP教程】第14章 DSP统计函数-最大值,最小值,平均值和功率

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第14章 DSP统计函数-最大值,最小值,平均值和功率 本期教程主要讲解统计函数中的最大值,最小值,平均值和功率的计算。 目录 …

【STM32F429的DSP教程】第14章 DSP统计函数-最大值,最小值,平均值和功率

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第14章 DSP统计函数-最大值,最小值,平均值和功率 本期教程主要讲解统计函数中的最大值,最小值,平均值和功率的计算。 目录 …

(十)DSP28335基础教程——ECAP实验(超声波测距)

0 前言 这一节我们来学习DSP的ECAP模块的功能。实验目标:通过超声波测距模块,将采集所测量距离显示在电脑串口助手上。 本节将分为硬件部分、软件部分和实验展示三个方面进行介绍,不清楚的欢迎留言。 1 硬件部分 需要四个硬件如图1所示&a…

【STM32F407的DSP教程】第13章 DSP快速计算函数-三角函数和平方根

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第13章 DSP快速计算函数-三角函数和平方根 本期教程开始,我们将不再专门的分析DSP函数的源码,主要是有些DSP函数的公式分析较麻烦,有兴…

【STM32H7的DSP教程】第18章 DSP控制函数-更好用的SIN,COS计算

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第18章 DSP控制函数-更好用的SIN,COS计算 本期教程主要讲解控制函数中的cos和sin函数数值的获取,这里使用的函数比起第13章中使用的sin和cos函数数值…

【STM32H7的DSP教程】第13章 DSP快速计算函数-三角函数和平方根

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第13章 DSP快速计算函数-三角函数和平方根 本期教程开始,我们将不再专门的分析DSP函数的源码,主要是有些DSP函数的公式分析较麻烦,有兴趣…

【STM32F407的DSP教程】第49章 STM32F407的自适应滤波器实现,无需Matlab生成系数(支持实时滤波)

完整版教程下载地址:事隔五年之后,开启第2版DSP数字信号处理和CMSIS-NN神经网络教程,同步开启三代示波器,更至49章(2021-09-20) - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz!http://www.armbbs.cn/for…

matlab的cheblord函数,【安富莱DSP教程】第39章 IIR滤波器的Matlab设计

第39章 IIR滤波器的Matlab设计 本章节讲解IIR滤波器的Matlab设计,主要包括巴特沃斯滤波器,切比雪夫I型和II型滤波器以及椭圆滤波器。 39.1 巴特沃斯滤波器的设计 39.2 切比雪夫滤波器的设计 39.3 椭圆滤波器的设计 39.4 总结 39.1 巴特沃斯滤波器的设计 39.1.1butter函数 功能…

【STM32H7的DSP教程】第48章 STM32H7的中值滤波器实现,适合噪声和脉冲过滤(支持逐个数据的实时滤波)

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第48章 STM32H7的中值滤波器实现,适合噪声和脉冲过滤(支持逐个数据的实时滤波) 本章节讲解中值滤波器实现,适用于噪声和脉冲…

【STM32F429的DSP教程】第49章 STM32F429的自适应滤波器实现,无需Matlab生成系数(支持实时滤波)

完整版教程下载地址:事隔五年之后,开启第2版DSP数字信号处理和CMSIS-NN神经网络教程,同步开启三代示波器,更至49章(2021-09-20) - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz!http://www.armbbs.cn/for…

【STM32F429的DSP教程】第25章 DSP变换运算-快速傅里叶变换原理(FFT)

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第25章 DSP变换运算-快速傅里叶变换原理(FFT) 在数字信号处理中常常需要用到离散傅立叶变换(DFT),以获取信号的频域特征。尽管传统的DFT…

【STM32F429的DSP教程】第33章 STM32F429不限制点数FFT实现

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第33章 STM32F429不限制点数FFT实现 本章主要讲解不限制点数FFT的实现。 目录 33.1 初学者重要提示 33.2 不限制点数FFT移植 33.2.1 移植FFT相关文件 33.2.2 添加路径…

【STM32H7的DSP教程】第16章 DSP功能函数-数据拷贝,数据填充和浮点转定点

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第16章 DSP功能函数-数据拷贝,数据填充和浮点转定点 本期教程主要讲解功能函数中的数据拷贝,数据填充和浮点数转换为定点数。 目录 第16章 …

【STM32F407的DSP教程】第33章 STM32F407不限制点数FFT实现

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第33章 STM32F407不限制点数FFT实现 本章主要讲解不限制点数FFT的实现。 目录 33.1 初学者重要提示 33.2 不限制点数FFT移植 33.2.1 移植FFT相关文件 33.2.2 添加路径…

【STM32H7的DSP教程】第3章 Matlab简易使用之基础操作

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第3章 Matlab简易使用之基础操作 本期教程开始讲解Matlab的简易使用之基础操作,作为学习DSP的必备软件,掌握简单的Matlab操作是必须的。 目录 第3章 …

[经验] 【安富莱——DSP教程】第7章 DSP定点数和浮点数(重要)

http://bbs.elecfans.com/jishu_486119_1_1.html 7.1 定点数和浮点数概念 如果小数点的位置事先已有约定,不再改变,此类数称为“定点数”。相比之下,如果小数点的位置可变,则称为“浮点数”(定点数的本质是小数…

【STM32F407的DSP教程】第21章 DSP矩阵运算-加法,减法和逆矩阵

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第21章 DSP矩阵运算-加法,减法和逆矩阵 本期教程主要讲解矩阵运算中的初始化,加法,逆矩阵和减法。 目录 第21章 DSP矩阵运算-加…

【STM32H7的DSP教程】第17章 DSP功能函数-定点数互转

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第17章 DSP功能函数-定点数互转 本期教程主要讲解功能函数中的Q7,Q15和Q31分别向其它类型数据转换。 目录 第17章 DSP功能函数-定点数互转 17.1 初学者…

【STM32F407的DSP教程】第19章 DSP复数运算-共轭,点乘和求模

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第19章 DSP复数运算-共轭,点乘和求模 本期教程主要讲解复数运算中的共轭,点乘和模的求解。 目录 第19章 DSP复数运算-共轭,点乘…

【STM32F407的DSP教程】第1章 初学数字信号处理准备工作

完整版教程下载地址:http://www.armbbs.cn/forum.php?modviewthread&tid94547 第1章 初学数字信号处理准备工作 本期教程开始带领大家学习DSP教程,学习前首先要搞明白一个概念,DSP有两层含义,一个是DSP芯片也就是Digital…