1. 为什么需要外置Flash的Boot程序
做嵌入式开发这么多年,我发现在很多实际项目中都会遇到一个共同的问题:产品发布后需要修复bug或者增加新功能,这时候远程升级就成了救命稻草。传统的乒乓升级方式虽然可靠,但对片内Flash容量要求很高——你需要预留两倍于固件大小的空间。这对于资源紧张的STM32系列来说,简直就是奢侈品。
我记得有一次做智能家居网关项目,主控用的是STM32F103,固件大小已经接近192KB,而片内Flash只有256KB。如果采用传统的乒乓升级,根本不可能实现。这时候外置Flash的方案就派上用场了——用一颗几块钱的W25Q128(16MB)就能轻松存储多个固件版本,完全不受片内容量限制。
这种方案特别适合以下场景:
- 固件体积较大,片内Flash无法容纳两个副本
- 需要存储多个历史版本固件用于回滚
- 产品需要丰富的功能,后续升级频繁
- 成本敏感,无法选用更大Flash容量的MCU
2. 整体架构设计思路
2.1 内存空间规划
在我的项目中,STM32F103RCT6的256KB Flash是这么划分的:
- Bootloader区(32KB):0x08000000 - 0x08007FFF
- 升级信息区(4KB):0x08008000 - 0x08008FFF
- 主应用区(220KB):0x08009000 - 0x0803FFFF
外置W25Q128 Flash的分配:
- 固件存储区:0x000000 - 0x1FFFFF(最大支持2MB固件)
- 升级信息备份区:最后4KB空间
为什么要这样设计?因为Bootloader需要足够的空间来实现复杂的逻辑:SPI驱动、Flash读写、校验算法等。32KB的空间绰绰有余,甚至还能加入一些调试功能。
2.2 升级流程设计
整个升级过程就像搬家一样有序:
- 新固件通过串口、蓝牙或者Wi-Fi传输到外置Flash
- 完成传输后,写入升级标志位到片内Flash
- 单片机重启,Bootloader检测到升级标志
- 从外置Flash读取固件,校验并写入片内主应用区
- 跳转到新固件执行
这种设计最巧妙的地方在于:即使升级过程中断电,也不会变砖。因为原有固件完好无损,下次启动可以重试升级过程。
3. 硬件选型与电路设计
3.1 外置Flash选型建议
W25Q128是我最常用的型号,理由很简单:
- 容量充足:16MB空间,能存好几个固件版本
- 通信接口:标准SPI,所有STM32都支持
- 稳定性:工业级温度范围,数据保存20年
- 性价比:价格只要几块钱,货源充足
如果你需要更大容量,W25Q256(32MB)也是不错的选择。但要注意,有些型号的封装不同,焊接时需要注意。
3.2 电路设计要点
SPI Flash的硬件设计有几个坑我踩过,你们一定要注意:
- 上拉电阻:CS、CLK、MOSI建议加上拉电阻,提高稳定性
- 电源滤波:VCC引脚一定要


1万+

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



