使用STM32F4XX自带数学库"arm_math.h"

转载 2015年07月08日 09:51:30

转自搜狐博客Enjoy Yourself~

使用STM32F4XX自带数学库"arm_math.h"

   

    STM32-F4属于Cortex-M4F构架,这与M0、M3的最大不同就是具有FPU(浮点运算单元),支持浮点指令集,因此在处理数学运算时能比M0/M3高出数十倍甚至上百倍的性能,但是要充分发挥FPU的数学性能,除了#include “arm_math.h”(而非用编译器自带的math.h)以外,(arm_math.h位于\Libraries\CMSIS\Include文件夹)还需要进行设置。

    

1、代码设置
    如果没有启动FPU而使用数学函数运算时,CPU执行时认为遇到非法指令而跳转到HardFault_Handler()中断函数中死循环。因此,需要在系统初始化时开启FPU。在system_stm32f4xx.c中的SystemInit()函数中添加如下代码:
  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif
 
2、编译控制
    从上面的代码可以看出,当__FPU_PRESENT=1__FPU_USED=1时,编译时就加入了启动FPU的代码,CPU也就能正确高效的使用FPU进行简单的加减乘除了。但是对于复杂运算要充分发挥M4F的浮点功能,就需要使用固件库自带的arm_math.h而非编译器自带的math.h,这个文件根据编译控制项(__FPU_USED ==1)来决定是使用哪一种函数方法:如果没有使用FPU,那就调用keil的标准math.h头文件中定义的函数;如果使用了FPU,那就是用固件库自带的优化函数来解决问题。
    在arm_math.h开头部分有一些编译控制信息:
#ifndef _ARM_MATH_H
#define _ARM_MATH_H

#define __CMSIS_GENERIC              /* disable NVIC and Systick functions */

#if defined (ARM_MATH_CM4)
  #include "core_cm4.h"
#elif defined (ARM_MATH_CM3)
  #include "core_cm3.h"
#elif defined (ARM_MATH_CM0)
  #include "core_cm0.h"
#else
#include "ARMCM4.h"
#warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....."
#endif

#undef  __CMSIS_GENERIC              /* enable NVIC and Systick functions */
  #include "string.h"
  #include "math.h"


    从中可以看出,为了使用STM32F4的arm_math.h,我们需要定义ARM_MATH_CM4;否则如果不使用CMSIS的库,就会调用Keil自带的math.h。

    另外,定义控制项__CC_ARM在某些数学函数中会使用VSQRT指令(浮点运算指令),运算速度比Q指令要快很多。
    总结一下,需要在Project->Options for target"XXXX")中的C/C++选项卡的Preprocessor Symbols栏的Define中加入如下的语句:ARM_MATH_CM4, __FPU_PRESENT=1, __FPU_USED =1, __CC_ARM

    

3、添加库
    根据使用的器件和运算模式,添加arm_cortexMxx_math.lib到工程文件中,位于\Libraries\CMSIS\Lib\ARM中。


   * The library installer contains prebuilt versions of the libraries in the <code>Lib</code> folder.
   * - arm_cortexM4lf_math.lib (Little endian and Floating Point Unit on Cortex-M4)
   * - arm_cortexM4bf_math.lib (Big endian and Floating Point Unit on Cortex-M4)
   * - arm_cortexM4l_math.lib (Little endian on Cortex-M4)
   * - arm_cortexM4b_math.lib (Big endian on Cortex-M4)
   * - arm_cortexM3l_math.lib (Little endian on Cortex-M3)
   * - arm_cortexM3b_math.lib (Big endian on Cortex-M3)
   * - arm_cortexM0l_math.lib (Little endian on Cortex-M0)
   * - arm_cortexM0b_math.lib (Big endian on Cortex-M3)


注:如果存储空间不允许,也可以不添加库,只添加\Libraries\CMSIS\DSP_Lib\Source中需要的源文件和arm_math.h。
    其他DSP使用示例见\Libraries\CMSIS\DSP_Lib\Examples。

 

下图所示为DSP_Lib的文件结构

