我造輪子,你造車,創客一起造起來!塔克創新資訊【塔克社區 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/ 】
本文介紹X-CTR100控制器 DSP庫的使用,對STM32F4的DSP庫有個基本的了解,並針對三角函數有無DSP指令進行性能測試。
原理
STM32F4采用Cortex-M4內核,相比Cortex-M3系列除了內置硬件FPU單元,在數字信號處理方面還增加了DSP指令集,支持諸如單周期乘加指令(MAC),優化的單指令多數據指令(SIMD),飽和算數等多種數字信號處理指令集。相比Cortex-M3,Cortex-M4在數字信號處理能力方面得到了大大的提升。Cortex-M4執行所有的DSP指令集都可以在單周期內完成,而Cortex-M3需要多個指令和多個周期才能完成同樣的功能。
ST官方提供了一整套的DSP庫方便我們開發使用,在ST提供的標准庫:stm32f4_dsp_stdperiph_lib.zip里面就有。
目錄STM32F4xx_DSP_StdPeriph_Lib_V1.4.0→Libraries→CMSIS→DSP_Lib下可以找到DSP庫文件和測試實例。
Sourse中是所有DSP庫文件源代碼,Examples文件夾下是一些測試實例。
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(離散余弦變換)和配套的初始化函數。
ST提供了.lib格式的文件,方便使用這些庫。這些.lib文件就是由Source文件夾下的源碼編譯生成的,如果想看某個函數的源碼,可以在Source文件夾下面查找。.lib格式文件路徑:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0→Libraries→CMSIS→Lib→ARM,總共有8個.lib文件,和M4F相關的有兩個:
arm_cortexM4bf_math.lib(浮點Cortex-M4大端模式)
arm_cortexM4lf_math.lib(浮點Cortex-M4小端模式)
STM32F4的內核CortexM4F采用小端模式,所以選擇:arm_cortexM4lf_math.lib(浮點Cortex-M4小端模式)。
例程
本例程 通過計算兩種方法計算三角函數,測量計算時間,間接進行性能對比。
硬件說明
硬件資源:
- 串口UART1
硬件連接:
使用MicroUSB數據線連接X-CTR100 COM接口。
軟件說明
將DSP Lib庫加入到工程,相關頭文件已在X工程模板中加入。
使用DSP庫的所有功能,還需要添加以下幾個全局宏定義:
1、__FPU_USED
2、__FPU_PRESENT
3、ARM_MATH_CM4
4、__CC_ARM
5、ARM_MATH_MATRIX_CHECK
6、ARM_MATH_ROUNDING
在main.c文件中包含如下頭文件。
#include "math.h" //標准數學函數庫 #include "arm_math.h" //使用DSP的數學函數庫 |
測試代碼如下,分別使用DSP庫三角函數和標准三角函數進行計算,測量計算時間,時間越少性能越好。
int main(void) { uint32_t i, tmp; float angle; float sinx, cosx;
/* X-CTR100初始化 */ AX_Init(115200); printf("***X-CTR100 DSP指令集性能測試例程***\r\n\r\n");
//模塊初始化及配置 AX_TIMER_TIM6_Init(1);
while (1) { //不使用DSP優化的sin,cos函數 AX_TIMER_TIM6_SetCounter(0); for (i = 0; i<20000; i++) { cosx = cosf(angle); sinx = sinf(angle); angle += 0.001f;//角度自增 } tmp = AX_TIMER_TIM6_GetCountert(); printf("無DSP 運行時間:%d us | ", tmp);
//有使用DSP優化的sin,cos函數 AX_TIMER_TIM6_SetCounter(0); for (i = 0; i<20000; i++) { cosx = arm_cos_f32(angle); sinx = arm_cos_f32(angle); angle += 0.001f;//角度自增 } tmp = AX_TIMER_TIM6_GetCountert(); printf("有DSP 運行時間:%d us \r\n", tmp);
AX_Delayms(1000); AX_LEDG_Toggle(); } } |
實現效果
測試結果如下圖,有DSP情況下計算速度提升約1倍左右。
總結
通過本文學習,可以了解STM32F4DSP指令集及ST提供DSP庫的使用。項目中如果需要頻繁的數學運算,並有性能要求,建議使用DSP相關計算函數。
參考
正點原子——ALIENTEK探索者STM32F407開發板相關資料