打印
[STM32F1]

STM32使用CMSIS DSP库

[复制链接]
2784|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tifmill|  楼主 | 2023-9-29 07:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在STM32中使用DSP库1.使用STM32CubeMX生成Keil5工程
注意:点击Project -> Settings打开工程设置窗口,点击Code Generator选项卡,在STM32Cube Firmware Library Package中选择Copy all used libraries into the project folder。

2.打开并配置Keil 5工程
(1)打开keil 5工程
(2)添加DSP库到工程中
若使用的是STM32CubeMX生成的工程,DSP库文件就在工程目录中,位于.\Drivers\CMSIS\Lib\ARM,里面有4个文件:
注:‘b’表示大端格式(Big Endian),‘l’表示小端格式(Little Endian),‘f’表示带浮点数。
我们目前使用的硬件平台是STM32F407系列,它带有FPU,同时使用的是小端格式,因此使用arm_cortexM4lf_math.lib,将它添加到工程中。
(3)点击 Project -> Options for Target,打开工程选项界面,点击Target选项卡,在Code Generation区域的Floating Point Hardware中选择Single Precision(单精度)。
点击C/C++选项卡,在Preprocessor Symbols区域的Define中添加如下内容:
ARM_MATH_CM4,__TARGET_FPU_VFP,__FPU_PRESENT=1
ARM_MATH_CM4表示在CM4中使用MATH库
__TARGET_FPU_VFP表示在目标设备中使用FPU
__FPU_PRESENT=1表示开启FPU,这个宏其实在stm32f407xx.h中有定义时,但是它并没有在core_cm4.h中起作用,在编译的时候会报错,应该是跟文件的编译顺序有关系,因此为了正常编译,在这里添加它。
(4)使用DSP库
在相应的.c文件中添加头文件:arm_math.h、arm_const_structs.h即可使用。
注:在官方的HAL库中有DSP库相关的使用例程,位于
C:\Users\Administrator\STM32Cube\Repository\STM32Cube_FW_F4_V1.21.0\Drivers\CMSIS\DSP_Lib\Examples(这个是我的目录)
————————————————
版权声明:本文为CSDN博主「linuxweiyh」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:在STM32中使用DSP库_linuxweiyh的博客-CSDN博客_stm32的dsp库

STM32F4xx FPU和DSP库的使用
STM32F4xx属于Cortex M4F架构,带有32位的单精度硬件FPU(Float Point Unit),支持浮点指令集,相对比M0和M3架构,浮点运算性能高出数十倍甚至上百倍。CortexTMM4 FPU是ARMTMFPv4-SP单精度FPU一种实现形式。

1、硬件FPU的开启
(1)通过修改代码实现

默认情况下,STM32F4xx的FPU是禁用的,可以通过设置协处理器控制寄存器(CPACR)来开启硬件FPU。在keil编程环境下,可以通过定义全局宏定义标识符_FPU_PRESENT和_FPU_USED都为1来开启硬件FPU。其中宏定义标识符_FPU_PRESENT用来确认处理是否带有FPU功能,标识符_FPU_USED用来确定是否开启FPU功能。实际上,因为STM32F4是带有FPU功能的,所以在stm32f4xx.h头文件中,默认定义_FPU_PRESENT为1。可以在文件stm32f4xx.h中找到如下定义。
若要开启FPU还需要在头文件stm32f4xx.h中定义标示符_FPU_USED的值为1。即在刚才的宏定义下边添加一个宏定义。

————————————————
(2)通过软件设置实现

