手把手选开发板:F103、F401、F407 该怎么选?
你有没有过这种经历?项目刚起步,信心满满地画完原理图,结果烧录程序时发现——内存不够用了。😅 或者想做个带触摸屏的小设备,折腾半天才发现主控根本跑不动图形库,UI 刷新像幻灯片……更离谱的是,为了省几块钱用了 F103,最后因为外设不足被迫改板三次,成本翻倍。
这事儿太常见了。尤其是在嵌入式开发中, 选错 MCU 就等于从起点开始挖坑 。而 STM32 家族里的 F103、F401、F407 ,名字看着挺像,实际能力却差出好几个量级。很多人以为“都是 STM32”,随便用哪个都行,结果就是:要么性能过剩、白白多花钱;要么资源吃紧,项目卡在最后一步动弹不得。
那到底该怎么选?别急,今天我们不整虚的,也不堆参数表念经。咱们就从真实项目场景出发,掰开揉碎讲清楚这三款芯片的本质区别——不是“它有什么”,而是“你能拿它干什么”。
先说结论:一句话帮你定方向 🎯
- STM32F103 :适合做“开关”——控制继电器、读传感器、跑个 PID,性价比之王;
- STM32F401 :适合做“脑子”——处理数据、跑 FreeRTOS、带个小屏,功耗还低;
- STM32F407 :适合做“主机”——驱动大屏、接摄像头、走以太网,复杂系统一把抓。
如果你现在只想知道该用哪个,看到这儿就可以去下单了。但如果你想搞明白“为什么是它”,避免下次再踩坑,那就继续往下看。我们一个个来拆解。
STM32F103:那个谁都认识的“蓝丸”
它是谁?
F103 是很多人的 STM32 启蒙芯片。尤其是那块被称为“蓝丸”(Blue Pill)的最小系统板,配上 GD32 的国产替代,一度把价格干到了 5 块钱一片。学生党、创客圈、课程实验里随处可见它的身影。
核心配置也很朴实:
- 内核:Cortex-M3 @ 72MHz
- Flash:64~128KB
- SRAM:20KB
- 外设:USART/I2C/SPI/CAN/ADC 都有,够用但不多
听起来不多吧?可就是这块芯片,撑起了无数入门项目的半边天。
它能干啥?
举几个典型的使用场景你就明白了:
- 智能插座的主控:定时开关 + 电流检测;
- 四轴飞行器的飞控底层:接收遥控信号、驱动电机电调;
- 工业现场的 IO 模块:采集温度、控制电磁阀;
- 学生课程设计:电子秤、温控风扇、红外遥控……
这些任务有个共同点: 逻辑简单、实时性要求高、不需要复杂计算或大量内存 。
而且 F103 的响应速度是真的快。得益于 Cortex-M3 架构优秀的中断嵌套机制(NVIC),它可以做到微秒级响应外部事件。比如你在电机控制中需要精确捕获编码器脉冲,F103 就很胜任。
生态有多成熟?
这么说吧,你在百度搜“STM32 LED闪烁”,前 10 条结果九条都是基于 F103 的教程。Keil、IAR、GCC 全支持,标准外设库、HAL 库、LL 库任你挑。Arduino 社区还有 Maple Core 可以直接用 Arduino IDE 编程。
PlatformIO 里新建一个
bluepill_f103c8
环境,两分钟就能点亮 LED。社区论坛上随便一问,“串口不通怎么办?”、“ADC 读不准?”——答案清一色:“检查时钟使能!” 😂
没错, “先开时钟再操作外设” 这个 STM32 的铁律,最早就是从 F103 开始深入人心的。
实战代码看看:GPIO 控制其实很基础
#include "stm32f10x.h"
void Delay(volatile uint32_t nCount) {
while(nCount--) __NOP();
}
int main(void) {
// ⚠️ 第一步永远是开时钟!
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStruct);
while (1) {
GPIO_SetBits(GPIOC, GPIO_Pin_13);
Delay(0xFFFFF);
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
Delay(0xFFFFF);
}
}
这段代码看起来很简单,但它揭示了一个关键问题: F103 上所有操作都依赖手动配置寄存器或调用库函数 。没有自动初始化,也没有运行时环境帮你兜底。你得自己管好每一个细节。
这也意味着它的学习曲线虽然平缓,但深入之后会遇到瓶颈。
那它不能干啥呢?
别看它人气高,F103 的短板也非常明显:
❌ 没有浮点单元(FPU)
一旦涉及浮点运算,比如你要做卡尔曼滤波、FFT 分析、PID 参数动态调整,F103 就只能靠软件模拟。效率极低,一个
sqrt(2)
可能耗费几百个周期。
我曾经在一个姿态解算项目里硬上 F103 跑四元数更新,结果主循环频率直接从 1kHz 掉到 200Hz,IMU 数据滞后严重,飞机起飞就翻。
❌ 内存太小
20KB SRAM 看似不少,但当你尝试运行 FreeRTOS 创建三个任务,每个任务栈分配 512 字节,再加上消息队列、互斥锁、协议缓冲区……很快就会爆掉。
更别说你想显示一张 160x80 的 RGB 图片,光帧缓冲就要 160×80×2 = 25.6KB —— 比整个 SRAM 还大 !
❌ 不支持外部存储
没有 FSMC/DMA 控制器,无法外扩 SDRAM 或 NOR Flash。想做大容量日志记录?抱歉,只能靠 SPI Flash 慢吞吞写,还得自己管理 wear leveling。
所以结论很清楚: F103 很适合做“执行单元”,但不适合当“决策中心” 。
STM32F401:被低估的“全能选手”
如果说 F103 是老前辈,那 F401 就是新一代的务实派。它不像 F407 那样耀眼,但却悄悄成了中端产品的首选。
典型代表是 Nucleo-F401RE 开发板上的
STM32F401RE
,参数如下:
- 内核:Cortex-M4 @ 84MHz(带单精度 FPU)
- Flash:512KB
- SRAM:96KB(64KB SRAM1 + 32KB SRAM2)
- 支持 USB OTG FS、SDIO、多种低功耗模式
是不是感觉一下子宽裕多了?
它强在哪?
三个字: 能效比 。
相比 F103,F401 在几乎不增加功耗的前提下,带来了质的飞跃:
✅ 真·浮点运算
内置 FPU 后,浮点指令不再是噩梦。像
sin()
、
cos()
、
sqrtf()
这些数学函数可以直接硬件执行,速度提升 5~10 倍不是问题。
举个例子:你在做一个心率监测设备,需要用 FFT 提取脉搏波频谱特征。在 F103 上跑一次 FFT 可能要 50ms,在 F401 上只要 6ms —— 这意味着你可以实现准实时分析,甚至加上滤波算法也不卡。
#include "stm32f4xx.h"
float compute_fft_magnitude(float real, float imag) {
return sqrtf(real * real + imag * imag); // 硬件 FPU 加速!
}
int main(void) {
SystemInit(); // 自动设置系统时钟至 84MHz
float x = 3.5f, y = 4.5f;
float result;
while (1) {
result = compute_fft_magnitude(x++, y--);
Delay(1000000);
}
}
注意这里的
sqrtf()
—— 如果你在 F103 上编译同样的代码,链接器会自动引入软浮点库,体积膨胀不说,运行也慢。而在 F401 上,这条指令会被翻译成
vsqrt.f32
直接由 FPU 执行。
✅ 更大的内存空间
96KB SRAM 是什么概念?你可以轻松运行 FreeRTOS 并创建 4~5 个任务,每个任务分配 1KB 栈空间都没压力。还可以为 UI 框架预留一部分内存作为绘图缓冲区。
我自己做过一个便携式示波器原型,用 F401 + 2.4 寸 TFT 屏(SPI 接口),通过 DMA+DCMI 采集图像数据,再用 LittlevGL 渲染界面。虽然刷新率只有 15fps,但已经足够看清波形趋势了。
✅ 功耗控制优秀
F401 支持四种电源模式:
- Run:全速运行,典型电流 ~80mA
- Sleep:内核停止,外设仍工作,~20mA
- Stop:电压调节器进入低功耗模式,~3.5μA
- Standby:仅备份域供电,<1μA
这意味着你可以把它用在电池供电设备中。比如智能手环、无线传感器节点、手持仪表等,平时休眠,触发中断后再唤醒处理数据。
✅ 引脚兼容性好
有意思的是,F401RE 和 F103RCT6 是 LQFP64 封装, 引脚基本兼容 !也就是说,如果你原来用 F103 做了个项目,现在觉得性能不够,可以直接换上 F401 升级,PCB 不用改。
当然,电源设计和晶振匹配要注意,但这已经是最大程度的平滑迁移了。
它也不是万能的
尽管 F401 综合素质很强,但它依然有一些限制:
❌ 没有 FSMC 接口
无法直接驱动并行接口的大尺寸 LCD 屏(如 ILI9341 的 16 位模式)。你只能通过 SPI 或 8080 方式驱动小屏,刷新率受限。
我在调试一个带 GUI 的仪器面板时就吃过亏:SPI 接口最大也就 30MHz,刷一屏 240x320 的画面要将近 50ms,用户滑动菜单明显卡顿。
后来换成 FSMC 接口的 F407,瞬间丝滑。
❌ Flash 访问有延迟
虽然主频提到 84MHz,但 Flash 访问需要等待状态(Wait State)。如果不开启预取缓冲(Prefetch Buffer)和指令缓存(ICache),性能会打折扣。
建议在初始化时加上这几行:
RCC_HSEConfig(RCC_HSE_ON);
while(!RCC_GetFlagStatus(RCC_FLAG_HSERDY));
FLASH_SetLatency(FLASH_Latency_2); // 3 WS for 84MHz
FLASH_PrefetchBufferCmd(ENABLE);
FLASH_InstructionCacheCmd(ENABLE);
否则你会发现代码跑得还不如 F103 快,冤不冤?
❌ USB 功能有限
只支持 USB FS(全速 12Mbps),不能做高速设备。如果要做音频传输或者大文件传输,带宽就成了瓶颈。
STM32F407:真正的“工业级主力”
终于说到这位重量级选手了。F407 是什么定位?这么说吧,在正点原子、野火、安富莱这些主流开发板厂商的产品线里, F407 几乎是高端 STM32 的代名词 。
以
STM32F407ZGT6
为例:
- 主频:168MHz
- Flash:1MB
- SRAM:192KB(含 64KB CCM RAM)
- 外设豪华套餐:FSMC、Ethernet MAC、USB HS、DCMI、CRC 单元……
简直是把能塞的都塞进去了。
它凭什么贵?
因为它解决的是“系统级需求”。
想象一下你要做一个工业 HMI(人机界面)设备,要求:
- 显示 800x480 分辨率的彩色界面;
- 支持触控操作;
- 实时采集多个传感器数据;
- 通过网线上传到服务器;
- 支持远程固件升级(OTA);
- 断电后保存配置参数。
这种项目,F103 连门槛都摸不到,F401 也只能勉强支撑,唯有 F407 能从容应对。
✅ ART Accelerator™ 技术:让 Flash 不拖后腿
这是 ST 的一项黑科技。普通 MCU 超过 100MHz 后,Flash 访问速度跟不上 CPU,必须插入等待周期,导致性能下降。而 F407 通过内置 自适应实时加速器(ART Accelerator) ,实现了在 168MHz 下 0 等待执行 Flash 中的代码。
怎么做到的?它用了三招:
1.
指令预取队列
(64-bit wide bus)
2.
64 字节指令缓存
3.
64 字节数据缓存
最终达成 1.25 DMIPS/MHz 的实测性能,接近理论峰值。相当于你在 Flash 里跑代码,感觉就像在 RAM 里一样快。
✅ FSMC:打通外部存储的任督二脉
FSMC(Flexible Static Memory Controller)是 F407 的王牌功能之一。它允许你外接各种静态存储器,比如:
- SRAM(如 IS61WV51216)→ 当作高速缓存
- NOR Flash(如 S29GL064)→ 存放字体、图片资源
- SDRAM(如 IS42S16400J)→ 支持 8MB 以上内存扩展
最常用的就是接 SDRAM 来存放 UI 帧缓冲区。比如你要显示 800x480 的 RGB565 图像,一帧就需要 800×480×2 = 750KB —— 远超片上 SRAM 容量。
有了 FSMC,你可以把帧缓冲区放到外部 SDRAM 中,CPU 通过地址映射直接访问,就像操作内部内存一样方便。
下面是一个简化的 FSMC 初始化代码:
void FSMC_Init_SDRAM(void) {
FSMC_NORSRAMInitTypeDef fsmc_init;
FSMC_NORSRAMTimingInitTypeDef timing;
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE |
RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG, ENABLE);
// PD0=DM0, PD1=D1, ..., PG15=A15 等等,共用几十个引脚
timing.FSMC_AddressSetupTime = 2;
timing.FSMC_AddressHoldTime = 1;
timing.FSMC_DataSetupTime = 2;
timing.FSMC_BusTurnAroundDuration = 0;
timing.FSMC_CLKDivision = 0;
timing.FSMC_DataLatency = 0;
timing.FSMC_AccessMode = FSMC_AccessMode_A;
fsmc_init.FSMC_Bank = FSMC_Bank1_NORSRAM1;
fsmc_init.FSMC_MemoryType = FSMC_MemoryType_SDRAM;
// ... 其他配置略
FSMC_NORSRAMInit(&fsmc_init);
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}
这套机制让 F407 成为少数能在裸机环境下流畅运行 LVGL、TouchGFX 等图形框架的 STM32 芯片。
✅ 内置 Ethernet MAC:物联网网关的理想选择
F407 集成了完整的 10/100 Mbps 以太网 MAC 控制器,只需外接一个 PHY 芯片(如 LAN8720、KSZ8081),就能实现 TCP/IP 通信。
配合 LwIP 协议栈,你可以轻松搭建 Web Server、MQTT 客户端、NTP 时间同步等功能。
对比之下,F103/F401 只能靠 SPI 接 W5500 模块,不仅占用 SPI 总线,而且协议栈运行在应用层,效率低、延迟高。
而 F407 的以太网控制器支持 DMA 传输,CPU 几乎不用干预收发过程,腾出更多资源处理业务逻辑。
✅ 其他杀手级外设
- USB OTG HS + FS :支持高速 USB(480Mbps),可做 UVC 视频采集设备;
- DCMI 接口 :连接 OV2640/OV5640 摄像头模组,实现拍照或视频流;
- CRC 计算单元 :硬件加速 CRC32 校验,适用于 OTA 升级包验证;
- MPU(内存保护单元) :防止任务越界访问,提升系统稳定性。
实际项目怎么选?来看几个案例 💡
场景一:做个蓝牙遥控小车
功能需求:
- 读取 Joystick 摇杆数据;
- 通过蓝牙模块(HC-05)发送给手机;
- 控制两个直流电机转动。
分析:
- 计算量小,无图形界面;
- 对成本敏感;
- 使用电池供电,希望功耗低。
✅ 推荐:
F103C8T6
理由:完全够用,还能省下一半成本。GD32F103 也能完美替代。
场景二:智能健康手环
功能需求:
- 采集心率、血氧、加速度计数据;
- 做简单的滤波和步数统计;
- OLED 显示时间、步数;
- 支持低功耗待机。
分析:
- 需要浮点运算处理传感器数据;
- 要运行 RTOS 实现多任务调度;
- 功耗必须低。
✅ 推荐:
F401CE
理由:FPU 加速算法,Stop 模式下电流仅几微安,SRAM 足够跑 FreeRTOS + 传感器融合任务。
场景三:工厂车间监控终端
功能需求:
- 接多个 Modbus 设备采集数据;
- 显示在 7 寸 RGB 屏上;
- 支持触控操作;
- 通过网口上传数据到 MES 系统;
- 支持远程升级固件。
分析:
- 多任务并发;
- 图形渲染压力大;
- 网络通信频繁;
- 数据吞吐量高。
✅ 推荐:
F407ZGT6
理由:FSMC 驱动大屏,Ethernet 实现联网,1MB Flash 支持 OTA,CCM RAM 提升关键任务响应速度。
选型避坑指南:别再犯这些错误 🚫
❌ 错误一:“我要做 UI,先上 F103”
结果:LVGL 编译失败,提示内存不足;强行裁剪后勉强运行,但按钮点击延迟半秒。
📌 正确做法:小型 UI(<240x240)可用 F401 + SPI 屏;大屏必选 F407 + FSMC。
❌ 错误二:“反正都能用,图便宜选 F103”
结果:后期加功能发现没外设了,UART 占满了,TIMER 不够用,只好重新画板。
📌 正确做法:提前规划外设资源。例如你要同时用 3 个串口 + 2 个 I2C + 1 个 SPI + 多路 ADC,F103 的 LQFP48 版本可能就不够用。
❌ 错误三:“听说 F407 很强,直接拿来做人机交互”
结果:屏幕刷新卡顿,怀疑是代码问题,其实是忘了初始化 FSMC 时序参数。
📌 正确做法:FSMC 总线对时序非常敏感,务必根据屏幕 IC 手册设置 Address/Data Setup/Hold Time。必要时使用逻辑分析仪抓波形调试。
❌ 错误四:“用 F401 跑 USB CDC 虚拟串口,结果电脑识别不了”
原因:USB 时钟没配对!F401 的 USB FS 需要 48MHz 精确时钟,必须通过 PLL 从 HSE(8MHz)倍频而来。
📌 解决方案:确保 RCC 配置正确:
RCC_PLLConfig(RCC_PLLSource_HSE, 8, 336, 7, 4); // VCO=336MHz, PLLCLK=168MHz, PLL48CLK=48MHz
PCB 设计建议:别让硬件拖后腿 🔧
F103 / F401 / F407 都需要注意:
- 每组 VDD/VSS 至少加一个 100nF 陶瓷电容 ,靠近芯片引脚;
- 复位引脚(NRST)加 10kΩ 上拉 + 100nF 滤波电容 ;
- BOOT0 引脚通过 10kΩ 下拉接地 ,保证正常启动;
- 晶振尽量靠近芯片 ,走线等长,底部不要走信号线;
- SWD 接口(SWCLK/SWDIO)保留 ,方便后续调试和升级。
特别提醒 F407 用户:
- FSMC 总线布线要等长 ,尤其是地址/数据线,建议误差控制在 ±10mil 内;
- SDRAM 一定要四层板 ,电源平面完整,避免噪声干扰;
- 以太网变压器中心抽头需按规格接 50Ω 电阻或磁珠 ,否则可能通信不稳定;
- HSE 晶振选 8MHz ±10ppm ,为 USB 提供精准时钟源。
最后一点真心话 ❤️
选开发板,本质上是在做 权衡的艺术 。
F103 不是最强的,但它教会了无数人如何与硬件对话;
F401 不是最炫的,但它默默支撑着成千上万的量产产品;
F407 不是最便宜的,但它让你有机会做出真正复杂的系统。
没有“最好”的芯片,只有“最合适”的选择。
下次当你面对这三个型号犹豫不决时,不妨问问自己:
“我的系统最不能妥协的是什么?”
是成本?是功耗?是性能?是扩展性?
答案自然会出现。

873


被折叠的 条评论
为什么被折叠?



