STM32F4-浮点DSP库的MDK开发环境的设置

参考资料正点原子STM32F4开发指南(库函数版本) 51.FPU测试(Julia分形)实验 & 52.DSP测试实验   一、硬件FPU的使能

STM32F4 硬件FPU 使用的要点:设置CPACR 寄存器(协处理器控制寄存器)bit20~23 为1,使能硬件FPU。CPACR 寄存器这4 个位的设置,我们在system_stm32f4xx_c 文件里面开启,要求宏定义:__FPU_PRESENT=1 & __FPU_USED=1.

  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif

1.宏定义标识符__FPU_PRESENT 用来确定处理器是否带FPU 功能,因为F4 是带FPU 功能的,所以在我们的stm32f4xx.h 头文件里面,我们默认是定义了__FPU_PRESENT 为1(位于stm32f427xx.h文件中)。

#define __FPU_PRESENT 1U /*!< FPU present */ 

2.标识符__FPU_USED 用来确定是否开启FPU功能。设置方法又三种:(1)第一种是直接在头文件STM32f4xx.h 中定义宏定义标识符__FPU_USED 的值为1;(2)在Target选项卡里面,设置Floating Point Hardware 为Use Single Precision(最简便);(3)在C/C++选项卡内,添加全局宏定义标识符__FPU_USED=1

通过设置以上两个宏定义即可使能硬件FPU。

 二、支持DSP指令集

STM32F4 采用Cortex-M4 内核,相比Cortex-M3 系列除了内置硬件FPU 单元,在数字信号处理方面还增加了DSP 指令集,支持诸如单周期乘加指令(MAC(32 位乘法累加)),优化的单指令多数据指令(SIMD),饱和算数等多种数字信号处理指令集。相比Cortex-M3,Cortex-M4 在数字信号处理能力方面得到了大大的提升。Cortex-M4 执行所有的DSP 指令集都可以在单周期内完成,而Cortex-M3 需要多个指令和多个周期才能完成同样的功能。

受益于SIMD 指令的支持,Cortex-M4 处理器能在单周期内完成高达32×32+64——>64 的运算,为其他任务释放处理器的带宽,而不是被乘法和加法消耗运算资源。

1、DSP库的介绍

STM32F4 的DSP 库源码和测试实例在ST 提供的标准库:stm32f4_dsp_stdperiph_lib.zip 里面就有(该文件可以在:http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/P
F257901 下载,文件名:STSW-STM32065),文件位于:STM32F4xx 固件库——STM32F4xx_DSP_StdPeriph_Lib_V1.4.0——Libraries——CMSIS——DSP_Lib,该文件夹下目录结构如下所示:

STM32F4-浮点DSP库的MDK开发环境的设置

 

 

DSP_Lib 源码包的Source 文件夹是所有DSP 库的源码,Examples 文件夹是相对应的一些测试实例。这些测试实例都是带main 函数的,也就是拿到工程中可以直接使用。接下来我们一一讲解一下Source 源码文件夹下面的子文件夹包含的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(离散余弦变换)和配套的初始化函数。

所有这些DSP 库代码合在一起是比较多的,因此,ST 为我们提了.lib 格式的文件,方便使用。这些.lib 文件就是由Source 文件夹下的源码编译生成的,如果想看某个函数的源码,大家可以在Source 文件夹下面查找。.lib 格式文件路径:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0——Libraries——CMSIS——Lib——ARM ,总共有8个.lib 文件,我们所用的STM32F4 属于CortexM4F 内核,小端模式,应选择:arm_cortexM4lf_math.lib(浮点Cortex-M4 小端模式)。

 

2.DSP 库运行环境搭建

在MDK 里面搭建STM32F4 的DSP 运行环境(使用.lib 方式) (1)添加文件。首先,我们在例程工程目录下新建:DSP 文件夹,存放我们将要添加的文件:arm_cortexM4lf_math.lib相关头文件【STM32F4xx_DSP_StdPeriph_Lib_V1.4.0——Libraries——CMSIS——Include 这个Include 文件夹,里面包含了我们可能要用到的相关头文件】 lib文件,不参与编译,只参与链接定位,所以编译速度快,但是有点占空间。   (2)添加头文件包含路径STM32F4-浮点DSP库的MDK开发环境的设置

 

 

(3)添加全局宏定义

最后,为了使用DSP 库的所有功能,我们还需要添加几个全局宏定义:
1,__FPU_USED(已经通过Target选项卡设置)
2,__FPU_PRESENT(默认卫1)
3,ARM_MATH_CM4
4,__CC_ARM
5,ARM_MATH_MATRIX_CHECK
6,ARM_MATH_ROUNDING

注意中间用英文逗号分开。其中ARM_MATH_MATRIX_CHECK是库函数的参数检查开关,这里添加后,就打开。ARM_MATH_ROUNDING这个是库函数在运算是是否开启四舍五入的功能,我这里添加,可以根据自己的需要进行配置。ARM_MATH_CM4这个就非常重要,必须要配置进去,否则在编译之后,会默认使用math.h的库函数,而不会用到硬件的FPU的。__CC_ARM是不同编译器的编译配置宏定义,__CC_ARM就是代表MDK开发环境。  本人:USE_HAL_DRIVER(HAL库) STM32F427xx ARM_MATH_CM4 __FPU_USED=1U __FPU_PRESENT=1U __CC_ARM ARM_MATH_MATRIX_CHECK ARM_MATH_ROUNDING  

我们用到的就是sin 和cos 函数,不过实现方式不同。MDK 的标准库(math.h)提供我们:sin、cos、sinf 和cosf 等4 个函数,带f 的表示单精度浮点型运算,即float 型,而不带f的表示双精度浮点型,即double。
STM32F4 的DSP 库,则提供我们另外两个函数:arm_sin_f32 和arm_cos_f32 (注意:需要添加:arm_math.h 头文件才可使用!!!),这两个函数也是单精度浮点型的,用法同sinf 和cosf一模一样。

正点原子还有FFT的例程,可以之后观看。     浮点库的函数用法和说明,可以看看 stm32f4xx_dsp_stdperiph_lib_um.chm 文件(也在官方的固件库中)。   基本配置就是这样。    
上一篇:STM32f4日记2之pwm波输入捕获实验(可以接信号发生器,也可跟上一篇结合起来自己捕获自己)


下一篇:springSectury的应用