如果使用的keil是5.0以上的版本,也可以直接在keil里设置开启FPU。点击图标(Options forTarget…),在”Target”选项卡里的“Code Generation”下的“Floating Point Hardware”下拉菜单中选择”Use FPU”。点击”OK“完成设置。经过设置之后,在程序编译时编译器会自动加入宏定义标识符_FPU_USED为1。
至此则完成硬件FPU的使能。在程序中如果遇到浮点运算就会使用硬件FPU相关指令,执行浮点运算,大大提升系统浮点运算速度。
2、DSP库的使用
STM32F4的Cortex-M4内核不仅内置硬件FPU单元,还支持DSP多种指令集,比如支持单周期乘加指令(MAC)、优化的单指令多数据指令(SIMD)等。因此Cortex-M4执行所有的DSP指令集都可以在单周期内完成,而Cortex-M3和M0需要多个指令和多个周期才能完成同样的功能。比如开方运算,M3和M0只能通过迭代法(标准数学函数库)计算,而M4F直接调用VSQRT指令完成。
(1)获取DSP库
ST官方提供了一整套的DSP库方便我们开发使用。在ST提供的标准库:stm32f4_dsp_stdperiph_lib.zip里面就有(该文件可以从ST官网上下载:http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/PF257901下载,文件名:STSW-STM32065)。下载解压缩之后,在目录STM32F4xx_DSP_StdPeriph_Lib_V1.4.0→Libraries→CMSIS→DSP_Lib下可以找到DSP库文件和测试实例。Sourse中是所有DSP库文件源代码,Examples文件夹下是一些测试实例。
(2)DSP库简介
DSP库主要包含以下几个分库:
BasicMathFunctions
基本数学函数:提供浮点数的各种基本运算函数,如向量加减乘除等运算。
CommonTables
arm_common_tables.c文件提供位翻转或相关参数表。
ComplexMathFunctions
复杂数学功能,如向量处理,求模运算的。
ControllerFunctions
控制功能函数。包括正弦余弦,PID电机控制,矢量Clarke变换,矢量Clarke逆变换等。
FastMathFunctions
快速数学功能函数。提供了一种快速的近似正弦,余弦和平方根等相比CMSIS计算库要快的数学函数。
FilteringFunctions
滤波函数功能,主要为FIR和LMS(最小均方根)等滤波函数。MatrixFunctions
矩阵处理函数。包括矩阵加法、矩阵初始化、矩阵反、矩阵乘法、矩阵规模、矩阵减法、矩阵转置等函数。
StatisticsFunctions
统计功能函数。如求平均值、最大值、最小值、计算均方根RMS、计算方差/标准差等。
SupportFunctions
支持功能函数,如数据拷贝,Q格式和浮点格式相互转换,Q任意格式相互转换。
TransformFunctions
变换功能。包括复数FFT(CFFT)/复数FFT逆运算(CIFFT)、实数FFT(RFFT)/实数FFT逆运算(RIFFT)、和DCT(离散余弦变换)和配套的初始化函数。
ST提供了.lib格式的文件,方便使用这些库。这些.lib文件就是由Source文件夹下的源码编译生成的,如果想看某个函数的源码,可以在Source文件夹下面查找。.lib格式文件路径:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0→Libraries→CMSIS→Lib→ARM,总共有8个.lib文件,和M4F相关的有两个:

arm_cortexM4bf_math.lib(浮点Cortex-M4大端模式)
arm_cortexM4lf_math.lib(浮点Cortex-M4小端模式)
STM32F4的内核CortexM4F采用小端模式,所以选择:arm_cortexM4lf_math.lib(浮点Cortex-M4小端模式)。

(3)DSP库编程环境搭建
在设置使用DSP库之前首先要先开启硬件FPU,然后按照如下步骤搭建DSP库运行环境。
首先添加库文件。在工程目录下新建DSP_LIB文件夹用于存放库文件。然后把arm_cortexM4lf_math.lib和相关头文件(路径STM32F4xx_DSP_StdPeriph_Lib_V1.4.0à LibrariesàCMSISà Include 里的文件)拷贝到DSP_LIB文件夹中。

然后打开工程,新建DSP_LIB分组,并将arm_cortexM4lf_math.lib添加到工程里面。
添加好文件之后,需要添加头文件包含路径,将第一步拷贝的 Include 文件夹和 DSP_LIB 文件夹,加入头文件包含路径。打开工程属性设置面板,然后点击 ”C/C++“ 选项卡,点击对号处,弹出 include path 设置面板。添加 ”..\DSP_LIB“ 和 “..\DSP_LIB\Include“ 两个路径。
最后,为了能够使用DSP库的所有功能,还需要添加以下几个全局宏定义:

1、__FPU_USED
2、__FPU_PRESENT
3、ARM_MATH_CM4
4、__CC_ARM
5、ARM_MATH_MATRIX_CHECK
6、ARM_MATH_ROUNDING
添加方法是打开工程属性设置面板,然后点击”C/C++“选项卡,在“Preprocessor Symbols“下的”Define:”文本框中进行添加。两个宏之间用“,”隔开。如果已经开启了硬件FPU,则无需添加__FPU_USED和__FPU_PRESENT这两个宏。
至此,STM32F4的DSP库运行环境已经搭建好了。可以使用DSP库的相关函数了。

使用特权

评论回复
沙发
Henryko| | 2023-9-29 18:55 | 只看该作者
照着教程配置下上手

使用特权

评论回复
板凳
yellow555| | 2024-4-29 16:26 | 只看该作者
根据楼主分享,DSP库运行环境已经搭建好了。可以使用DSP库的相关函数了。

使用特权

评论回复
地板
中国龙芯CDX| | 2024-4-29 19:20 | 只看该作者
STM32使用CMSIS DSP库非常不错

使用特权

评论回复
5
modesty3jonah| | 2024-5-1 20:31 | 只看该作者
验证了DSP库的功能并且满意于性能表现, 就可以将应用程序部署到最终的硬件平台上。

使用特权

评论回复
6
ccook11| | 2024-5-2 20:23 | 只看该作者
编译和链接你的项目。确保CMSIS-DSP库的源文件被正确编译,并且链接器能够找到库中的函数。

使用特权

评论回复
7
maudlu| | 2024-5-2 22:56 | 只看该作者
将下载的CMSIS-DSP库源代码添加到你的STM32项目文件中。通常,你需要将库的源文件和头文件包含到项目中。

