2. 硬件资源评估:MCU/MPU选型要点、内存容量评估、外设接口资源盘点

做嵌入式系统分区设计,第一步不是画框图,也不是写代码。

而是老老实实坐下来,把硬件资源摸清楚。

我见过太多项目,前期拍脑袋选了个芯片,做到一半发现Flash不够、RAM爆了、外设接口冲突……最后只能换平台,从头再来。那滋味,真不好受。

所以这一章,咱们就聊聊硬件资源评估这件事。说白了,就是回答三个问题:

  • 用哪颗芯片?
  • 内存够不够?
  • 接口能不能接上?

核心原则:硬件资源评估不是一次性的,它应该贯穿整个设计周期。选型阶段做粗估,详细设计阶段做精算,最终实现阶段做验证。

2.1 MCU/MPU选型要点

选MCU还是MPU?这个问题其实没那么复杂。

我个人习惯这样判断:如果你的系统需要跑Linux或者复杂的RTOS,需要管理大容量内存(比如64MB以上),那基本就是MPU的活儿。如果只是跑裸机或者轻量级RTOS,控制几个外设,MCU更合适。

选型时,我重点关注这几个维度:

2.1.1 处理性能

别只看主频。主频高不代表跑得快。

我建议你看三个指标:

  • MIPS(百万指令每秒)—— 适合简单控制任务
  • DMIPS(Dhrystone MIPS)—— 更适合通用计算
  • CoreMark —— 现在业界更认可的标准

举个例子。我曾经在一个工业控制项目里,选了某款200MHz的MCU,算下来DMIPS有300多。结果跑一个PID控制算法,加上Modbus通信,CPU占用率直接飙到85%。后来换了同主频但带FPU的型号,同样的代码,CPU占用率降到40%。

嗯,这里要注意:浮点运算单元(FPU)对控制类算法影响巨大。如果你的算法涉及大量浮点运算,务必选带硬件FPU的型号。

2.1.2 功耗约束

电池供电的设备,选型时功耗是第一优先级。

我一般看这几个模式:

  • 运行模式:正常工作的功耗
  • 睡眠模式:能保留RAM和寄存器状态的最低功耗
  • 深度睡眠模式:几乎关掉所有外设,只留RTC和唤醒逻辑

记得有一次做可穿戴设备,选了一款标称“超低功耗”的MCU。数据手册上写深度睡眠0.5μA,看着挺美。结果实际测试,因为外设没完全关掉,实际功耗是5μA。后来仔细看手册才发现,要达到0.5μA需要把GPIO全部配置成模拟输入模式……

避坑指南:我曾经被数据手册上的“典型值”坑过。记住,选型时看“最大值”而不是“典型值”。典型值是在理想条件下测的,你实际用的时候大概率达不到。

2.1.3 工作温度与可靠性

工业级(-40°C ~ 85°C)和商业级(0°C ~ 70°C)差别很大。

如果你的设备要放在户外、机柜、或者靠近电机的地方,老老实实选工业级。别问我怎么知道的……

2.2 内存(Flash/RAM)容量评估

内存评估是分区设计的基础。Flash不够,代码放不下;RAM不够,跑不起来。

2.2.1 Flash容量估算

我一般用这个公式做粗估:

Flash需求 = 代码体积 × 1.5 + 固件升级预留 + 配置文件/参数存储

为什么乘1.5?因为实际编译出来的代码,通常比你想象的更大。加上调试信息、库函数、中间件,很容易翻倍。

具体来说:

  • 裸机程序:一般几十KB到几百KB
  • 轻量级RTOS + 应用:几百KB到1-2MB
  • Linux系统 + 应用:几十MB到几百MB

我在一个物联网项目里,最初估算固件只需要512KB Flash。结果加了OTA升级、TLS加密、JSON解析库之后,直接飙到1.2MB。最后不得不换芯片,项目延期两周。

警告:永远不要卡着Flash上限选型。留出至少30%的余量。因为你永远不知道后面会加什么功能。

2.2.2 RAM容量评估

