前言
本应用笔记介绍了如何使用STM32 Cortex®-M4和STM32 Cortex®-M7微控制器中可用的浮点
单元(FPU),并对浮点运算作了简要介绍。
X-CUBE-FPUDEMO固件是为改进双精度FPU而开发,并能演示使用此硬件实现所带来的改进。
第 4节:应用程序示例中给出了两个示例
目录
1 浮点算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.1 定点或浮点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2 浮点单元(FPU) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2 浮点运算的IEEE标准(IEEE 754) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.1 概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2 数字格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2.1 归一化数字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.2 非归一化数字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2.3 零 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2.4 无穷数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2.5 NaN(非数字) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2.6 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 舍入模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
2.4 算术运算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
2.5 数字转换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
2.6 异常和异常处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
2.7 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3 STM32 Cortex®-M浮点单元(FPU) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.1 特殊操作模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2 浮点状态和控制寄存器(FPSCR) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.1 代码条件位:N,Z,C,V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.2 模式位:AHP,DN,FZ,RM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.3 异常标志 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3 异常管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.4 程序员模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.5 FPU指令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.5.1 FPU算术指令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.5.2 FPU的比较与转换指令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.5.3 FPU加载/存储指令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4 应用程序示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.1 Julia集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2 在STM32F4上实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.3 在STM32F7上实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.4 结果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.5 Mandelbrot集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.6 结论 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5 参考文档 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6 版本历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
表格索引
表1. 整数动态 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
表2. 浮点数动态 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
表3. 归一化数字范围. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
表4. 非归一化数字范围 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
表5. IEEE.754数字格式的数值范围 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
表6. STM32 Cortex®-M4/-M7 中的FPU实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
表7. FPSCR寄存器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
表8. 一些浮点单精度数据处理指令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
表9. 一些浮点双精度数据处理指令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
表10. 基于硬件单精度FPU与软件运算的CORTEX® -M4性能比较
利用MDK-ARM™工具链V5.17的FPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
表11. 基于硬件单精度FPU与软件运算的CORTEX® -M7性能比较
利用MDK-ARM™工具链V5.17的FPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
表12. 基于硬件双精度FPU与软件运算的CORTEX® -M7性能比较
利用MDK-ARM™工具链V5.17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
表13. 参考文档 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
表14. 文档版本历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
表15. 中文文档版本历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
图片索引
图1. IEEE.754单精度和双精度浮点编码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
图2. 其值采用8 bpp蓝色编码的Julia集(c=0.285+i.0.01). . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
图3. 其值采用RGB565调色板编码的Julia集(c=0.285+i.0.01) . . . . . . . . . . . . . . . . . . . . . . . . 20
图4. 利用MDK-ARM™工具链V5.17配置FPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
图5. zoom in =1时Mandelbrot-set的图像 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
图6. Mandelbrot-set图像,使用双精度FPU,放大了48倍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
图7. Mandelbrot-set图像,使用单精度FPU,放大了32倍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
--------------------------------------