STM32F4 的FPU 的配置.docx

上传人:b****4 文档编号:3082844 上传时间:2022-11-17 格式:DOCX 页数:7 大小:254.10KB
下载 相关 举报
STM32F4 的FPU 的配置.docx_第1页
第1页 / 共7页
STM32F4 的FPU 的配置.docx_第2页
第2页 / 共7页
STM32F4 的FPU 的配置.docx_第3页
第3页 / 共7页
STM32F4 的FPU 的配置.docx_第4页
第4页 / 共7页
STM32F4 的FPU 的配置.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

STM32F4 的FPU 的配置.docx

《STM32F4 的FPU 的配置.docx》由会员分享,可在线阅读,更多相关《STM32F4 的FPU 的配置.docx(7页珍藏版)》请在冰豆网上搜索。

STM32F4 的FPU 的配置.docx

STM32F4的FPU的配置

STM32F4的FPU的配置

编译环境为EWARM-6601

首先看下面一段代码:

来自core_cm4.h文件

/*!

<__FPU_USEDtobecheckedpriortomakinguseofFPUspecificregistersandfunctions*/

#ifdefined(__CC_ARM)

#ifdefined__TARGET_FPU_VFP

#if(__FPU_PRESENT==1)

#define__FPU_USED1

#else

#warning"CompilergeneratesFPUinstructionsforadevicewithoutanFPU(check__FPU_PRESENT)"

#define__FPU_USED0

#endif

#else

#define__FPU_USED0

#endif

#elifdefined(__ICCARM__)//IAR编译工具的开关

#ifdefined__ARMVFP__//要求编译出的文件使用FPU功能

#if(__FPU_PRESENT==1)//检查是否有FPU功能

#define__FPU_USED1

#else

#warning"CompilergeneratesFPUinstructionsforadevicewithoutanFPU(check__FPU_PRESENT)"

#define__FPU_USED0

#endif

#else

#define__FPU_USED0

#endif

#elifdefined(__GNUC__)

#ifdefined(__VFP_FP__)&&!

defined(__SOFTFP__)

#if(__FPU_PRESENT==1)

#define__FPU_USED1

#else

#warning"CompilergeneratesFPUinstructionsforadevicewithoutanFPU(check__FPU_PRESENT)"

#define__FPU_USED0

#endif

#else

#define__FPU_USED0

#endif

#elifdefined(__TASKING__)

/*addpreprocessorcheckstodefine__FPU_USED*/

#define__FPU_USED0

#endif

这里针对各种工具链设置了相应的条件编译选项,这里只说IAR的,其他工具链的用户请参考本文自行修改.

最上层的开关是__CC_ARM这个宏,很明显这个开关是针对MDK工具的,同理IAR工具的开关就叫做__ICCARM__了;

然后一个开关就是__ARMVFP__了,这个开关要求编译出的文件使用FPU功能,但是m4的FPU并不是必装设备,某些厂家可能会不装这个东西,所以需要检查是否有FPU,即__FPU_PRESENT这个开关。

在core_cm4.h中有这样的代码:

#ifndef__FPU_PRESENT

#define__FPU_PRESENT0

#warning"__FPU_PRESENTnotdefinedindeviceheaderfile;usingdefault!

"

#endif

#ifndef__MPU_PRESENT

#define__MPU_PRESENT0

#warning"__MPU_PRESENTnotdefinedindeviceheaderfile;usingdefault!

"

#endif

由上述代码可以知道CMSIS默认的定义是没有FPU的,所以需要我们手动添加FPU存在的定义

#define__FPU_PRESENT1

这样FPU存在与否的检查就通过了,所以后面就自动定义了__FPU_USED这一开关。

因此就有了下面的定义

#define__FPU_USED1

因为m4增加了FPU(单精度浮点数),所以很多数学函数都应该用m4专用的,优化过的,而不是之前的通用函数。

打开arm_math.h文件

*Eachlibraryprojecthavedifferantpre-processormacros.

*

*ARM_MATH_CMx:

*DefinemacroARM_MATH_CM4forbuildingthelibraryonCortex-M4target,

