打印

Keil 中如何使用 STM32F4xx 单片机硬件浮点单元

[复制链接]
570|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
追光少年|  楼主 | 2018-7-15 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一.前言
有工程师反应说 Keil 下无法使用 STM32F4xx 硬件浮点单元, 导致当运算浮点时运算时间过长,还有 一些人反应不知如何使用芯片芯片内部的复杂数**算,比如三角函数运算。针对这个部分本文将详 细介绍如何使用硬件浮点单元以及相关数**算。

二.问题产生原因
1. ------对于 Keil MDK Version 5 版本, 编译器已经完全支持 STM32F4xx 的 FPU(浮点运算单元),可以直接 使用STM32芯片内部的浮点运算单元。
2. ------对于 Keil MDK Version 4 版本, 高版本 v4, 比如当前 keil 官网可下载的 v4.74.0.0 版本也已经支持 FPU, 可以直接使用芯片内部浮点运算。但如果使用低版本 v4,如 v4.23.0.0 版本, 则需要对软件进行相应 设置。

三. 如何解决问题
1. 查看手头 Keil 版本是否支持 FPU,最简单办法是进入 Keil 调试界面直接查看 0xE000ED88 地址单元数据, 如果为0x00F00000, 则说明已经支持 FPU,如下图所示 2. 如果 0xE000ED88 地址数据为 0x00000000,则需要做如下操作:
a. 在 system_stm32f4xx.c 文件中的 systeminit()函数里面添加如下代码
/* FPU settings ------------------------------------------------------------*/
#if ( FPU_PRESENT == 1) && ( FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
b. 在工程选项(Project->Options for target "XXXX")中的 C/C++选项卡的 Define 中加入如下的语句, 见下图所示:
FPU_PRESENT=1, FPU_USED =1。

c. 这样编译时就加入了启动 FPU 的代码,CPU 也就能正确高效的使用 FPU 进行简单的加减乘除了。
3. 进一步说明使用芯片复杂数**算使用
对于复杂运算,比如三角函数,开方等运算,需要如下设置:
a. 包含 arm_math.h 头文件。
b. 在工程选项的 C/C++选项卡的 define 中继续加入语句 ARM_MATH_CM4。
c. 在工程选项的 C/C++选项卡的 define 中继续加入语句 CC_ARM。
以使用 sin,cos 运算举例,需要调用 arm_sin_f32()以及 arm_cos_f32(),这两个函数定义在 arm_sin_f32.c 和arm_cos_f32.c 中,需要在工程中加入这两个 c 文件。
在 ST 库文件包中的文件目录如下:
stm32f4_dsp_stdperiph_libSTM32F4xx_DSP_StdPeriph_Lib_V1.1.0LibrariesCMSISDSP_LibSourceFastMathFunctions
在 keil 安装目录下的文件目录如下:
KeilARMCMSISDSP_LibSourceFastMathFunctions
当用到更多数**算, 如开根号,三角运算,求绝对值等等,客户也可以直接在工程中加入 ARM 中 的数**算库arm_cortexM4lf_math.lib,而不需要一个个文件的添加,
在 ST 库文件包中的目录如下:
stm32f4_dsp_stdperiph_libSTM32F4xx_DSP_StdPeriph_Lib_V1.1.0LibrariesCMSISLibARM
在 keil 安装目录下的文件目录如下:
KeilARMCMSISLibARM


四. 结语
从测试效果看当使用了硬件浮点运算单元,数学计算变得简单高效,可以留给系统更多时间处理其他 控制程序, 有效提升系统效率,节省时间。


下载Keil  中使用 STM32F4xx 硬件浮点单元原文
更多STM32实战经验

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

379

主题

379

帖子

0

粉丝