zoukankan      html  css  js  c++  java
  • 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,该文件夹下目录结构如下所示:

    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)添加头文件包含路径
    (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 文件(也在官方的固件库中)。
     
    基本配置就是这样。
     
     
  • 相关阅读:
    仿小米网jQuery全屏滚动插件fullPage.js
    如何让低版本的IE浏览器(IE6/IE7/IE8)支持HTML5 header等新标签
    javascript--烟火效果
    javascript--15条规则解析JavaScript对象布局(__proto__、prototype、constructor)
    javascript——集合类
    javascript——可以判断值的类型的函数
    ”拍平数组“
    自定义的分页插件
    那些年,我们一起被坑的H5音频
    javascript-处理XML
  • 原文地址:https://www.cnblogs.com/YiDongZhao/p/13582841.html
Copyright © 2011-2022 走看看