BasicMathFunctions
提供浮点数的各种基本运算函数,如加减乘除等运算。对于M0/M3只能用Q运算,即文件夹下以_q7、_q15和_q31结尾的文件;而M4F能直接硬件浮点计算,属于文件夹下以_f32结尾的文件。
CommonTables
arm_common_tables.c文件提供位翻转或相关参数表。
ComplexMathFunctions
复述数学功能,如向量处理,求模运算的。
ControllerFunctions
控制功能,主要为PID控制函数。arm_sin_cos_f32/-q31.c函数提供360点正余弦函数表和任意角度的正余弦函数值计算功能。
FastMathFunctions
快速数学功能函数,提供256点正余弦函数表和任意任意角度的正余弦函数值计算功能,和Q值开平方运算:
Arm_cos_f32/_q15/_q31.c:提供256点余弦函数表和任意角度余弦值计算功能。
Arm_sin_f32/_q15/_q31.c:提供256点正弦函数表和任意角度正弦值计算功能。
Arm_sqrt_q15/q31.c:提供迭代法计算平方根的函数。对于M4F的平方根运算,通过执行VSQRT指令完成。
FilteringFunctions
滤波函数功能,主要为FIR和LMS(最小均方根)滤波函数。
MatrixFunctions
矩阵处理函数。
StatisticsFunctions
统计功能函数,如求平均值、计算RMS、计算方差/标准差等。
SupportFunctions
支持功能函数,如数据拷贝,Q格式和浮点格式相互转换,Q任意格式相互转换。
TransformFunctions
变换功能。包括复数FFT(CFFT)/复数FFT逆运算(CIFFT)、实数FFT(RFFT)/实数FFT逆运算(RIFFT)、和DCT(离散余弦变换)和配套的初始化函数。

 

                                                           BY: JOY 2013年8月28日

使用STM32F4XX自带数学库"arm_math.h"

转自搜狐博客Enjoy Yourself~ 使用STM32F4XX自带数学库"arm_math.h"         STM32-F4属于Cortex-M4F构架,这与M0、M3的最...
  • wl111143
  • wl111143
  • 2015年08月18日 16:35
  • 4618

一个基于NEON指令的数学库

这是一个开源的库,地址为https://code.google.com/p/math-neon/,根据项目介绍应该是利用neon指令实现的数学库:包括三角、对数、指数等基于浮点的运算实现,以及矩阵运算...
  • alien75
  • alien75
  • 2013年06月19日 15:20
  • 5827

使用STM32F4XX自带数学库"arm_math.h"

使用STM32F4XX自带数学库"arm_math.h"         STM32-F4属于Cortex-M4F构架,这与M0、M3的最大不同就是具有FPU(浮点运算单元),支持浮点指令...
  • cfxzy
  • cfxzy
  • 2014年12月10日 19:58
  • 1836

如何在windows下使用开源数学库

几个有用的数学库,GMP,MPIR,MPFR,MPC,CGAL,GSL。 前两个是大整数库,MPFR是浮点库,MPC是复数库,CGAL是计算几何库,GSL是gnu的科学计算库,C语言写的。 GSL...
  • hongqiang200
  • hongqiang200
  • 2011年12月09日 15:00
  • 4402

来自@Golden_Shadow 我的3D引擎数学库实现文件

#include "stdafx.h"   #include    #include "MyMath.h"      float FastSin(float theta)   {     ...
  • a6813140
  • a6813140
  • 2016年06月18日 21:35
  • 380

STM32F4XX工程步骤

一:建立文件夹 1.复制库函数中Libraries文件夹到你所需建立工程的文件夹下,例:我在Example文件夹下建立工程,那么把Libraries文件夹复制到Example。 2.在你所需建立工程的...
  • jinxifengjieai
  • jinxifengjieai
  • 2014年02月22日 09:27
  • 2427

ubuntu环境下 C编程 之 数学函数库的调用

/* 解析:数学函数库(math.h)使用 -lm 快捷调用,具体可查寻资料。 保存文件名 a.c , 终端运行: ping@ubuntu:~$ cd /home/ping/桌面/ ping@ub...
  • lijunqiangacm
  • lijunqiangacm
  • 2013年05月04日 15:06
  • 1208

3D数学 数学通用函数库源代码(附中文注释)

///////////////////////////////////////////////////////////////////////////// // // 3D数学基础:游戏与图形开发 ...
  • sinat_24229853
  • sinat_24229853
  • 2015年11月09日 10:40
  • 691

OpenGL数学基础之矩阵

三维空间物体的运动使用变换来表示,包括三种:平移变换(translate),旋转变换(rolate),伸缩变换(scale),变换量可以使用4x4的矩阵(Matrix)表示,变换过程就是对物体的所有顶...
  • xufeng0991
  • xufeng0991
  • 2016年07月25日 00:10
  • 837

unity 中的 数学函数库(完善中)

今天我在做一个小的demo:就是一个cube 在上升的过程中,检测transform.position.y。然后根据transform.position.y的值在UGUI上面添加分数。完整的程序是这样...
  • yy763496668
  • yy763496668
  • 2016年03月09日 10:29
  • 909
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用STM32F4XX自带数学库"arm_math.h"
举报原因:
原因补充:

(最多只允许输入30个字)