全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 控制/MCU >

极海APM32F411微控制器硬件FPU使用指南

时间:2025-06-28 11:23

人气:

作者:admin

标签: 内核  函数    ARM  微控制器 

导读:APM32F411是一款基于32位Arm Cortex-M4F内核的微控制器。硬件FPU是Arm Cortex-M4F的一大优势。合理应用硬件FPU可以大大缩短运算时间。...

来源:转载自21ic论坛极海半导体专区

1、前言

APM32F411是一款基于32位Arm Cortex-M4F内核的微控制器。硬件FPU是Arm Cortex-M4F的一大优势。合理应用硬件FPU可以大大缩短运算时间。

2、如何开启硬件FPU

在system_apm32f4xx.c文件的SystemInit()函数里,有下图所示语句:

8adb0aea-50d0-11f0-b715-92fbcf53809c.jpg

当__FPU_PRESENT(是否带有FPU)和__FPU_USED(是否开启FPU)都为1时,硬件FPU才算成功开启。

从M4权威指南手册可以查到,SCB->CPACR的寄存器信息如下图所示:

8ae5eae6-50d0-11f0-b715-92fbcf53809c.jpg

实际应用中,CP10和CP11一般都设置为11。

8af55954-50d0-11f0-b715-92fbcf53809c.jpg

KEIL软件提供了一个非常方便的开启硬件FPU功能选项。如下图所示,点击KEIL的“魔法棒”菜单。“Target”界面中的“Floating Point Hardware”选项选择“Single Precision”。点击“OK”,完成硬件FPU开启。

8b05cea6-50d0-11f0-b715-92fbcf53809c.jpg

3、测试

通过实例测试,感受一下硬件FPU的运算速度。根据极海官网APM32F4xx_SDK_V1.4的的GPIO_Toggle例程修改,APM32F411系统时钟设置为100MHz。

3.1 开启和不开启FPU测试

部分测试代码,如下图所示。主函数包括两个函数:LED2(PE6)引脚翻转函数和测试函数。测试函数主要内容是重复执行200次data_b = data_a * 3.14159的乘法运算。

8b81c894-50d0-11f0-b715-92fbcf53809c.png

通过逻辑分析仪抓取PE6的高低电平,评估代码执行时间。

不开启硬件FPU的IO翻转时间约207.56us,如下图所示。

8b8f2f2a-50d0-11f0-b715-92fbcf53809c.png

开启硬件FPU的IO翻转时间约218.64us,如下图所示。

8b9d89a8-50d0-11f0-b715-92fbcf53809c.png

什么情况?开启硬件FPU的运算时间居然比不开启硬件FPU的运算时间要慢。

很多人使用M4/M4F产品,往往会忽略一个细节。参与运算的浮点型常量3.14159在C语言中默认是double类型常量。M4/M4F的硬件FPU只对单精度浮点数运算加速。所以,对double类型浮点数运算无效。

为什么开启硬件FPU的运算时间比不开启硬件FPU的运算时间要慢?我们从汇编代码可以看出,同样的一条乘法运算语句,不开启硬件FPU计算需要10816 - 10627 = 189个机器周期,开启硬件FPU计算需要10883 - 10692 = 191个机器周期,差了2个机器周期。

不开启硬件FPU的乘法运算汇编代码及机器周期数如下图所示:

8ba9af6c-50d0-11f0-b715-92fbcf53809c.png

8bbd22d6-50d0-11f0-b715-92fbcf53809c.png

开启硬件FPU的乘法运算汇编代码及机器周期数如下图所示:

8bcfef06-50d0-11f0-b715-92fbcf53809c.png

8bdeaeec-50d0-11f0-b715-92fbcf53809c.png

3.2 浮点型常量都加f后缀,开启和不开启FPU测试。

float类型数值取值范围是

-3.402823466×1038~3.402823466×1038,可以满足大部分应用。测试代码的浮点型常量加上后缀f,其他内容与3.1章节一致,如下图所示。

8beb84d2-50d0-11f0-b715-92fbcf53809c.png

不开启硬件FPU的IO翻转时间约73.48us,如下图所示。

8bf716a8-50d0-11f0-b715-92fbcf53809c.png

开启硬件FPU的IO翻转时间约16.4us,如下图所示。

8c037baa-50d0-11f0-b715-92fbcf53809c.jpg

这才是我们想要的效果。从汇编代码对比,同样的一条乘法运算语句,不开启硬件FPU计算需要10737 - 10677 = 60个机器周期,开启硬件FPU计算需要11176 - 11165 = 11个机器周期,差了49个机器周期。

不开启硬件FPU的乘法运算汇编代码及机器周期数,如下图所示:

8c126714-50d0-11f0-b715-92fbcf53809c.jpg

8c1f3976-50d0-11f0-b715-92fbcf53809c.jpg

开启硬件FPU的乘法运算汇编代码及机器周期数,如下图所示:

8c2fa5c2-50d0-11f0-b715-92fbcf53809c.jpg

8c3b70d2-50d0-11f0-b715-92fbcf53809c.jpg

4、结论

测试结果如下表所示

硬件FPU 浮点型常量 运行时间 data_b = data_a * 3.14159运算时间
不开启 不带f后缀 207.56us 189个机器周期
不开启 带f后缀 73.48us 60个机器周期
开启 不带f后缀 218.64us 191个机器周期
开启 带f后缀 16.4us 11个机器周期

计算没有超出float类型数值取值范围的情况,建议浮点型常量都加上后缀f,可以缩短运算时间。如果没有float类型数值运算,可以不开启硬件FPU。

对于float类型数值运算,建议开启硬件FPU,可以大大缩短运算时间。比如,该例程的语句乘法运算,开启硬件FPU的运算比未开启硬件FPU的运算少了49个机器周期数,运算时间提升约81.67%。

注:文章作者在原帖中提供了例程文件,有需要请至原文21ic论坛下载

原文地址:https://bbs.21ic.com/icview-3329150-1-1.html

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信