1. 程式人生 > 實用技巧 >STM32F4-浮點DSP庫的MDK開發環境的設定

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 檔案(也在官方的韌體庫中)。 基本配置就是這樣。