引言
因为我在做项目的时候,需要使用算法,自己写的话麻烦,并且无法保证空间的利用以及运算速度会 更快,所以这里我引用CMSIS-DSP库,使用里面的函数来实现,但是我搜索发现有使用说明的都是用的STM32Cube生成使用的,而我用的是标准库,所以特此写下本篇文章。
一、什么是CMSIS-DSP库?
CMSIS DSP 软件库(CMSIS-DSP库官网链接),这是一套用于基于 Cortex-M 和 Cortex-A 处理器的设备的常见信号处理函数。
该库分为多个函数,每个函数涵盖一个特定类别:
- 基本数学函数
- 快速数学函数
- 复杂的数学函数
- 过滤功能
- 矩阵函数
- 变换函数
- 电机控制功能
- 统计功能
- 支持功能
- 插值函数
- 支持向量机函数 (SVM)
- 贝叶斯分类器函数
- 距离函数
- 四元数函数
该库通常具有用于操作 8 位整数、16 位整数、32 位整数和 32 位浮点值的单独函数。
二、引入CMSIS-DSP库过程
1、创建STM32基础工程
这里我使用的是野火的串口1通信基础例程。链接: 野火的串口1通信基础例程
2、获取CMSIS-DSP库
-
方法1:我把DSP库的文件链接放在旁边。链接: CMSIS-DSP库
-
方法2:我们可以直接访问DSP库的Github地址,然后通过git或者直接Download下载。
链接:DSP库Github链接 -
方法3:我们可以去链接: STM32CubeF1下载,只不过STM32官网下载文件,需要登录,略微麻烦,推荐方法1。
下载后可以通过根据下图找到DSP库的位置
三、STM32标准库添加DSP库
- 首先解压并打开CMSIS-DSP的压缩包,我们所需要的内容主要有三个文件夹
- 同时由于CMSIS-DSP库是由ARM公司提供的一个信号处理算法库,所以也需要CMSIS的内核文件以及一个lib库文件,我们可以进入STM32CubeMax去下载最新的封装库,其中lib库文件的命名以内核名称开始,后面的或b代表小端格式或大端格式,因为我所使用的单片机是STM32F103ZET6型号,是M3内核,小端格式,支持单精度浮点运算单元,所以我们选择arm_cortexM3l_math.lib,解压打开文件后按照图片所示路径找到框出的文件夹以及文件,如果觉得麻烦我也放了封装库的源文件链接:STM32CubeMax封装库
如果与我所使用的板子不同,可以根据自己型号做出选择
- 当我们找到所有文件以后,把这四个文件夹添加到我们的工程目录下,这里我把从软件包里找到的三个文件创了个DSP的文件夹,集中放在里面。
- 然后我们用Keil打开工程项目,添加DSP具体文件(这里添加的具体文件我们可以根据需求来添加,也可以全部添加)和头文件路径
- 添加完文件后,我们在箭头所指的地方添加宏定义
,ARM_MATH_CM4,__CC_ARM,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING,
至于为什么添加这几个宏定义,在arm_math.h文件里有写为全英文,这里我把他中文注释放在这里
ARM_MATH_BIG_ENDIAN:
定义宏ARM_MATH_BIG_ENDIAN,为大端目标构建库。默认情况下,库会为小端目标构建。
ARM_MATH_MATRIX_CHECK:
定义用于检查矩阵的输入和输出大小的宏ARM_MATH_MATRIX_CHECK
ARM_MATH_ROUNDING:
定义用于舍入支持函数的宏ARM_MATH_ROUNDING
ARM_MATH_LOOPUNROLL:
定义宏ARM_MATH_LOOPUNROLL,以便在 DSP 函数中启用手动循环展开
ARM_MATH_NEON:
定义宏ARM_MATH_NEON以启用 DSP 功能的 Neon 版本。默认情况下,当 Neon 可用时,它不会启用,因为性能取决于编译器和目标体系结构。
ARM_MATH_NEON_EXPERIMENTAL:
定义宏ARM_MATH_NEON_EXPERIMENTAL以启用某些 DSP 函数的实验性 Neon 版本。实验性 Neon 版本目前没有比标量版本更好的性能。
ARM_MATH_HELIUM:
它意味着标志 ARM_MATH_MVEF 和 ARM_MATH_MVEI 和 ARM_MATH_MVE_FLOAT16。
ARM_MATH_HELIUM_EXPERIMENTAL:
仅在定义ARM_MATH_MVEF、ARM_MATH_MVEI或ARM_MATH_MVE_FLOAT16时才考虑在内。启用一些矢量版本,这些版本的性能可能比标量差,具体取决于内核/编译器配置。
ARM_MATH_MVEF:
选择 f32 算法的 Helium 版本。它意味着ARM_MATH_FLOAT16和ARM_MATH_MVEI。
ARM_MATH_MVEI:
选择 int 和 fixed point 算法的 Helium 版本。
ARM_MATH_MVE_FLOAT16:
某些算法的 MVE Float16 实现(需要 MVE 扩展)。
DISABLEFLOAT16:
当特定编译器/内核配置不支持 __fp16 时禁用 float16 算法。这仅对标量有效。当矢量体系结构支持 f16 时,无法禁用它。
ARM_MATH_AUTOVECTORIZE:
使用 Helium 或 Neon,禁用带有 C 内部函数的矢量化代码,改用纯 C。然后由编译器完成矢量化。
- 最后,我们在arm_math.h 文件里添加上#include “stm32f10x.h” 然后就可以使用了
感谢各位的观看,如有错误,还请指正。