使用特权

评论回复
8
abotomson| | 2024-5-3 11:02 | 只看该作者
CMSIS DSP库提供了大量的DSP函数,包括滤波器、FFT、变换、统计等。你可以根据你的应用需求调用这些函数。例如,如果你需要实现一个FIR滤波器,你可以使用库中的arm_fir_f32()函数。

使用特权

评论回复
9
timfordlare| | 2024-5-4 15:09 | 只看该作者
需要对CMSIS-DSP库进行性能优化。这可能涉及到选择不同的算法实现,或者调整数据类型和缓存策略。

使用特权

评论回复
10
minzisc| | 2024-5-4 16:56 | 只看该作者
// 示例代码:使用CMSIS-DSP创建一个FIR滤波器对象并处理数据
#include "arm_math.h" // CMSIS-DSP头文件

// 定义滤波器系数
const float32_t Coefficients[] = { ... };

// 创建FIR滤波器对象
arm_fir_instance_f32 S;

// 初始化滤波器
arm_fir_init_f32(&S, NumTaps, Coefficients, pState, blockSize);

// 处理数据
arm_fir_f32(&S, pSrc, pDst, blockSize);

使用特权

评论回复
11
dspmana| | 2024-5-6 21:50 | 只看该作者
要在STM32上使用CMSIS-DSP库,首先需要在开发环境中正确引入该库。以Keil MDK-ARM为例,可以在工程的包管理器界面中选择CMSIS-DSP库,并将其加入到项目中。此外,还可以根据STM32的具体型号和内核类型,选择适合的DSP库文件进行移植。例如,对于STM32F4系列微控制器,由于其采用Cortex-M4内核并支持单精度浮点运算,应选择相应的arm_cortexM4lf_math.lib文件。

使用特权

评论回复
12
robertesth| | 2024-5-7 11:18 | 只看该作者
将CMSIS-DSP库集成到你的STM32项目中,通常需要将库文件包含到你的工程文件中。如果你使用的是Keil、IAR或者STM32CubeIDE等集成开发环境(IDE),可以将库文件作为外部库添加到项目中。

使用特权

评论回复
13
belindagraham| | 2024-5-7 15:59 | 只看该作者
在项目中配置CMSIS-DSP库。这通常涉及到配置一些宏定义,以选择所需的算法和数据类型。例如,你可能会选择浮点或定点实现,以及选择是否使用快速或精确的数学函数。

使用特权

评论回复
14
uptown| | 2024-5-8 14:55 | 只看该作者
可以通过多种途径获取CMSIS-DSP库。可以直接访问DSP库的Github地址下载最新的库文件,或者从STM32CubeF1下载库文件,但可能需要登录。

使用特权

评论回复
15
phoenixwhite| | 2024-5-8 21:41 | 只看该作者
下载并解压CMSIS-DSP库后,您需要将库文件添加到您的工程中。通常,这涉及到将库的头文件和源文件添加到工程的正确位置,并在编译选项中包含这些文件。

使用特权

评论回复
16
jonas222| | 2024-5-9 12:56 | 只看该作者
在使用CMSIS DSP库时,注意检查函数的输入参数和返回值

使用特权

评论回复
17
modesty3jonah| | 2024-5-9 17:33 | 只看该作者
STM32系列微控制器广泛应用于各种嵌入式系统中,其强大的处理能力和丰富的外设资源使其成为工业控制和智能硬件开发的理想选择。

使用特权

评论回复
18
yeates333| | 2024-5-10 12:08 | 只看该作者
为了进一步提升STM32在处理数字信号处理(DSP)任务时的性能,ARM公司推出了CMSIS-DSP库,这是一个专门针对Cortex-M和Cortex-A内核优化的计算库,旨在利用内核的FPU(浮点运算单元)和DSP指令集来加速算法的执行。

使用特权

评论回复
19
elsaflower| | 2024-5-12 14:54 | 只看该作者
#include "arm_math.h"  
  
#define NUM_SAMPLES 100  
#define FILTER_ORDER 31  
  
float32_t inputSignal[NUM_SAMPLES];  
float32_t outputSignal[NUM_SAMPLES];  
float32_t firCoeffs[FILTER_ORDER + 1];  
  
int main(void)  
{  
    // 初始化FIR滤波器系数(这里只是示例,你需要根据你的应用设置合适的系数)  
    for (int i = 0; i <= FILTER_ORDER; i++) {  
        firCoeffs[i] = /* 设置系数值 */;  
    }  
  
    // 初始化CMSIS DSP库(如果有必要的初始化步骤)  
  
    // 执行FIR滤波  
    arm_fir_f32(&inputSignal[0], NUM_SAMPLES, &firCoeffs[0], outputSignal, FILTER_ORDER);  
  
    // 处理滤波后的输出信号  
    // ...  
  
    return 0;  
}

使用特权

评论回复
20
Bowclad| | 2024-5-12 20:16 | 只看该作者
这个跟st的库有区别吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

1339

帖子

0

粉丝