STM32-F4屬于Cortex-M4F構架,這與M0、M3的最大不同就是具有FPU(浮點運算單元),支持浮點指令集,因此在處理數學運算時能比M0/M3高出數十倍甚至上百倍的性能,但是要充分發揮FPU的數學性能,除了#include “arm_math.h”(而非用編譯器自帶的math.h)以外,(arm_math.h位于LibrariesCMSISInclude文件夾)還需要進行設置。
本文引用地址:http://cqxgywz.com/article/201611/322357.htm1、代碼設置
如果沒有啟動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(離散余弦變換)和配套的初始化函數。
評論