STM32F1 和 F4 的 FPU 差多远?一条浮点指令几十倍
·
一句话: STM32F1(Cortex-M3)没有硬件 FPU,算 float 全靠软件模拟,一条加减几十到上百个时钟周期。STM32F4(Cortex-M4)有单精度硬件 FPU,一条浮点指令单周期。差几十倍——如果你项目里浮点运算多,选 F4 或者换定点算法。
系列文章:《嵌入式编程基础》 — 状态机、编码规范、编译链接——每个嵌入式新人都要过的三道坎
📄 保姆级教程 📄 170条实战总结 📄 3分钟看懂Keil编译输出 ✅ 一条浮点指令差几十倍 📄 为什么两个都要 📄 复制粘贴超过2次就该停 📄 两个变量搞定开/关/空闲 📄 先画条件矩阵再取名 📄 dead-code-chain-deletion 📄 macro-derive-coefficients
@[TOC]
适合谁读:适合嵌入式开发者、单片机初学者及遇到类似问题的工程师
同一个 float 加法,编译出的东西完全不同
float a = 1.5f;
float b = 2.3f;
float c = a + b;
| STM32F1 (Cortex-M3) | STM32F4 (Cortex-M4) | |
|---|---|---|
| FPU | 无 | 有(单精度) |
| float 加法 | 调用软浮点库函数 | 一条 VADD.F32 指令 |
| 耗时 | 几十到上百个时钟周期 | 1 个时钟周期 |
| 倍率 | 基准 | 快几十倍 |
F4 直接用硬件 FPU 的 VMOV、VADD、VMUL 指令——和整数运算一样快。
CPACR 寄存器:F4 上不配这个,FPU 也用不了
F4 虽然有硬件 FPU,但默认是关的。需要在初始化时打开:
// 开启 FPU — 必须在 main 之前或最开始执行
SCB->CPACR |= ((3UL << 10*2) | (3UL << 11*2));
// 使能 CP10 和 CP11(FPU 协处理器)
F1 没有这个寄存器。如果手滑写到 F1 的 CPACR 地址(不存在),直接进 HardFault。
如果你的芯片没有 FPU
三个选择:
| 方案 | 做法 | 适用场景 |
|---|---|---|
| 换芯片 | F1 → F4/F7/H7 | 预算够、浮点计算多 |
| 定点数 | 用整数存小数,移位替代浮点 | 无 FPU 的芯片,如 F1、M0 |
| 编译器优化 | 开 -ffast-math |
精度要求不高的场景 |
定点数是最通用的——不管什么芯片都能用。原理参考前面的定点数 UQ 格式文章。
总结
| 要点 | 说明 |
|---|---|
| M3 vs M4 | M3 无 FPU,M4 有硬件单精度 FPU |
| 性能差距 | 一条浮点运算差几十倍 |
| F4 用 FPU | 必须在启动时配 CPACR 寄存器 |
| F1 写了 CPACR | HardFault |
| 没 FPU 怎么算小数 | 定点数(整数存小数) |
实测对比:STM32F1 float加法: 几十~上百个时钟 | STM32F4 float加法: 1个时钟,快几十倍
有用的话点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。
下一篇:保姆级教程——状态机、编码规范、编译链接——每个嵌入式新人都要过的三道坎
更多推荐



所有评论(0)