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 */
通過設置以上兩個宏定義即可使能硬件FPU。
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 庫運行環境搭建

最后,為了使用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
我們用到的就是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一模一樣。