您的位置 首页 设计

运用STM32F4XX自带数学库“arm_math.h“

STM32-F4属于Cortex-M4F构架,这与M0、M3的最大不同就是具有FPU(浮点运算单元),支持浮点指令集,因此在处理数学运算时能比M0M3高出数十

STM32-F4归于Cortex-M4F构架,这与M0、M3的最大不同便是具有FPU(浮点运算单元),支撑浮点指令集,因而在处理数学运算时能比M0/M3高出数十倍乃至上百倍的功用,可是要充分发挥FPU的数学功用,除了#include “arm_math.h”(而非用编译器自带的math.h)以外,(arm_math.h坐落LibrariesCMSISInclude文件夹)还需求进行设置。

1、代码设置
假如没有发动FPU而运用数学函数运算时,CPU履行时以为遇到不合法指令而跳转到HardFault_Handler()中止函数中死循环。因而,需求在体系初始化时敞开FPU。在system_stm32f4xx.c中的SystemInit()函数中增加如下代码:

#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));
#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

#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
#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到工程文件中,坐落LibrariesCMSISLibARM中。

* The library installer contains prebuilt versions of the libraries in theLibfolder.
* – 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)

注:假如存储空间不允许,也能够不增加库,只增加LibrariesCMSISDSP_LibSource中需求的源文件和arm_math.h。
其他DSP运用示例见LibrariesCMSISDSP_LibExamples。

下图所示为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(离散余弦改换)和配套的初始化函数。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/257298.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部