*ARM_MATH_CM3forbuildinglibraryonCortex-M3target

*andARM_MATH_CM0forbuildinglibraryoncortex-M0target.

*

*ARM_MATH_BIG_ENDIAN:

*DefinemacroARM_MATH_BIG_ENDIANtobuildthelibraryforbigendiantargets.Bydefaultlibrarybuildsforlittleendiantargets.

*

*ARM_MATH_MATRIX_CHECK:

*Definemacroforcheckingontheinputandoutputsizesofmatrices

*

*ARM_MATH_ROUNDING:

*Definemacroforroundingonsupportfunctions

*

*__FPU_PRESENT:

*Initializemacro__FPU_PRESENT=1whenbuildingonFPUsupportedTargets.EnablethismacroforM4bfandM4lflibraries

以上代码说明:

要用ARM的数学函数得定义ARM_MATH_CMx即得有下面的定义

#defineARM_MATH_CM4

如果你想使用STM32F4的FPU功能而又不想管Project中的设置那么使用下面的代码:

 

#define__FPU_PRESENT1//FPU开关

#ifndef__ARMVFP__//要求在生成的代码中使用FPU

#define__ARMVFP__

#endif

#ifndefARM_MATH_CM4//要求使用m4的数学库函数

#defineARM_MATH_CM4

#endif

也可以在软件中开FPU功能IAR的设置如下:

MDK中的设置如下:

对于Cortex-M0或者M3处理器类型,由于没有FPU因此无法直接进行浮点运算,只能将浮点数进行Q规格化(q7、q15或Q31)处理,如开平方运算:

M0/M3只能通过迭代法(标准数学函数库)计算,而M4直接调用VSQRT指令完成。

DSP_Lib的文件结构

事实上arm_math.h文件中的定义就为源文件组使用的。

因此在将源文件组编译为库时,在应用工程中添加这个库和arm_math.h即可访问所有DSP库功能。

也可以根据需要只添加arm_math.h和需要的源文件,以缩短程序长度。

(1)BasicMathFunctions源文件组

提供浮点数的各种基本运算函数,如加减乘除等运算。

对于M0/M3只能用Q运算,即文件夹下以_q7、_q15和_q31结尾的文件;而M4能直接硬件浮点计算,属于文件夹下以_f32结尾的文件。

(2)CommonTables源文件组

arm_common_tables.c文件提供位翻转或相关参数表。

(3)ComplexMathFunctions源文件组

复数数学功能,如向量处理,求模运算的。

(4)ControllerFunctions源文件组

控制功能,主要为PID控制函数。

arm_sin_cos_f32/-q31.c函数提供360点正余弦函数表和任意角度的正余弦函数值计算功能。

(5)FastMathFunctions源文件组

快速数学功能函数,提供256点正余弦函数表和任意角度的正余弦函数值计算功能,和Q值开平方运算:

Arm_cos_f32/_q15/_q31.c:

提供256点余弦函数表和任意角度余弦值计算功能。

Arm_sin_f32/_q15/_q31.c:

提供256点正弦函数表和任意角度正弦值计算功能。

Arm_sqrt_q15/q31.c:

提供迭代法计算平方根的函数。

对于M4的平方根运算,通过执行VSQRT指令完成。

(6)FilteringFunctions源文件组

滤波函数功能,主要为FIR和LMS(最小均方根)滤波函数。

(7)MatrixFunctions源文件组

矩阵处理函数。

(8)StatisticsFunctions源文件组

统计功能函数,如求平均值、计算RMS、计算方差/标准差等。

(9)SupportFunctions源文件组

支持功能函数,如数据拷贝,Q格式和浮点格式相互转换,Q任意格式相互转换。

(10)TransformFunctions源文件组

变换功能,包括复数FFT(CFFT)/复数FFT逆运算(CIFFT)、实数FFT(RFFT)/实数FFT逆运算(RIFFT)、和DCT(离散余弦变换)和配套的初始化函数。

在IAR的环境下运行一个简单的浮点运算:

主函数如下:

通过IAR软件TerminalI/O窗口观察的输出结果

经验证无误。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1