2. 硬件平台选型:MCU选型考量、Flash与RAM规划、通信接口选择

硬件选型这事儿,说难不难,说简单也不简单。我见过太多项目,代码写了大半才发现Flash不够用,或者RAM撑不住。那时候再换芯片,基本等于重来。所以这一章,咱们把选型的门道聊透。

2.1 MCU选型:别只看主频

很多人选MCU,第一眼看主频。其实做固件升级,有几个点比主频重要得多。

核心考量清单:

  • Flash容量:至少留出50%的冗余。你想想看,Bootloader占一块,App占一块,升级过程中还得有临时存储区。
  • RAM大小:除了运行时开销,还得考虑升级包的接收缓冲。我习惯留出至少2KB的专用缓冲区。
  • 双Bank支持:硬件上支持双Bank切换的MCU,做A/B升级简直不要太爽。
  • 加密引擎:如果产品有安全要求,硬件AES/SHA加速能省不少事。

举个例子。我之前做一个物联网网关,选了某款主频200MHz的芯片,看着挺猛。结果一算,Flash只有256KB,Bootloader+App+升级缓冲根本塞不下。最后只能换512KB的型号,交期还多等了两个月。嗯,这个坑我替你们踩过了。

2.2 Flash与RAM规划:精打细算的艺术

Flash和RAM就像你钱包里的钱,永远不嫌多。但现实是,成本卡在那里。所以规划就特别重要。

2.2.1 Flash分区策略

我个人习惯把Flash分成这么几块:

分区 大小建议 用途
Bootloader 16KB ~ 32KB 启动引导、升级入口、校验逻辑
App区 剩余Flash的60% 主应用程序
升级包缓存区 剩余Flash的30% 存放下载中的升级包
配置参数区 剩余Flash的10% 设备配置、升级状态标记

小技巧:配置参数区最好单独划一个扇区。这样擦写配置时不会影响到代码区。我曾经遇到过配置写崩了,连Bootloader都进不去的情况……从那以后,配置区我都是单独放的。

2.2.2 RAM使用规划

RAM的规划,说白了就是算清楚每一字节的去向。

  • 全局变量区:静态分配,大小固定。
  • 堆栈区:函数调用深度、中断嵌套深度,都得算进去。我一般留出至少512字节给中断栈。
  • 升级缓冲区:接收升级包时用的。如果通信接口速度慢,可以小一点;如果速度快,就得大一点。我习惯用2KB。

为什么会这样?因为RAM不够的时候,系统会莫名其妙地复位。你查半天查不到原因,最后发现是栈溢出了。嗯,别问我怎么知道的。

2.3 通信接口选择:UART、I2C、SPI

升级数据怎么传进来?这就涉及到通信接口的选择。三种接口各有千秋,咱们一个一个说。

2.3.1 UART:最通用的选择

UART,说白了就是串口。几乎所有MCU都有,接线也简单,就TX、RX两根线。

  • 优点:硬件简单、调试方便、工具多(随便一个USB转串口就能用)。
  • 缺点:速度一般(通常115200bps ~ 921600bps),没有硬件流控时容易丢包。
  • 适用场景:小批量升级、开发调试、对速度不敏感的产品。

注意:用UART做升级时,一定要加校验。我见过有人直接用裸串口传数据,结果线一长,数据就错位了。加个CRC校验,花不了多少代码量,但能省很多事。

2.3.2 I2C:多设备共享总线

I2C适合板内通信。如果升级数据是从另一个主控或者传感器模组过来的,I2C是个好选择。

  • 优点:两根线(SDA、SCL)可以挂多个设备,地址寻址方便。
  • 缺点:速度上限一般(标准模式100kHz,快速模式400kHz),传输大文件时比较慢。
  • 适用场景:板内模块间升级、从主控向协处理器传固件。

2.3.3 SPI:速度之王

SPI,速度最快,没有之一。如果你需要快速传输大固件包,SPI是首选。

  • 优点:全双工、速度快(轻松上MHz级别)、硬件流控简单。
  • 缺点:需要4根线(MOSI、MISO、SCLK、CS),占用的IO口多。
  • 适用场景:从外部Flash加载固件、高速设备间升级、大容量固件传输。

2.4 接口选型决策流程

说了这么多,到底怎么选?我画了个流程图,帮你理清思路。

通信接口选型决策流程 通信接口选型决策流程 开始选型 传输距离 > 1米? 是 UART 否 速度 > 1Mbps? SPI 否 多设备共享总线? 是 I2C 否 UART 提示:实际项目中可能混合使用多种接口,比如用UART接收升级包,用SPI写入外部Flash 选型时还要考虑MCU外设资源、PCB布局等因素

2.5 实际项目中的选型建议

说了这么多理论,最后给点实在的。我这些年做过的项目,选型基本遵循这几个原则:

  1. 能用UART就别折腾:除非速度实在跟不上,否则UART是最省心的。调试方便,工具多,出了问题也好查。
  2. 大固件包用SPI:如果固件超过100KB,而且升级频率高,SPI是唯一的选择。我曾经用SPI在1秒内传完一个256KB的固件,UART得花20多秒。
  3. 板内通信用I2C:如果升级数据是从另一个MCU或者传感器模组过来的,I2C最合适。两根线搞定,不占IO。
  4. Flash和RAM宁大勿小:成本允许的情况下,选大一号的芯片。后期加功能、加日志、加调试信息,都需要空间。

个人经验:我习惯在选型阶段就留出20%的Flash和RAM余量。别小看这20%,后期加功能、修bug的时候,这点余量能救你的命。