RAM评估比Flash复杂。因为RAM是动态使用的。

我习惯这样算:

RAM需求 = 全局变量 + 堆空间 + 栈空间 + 各任务栈 + DMA缓冲区

其中:

  • 全局变量:编译后直接能算出来
  • 堆空间:取决于malloc的使用量,一般预留总RAM的10%-20%
  • 栈空间:每个任务至少1KB,中断服务函数至少512B
  • DMA缓冲区:这个容易被忽略。比如以太网DMA描述符、USB缓冲区,动辄几十KB

举个例子。一个典型的RTOS项目:

项目大小
全局变量32 KB
堆空间16 KB
主栈4 KB
任务1栈(控制)2 KB
任务2栈(通信)4 KB
DMA缓冲区8 KB
总计66 KB

所以选型时,至少选128KB RAM的芯片。留出一倍余量,心里踏实。

2.3 外设接口资源盘点

外设接口盘点,说白了就是数一数你需要多少个UART、SPI、I2C、GPIO……然后看看芯片够不够用。

我一般按这个步骤来:

2.3.1 列出所有外设需求

把系统里每个模块需要的接口列出来:

  • 传感器:I2C或SPI
  • 显示屏:SPI或并行接口
  • 无线模块:UART或SPI
  • 存储:SPI或SDIO
  • 调试接口:UART(至少一个)
  • 按键/LED:GPIO

2.3.2 检查复用冲突

这是最容易踩坑的地方。

很多MCU的外设是复用的。比如某个引脚,既可以做UART TX,也可以做SPI SCK。你选了UART,就不能同时用SPI。

我曾经在一个项目里,选了STM32F103,需要3个UART和2个SPI。结果发现UART2和SPI1共用同一组引脚……最后只能降速用软件模拟SPI,通信速率直接砍半。

避坑指南:选型时,打开芯片的引脚功能表,把所有要用到的外设引脚列出来,检查有没有冲突。这一步花半小时,能省后面两周的调试时间。

2.3.3 考虑特殊外设

有些外设对硬件有特殊要求:

  • USB:需要内置PHY或者外接PHY
  • 以太网:需要MAC+PHY,或者内置PHY
  • CAN:需要CAN控制器+收发器
  • ADC/DAC:注意采样率和分辨率
  • PWM:注意定时器资源和输出通道数

嗯,这里还要注意一点:外设的时钟树。有些外设需要特定的时钟频率,如果芯片的PLL配置不出来,那就尴尬了。

2.4 知识体系总览

说了这么多,咱们用一张图把整个硬件资源评估的脉络理清楚:

硬件资源评估知识体系 MCU/MPU选型 • 处理性能(MIPS/DMIPS) • 功耗约束(运行/睡眠) • 工作温度范围 • 封装与引脚数 • 成本与供货 内存容量评估 • Flash:代码+OTA+配置 • RAM:全局+堆+栈+DMA • 预留30%余量 • 考虑未来扩展 • 分区对齐要求 外设接口盘点 • UART/SPI/I2C数量 • GPIO复用检查 • 特殊外设(USB/ETH) • 时钟树兼容性 • DMA通道分配 核心原则:硬件资源评估贯穿设计全周期 选型粗估 → 详细精算 → 实现验证 → 迭代优化 性能评估 • 算力是否满足 • 功耗是否达标 • 温度范围匹配 容量评估 • Flash余量充足 • RAM动态平衡 • 分区对齐合理 接口评估 • 数量满足需求 • 无复用冲突 • 时钟树兼容

这张图把硬件资源评估的三个核心维度串起来了。你想想看,选型、内存、外设,这三者其实是互相影响的。选了一颗高性能芯片,内存可能也大,外设也丰富。但成本也上去了。

所以实际做的时候,我习惯先列需求清单,再去找芯片。而不是先选芯片,再往上堆需求。顺序搞反了,后面全是坑。

总结一下:硬件资源评估没有捷径。老老实实列需求、算容量、查冲突。我做了这么多年,每次跳过的步骤,最后都会回来补上,而且代价更大。

可可精品资料库