一句话: 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 的 VMOVVADDVMUL 指令——和整数运算一样快。


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个时钟,快几十倍

有用的话点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。

下一篇保姆级教程——状态机、编码规范、编译链接——每个嵌入式新人都要过的三道坎

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