1. 从"跑起来就行"到量产后返工:MCU、MPU、SoC 的边界到底在哪
我见过太多项目,原理样机跑得漂漂亮亮,一到小批量就出问题,最后追根溯源不是代码写得烂,而是平台选错了。最典型的一个案子:一台手持检测仪,主控用了一颗主频 120MHz 的通用 MCU,裸机加状态机,样机阶段一切正常;量产后客户要求加波形显示、加历史数据留存、加网络上传,三件事叠在一起,SRAM 直接爆掉,刷屏卡顿到没法看,最后整块板子推翻重来,换成带 DDR 的 MPU 才收场。这次返工带来的损失,远超过当初那颗 MPU 比 MCU 贵的几十块钱差价。
这就是我想聊的核心:MCU、MPU、SoC 的选型,本质上是把产品未来两三年的功能上限、软件形态和团队能力,提前押注在一颗芯片上。押错了,代码能跑,但架构扛不住增长。下面这套思路不针对某一家厂商,也不堆厂商手册上的参数,而是把"选型痛点"和"架构重构"这两件事拆开讲透:什么情况下该守着一颗 MCU 死磕,什么信号出现时必须切到 MPU,什么产品形态只有 SoC 或 FPGA SoC 才接得住。
1.1 三个名词的真实分界:内核、内存管理单元、片上集成度
很多人把 MCU、MPU、SoC 理解成"性能从低到高的三档",这个理解不准确,容易误导选型。真正的分界点有三个。
第一是内核架构和有没有 MMU。MCU 一般是 Cortex-M、RISC-V 的嵌入式变体或者各家私有内核,工作在特权模式加可选的用户模式,中断响应是硬件自动压栈,延迟可预期,通常在十几个到几十个时钟周期。MPU 一般是 Cortex-A 这一类应用处理器内核,核心特征是带MMU(内存管理单元),能做虚拟地址映射和内存保护,这是跑 Linux、Android 这类带进程概念的操作系统的前提。没有 MMU,Linux 就跑不起来,只能上 RTOS 或者裸机。
第二是内存的来源。MCU 的 Flash 和 SRAM 在片内,读取走内部总线,访问延迟基本固定,启动几十毫秒就进 main 函数。MPU 的 DDR 在片外,需要外部存储控制器加一堆时序参数,启动前要先做 DDR 训练,冷启动几百毫秒到几秒都很正常。这一条直接决定了产品的开机体验和掉电恢复行为,很多低功耗场景就是被这一点卡死的。
第三是集成度的边界。SoC 是把 CPU、GPU、NPU、ISP、显示控制器、DDR 控制器、USB/以太网 PHY、视频编解码这些模块塞进一颗硅片,做成一颗"整机级"的芯片。手机主控、AI 摄像头主控、车载座舱芯片都是这个路子。它和 MPU 的区别不在内核,而在片上有没有把那堆模拟和高速接口做成硬核。FPGA SoC 属于另一条支线,用 FPGA 逻辑加硬核处理器核,灵活性最高,代价是面积、功耗和开发周期。
1.2 一颗芯片押三年代价:选错的分水岭长什么样
我梳理过一个经验清单,四条里中两条以上,就该认真考虑往上升级平台,别硬撑。
- 功能需求里出现了"显示 + 网络 + 存储"三件套。这三件事单独看都不难,凑在一起就会吃掉大量 RAM、Flash 和 CPU 时间,MCU 上很容易出现"功能都能做,但同时做就卡"。
- 代码量超过 256KB 且还在涨。这不是绝对的,但如果你的代码里有协议栈、文件系统、图形库,Flash 只会越来越紧。
- 需要跑标准协议栈或第三方 SDK。有些 SDK 官方只提供 Linux 版本,MCU 上要自己裁剪移植,这笔工作量经常被严重低估。
- 产品路线图上有"联网升级""多路传感器融合""图像/音频处理"。只要沾上图像或者神经网络的边,MCU 基本可以直接排除。
反过来,启动时间要求 100ms 以内、要求掉电即恢复、要求整机功耗在毫安级、BOM 成本卡到个位数,这几条只要占了,MPU 就很难进去,老老实实用 MCU。这个判断顺序特别重要,先看硬约束,再看算力,最后看价格,顺序颠倒就容易选出一个"参数很漂亮但产品做不出来"的方案。
1.3 术语歧义这个坑,比技术本身更容易翻车
有个特别隐蔽的坑,很多硬件工程师都踩过:SOC 这三个字母在不同语境下完全是两回事。在电池管理系统里,SOC 指的是 State of Charge,电池剩余电量;在芯片和嵌入式领域,SoC 指的是 System on Chip,片上系统。做前期调研的时候,如果直接把"SOC 计算""SOC 估算"丢进搜索框,回来的一半是卡尔曼滤波和安时积分,跟你要选的芯片八竿子打不着。
我的做法是建立一整套带上下文的检索词表:查芯片就固定用"系统级芯片""SoC 主控""处理器选型手册""评估板选型"这类组合;查电量算法就固定加"电池管理""BMS 电量估算"。同时给团队立一个规矩:所有选型文档里第一次出现缩写必须写全称,SoC(System on Chip)或者 SOC(State of Charge),一个字都不省。听起来是小事,但一次全面的选型调研可能要翻上百份资料,术语混淆会白白吃掉两三天。
2. 把需求翻译成六组可量化指标,选型才有依据
绝大多数选型争议的根源,是大家用形容词在吵架:"这颗芯片够快吗""资源够不够"。形容词没法验证,指标可以。我的习惯是拿到需求后的第一件事,不是打开选型手册,而是把需求翻译成下面六组数字,写成一页纸,全组对一遍。这一页纸就是后面所有架构决策的基线,也是将来重构时的判据。
2.1 算力与实时性:别只看主频,看抖动
主频是最没参考价值的单一指标。真正要问的是三件事:峰值算力、持续算力、最坏响应延迟。
峰值算力用 DMIPS 或者 CoreMark 分数来横向比,注意不同内核的 CoreMark/MHz 差别很大,不能直接拿主频比。持续算力更关键,因为内部 Flash 取指、DMA 抢占总线都会让实际吞吐打折,很多时候实际能跑到的只有峰值的六七成。最坏响应延迟对实时控制类应用是生死线,比如电机 FOC 环路,中断延迟抖动超过几微秒,电流环就开始抖。
实操上我会做一张表,把这几个量填进去:
| 指标 | 采集方法 | 典型红线 |
|---|---|---|
| 峰值算力 | 厂商数据手册 DMIPS/CoreMark | 留 40% 以上余量 |
| 持续算力 | 实测跑业务负载,看 CPU 占用率 | 稳态不超过 60% |
| 中断延迟 | 示波器打 GPIO 翻转,测进出中断时间 | 按控制环周期的 1/10 卡 |
| 最坏抖动 | 满负载下连续测几小时,统计分布 | 抖动不超过环路的 5% |
这张表的价值在于,它把"够不够"变成了"余量多少"。余量低于 30% 的项目,我会直接判定为架构风险,因为你不知道下一版需求会加什么。
2.2 内存与存储:容量、带宽、还有访问方式
内存要分三层看:片内 SRAM、片外 DDR、非易失存储。
片内 SRAM 的关键不只是容量,还有能不能被多个主设备同时访问。很多 MCU 只有一条总线矩阵,CPU 取指、DMA 搬数据、外设访问全挤在一起,跑图像类任务时性能会突然掉崖。选型时一定要查总线结构,看有没有多主多从的矩阵、有没有独立的指令和数据总线。
DDR 的关键是带宽和延迟,还有训练复杂度。给 MPU 配 DDR,不是挑一颗容量够的就行,还要看位宽、频率、颗粒数量和拓扑(是不是能走点对点),以及 SoC 的 DDR 控制器支持不支持这个速率。我见过一个项目,为了省成本用了两颗小容量颗粒拼位宽,结果时序调了两个月才稳定,省下来的钱全赔在调试人力上。
非易失存储要区分代码存储和数据存储。eMMC、SPI NAND、NOR Flash 的取舍逻辑完全不同,NOR 支持 XIP(原地执行),启动快,容量小;eMMC 容量大、便宜,但要做坏块管理和磨损均衡。这一层选错了,后面文件系统和升级方案跟着一起崩。
2.3 功耗与热:整机功耗预算要从电源树倒推
功耗这件事,正确的做法是从电源树往下算,不是从芯片手册的典型值往上估。步骤是:列出所有电源域、每路的电压和最大电流、各路的上电时序要求,然后按效率倒推输入功率。
以一颗带 DDR 的 MPU 为例,电源域通常有核心电压、DDR 电压、IO 电压、模拟电压好几路,每一路都要考虑上电顺序,顺序错了可能锁死或者损伤器件。这时候一颗多路输出的 PMIC比一堆分立 DCDC 更省事,但 PMIC 的默认时序不一定符合你的芯片要求,需要确认能不能通过 I2C 或者 OTP 配置。
散热方面,别只看结温上限。实际要算的是热阻链路:结到壳、壳到散热片、散热片到环境,再乘上实际功耗。很多工业级产品标称 -40 到 85 度,真正难的是高温满载场景,DDR 和电源芯片往往是先崩的那一环。
2.4 外设与接口清单:把"需要什么"写死
这一步最容易被轻描淡写,但外设缺一个口,整个方案就得外挂芯片,成本和面积立刻上升。我会按下面这张清单逐条打勾,缺项就标红:
- USB:需要 Host 还是 Device?全速还是高速?有没有内置 PHY?
- 网络:百兆/千兆?需要几路?MAC 内置还是需要外挂 PHY?
- 显示:RGB 并口、MIPI DSI、SPI 屏?分辨率多少?
- 摄像头:MIPI CSI 几路?需不需要 ISP 做自动曝光和白平衡?
- 存储:SDIO、eMMC、SPI、NAND 控制器
- 工业接口:CAN FD 几路、RS485、以太网时间同步
- 模拟:ADC 位数和采样率、运放和基准源需求
这里有个经验:凡是"可能以后会用到"的接口,一定要在选型阶段就算进去。因为接口不是软件能补的,芯片上没有就是没有,后期只能外挂桥接芯片,而桥接芯片会引入额外的驱动、额外的功耗、额外的失效点。
2.5 启动链路与固件形态:决定软件团队的工作量
启动链路是选型里最容易被忽略的一环,但它直接决定了软件架构和调试难度。
MCU 的启动是:上电 → 复位向量 → 系统初始化 → main。简单直接,几百行启动代码搞定。
MPU 的启动是:片内 Boot ROM → 一级引导(可能做的 DDR 初始化)→ 二级引导(U-Boot 之类)→ 内核 → 根文件系统。每一级都可能出问题,而且出问题的时候串口一点输出都没有,只能用调试器硬看。对软件团队来说,从裸机转 Linux 不是换语言,是换一整套世界观:设备树、内核驱动模型、根文件系统打包、OTA 升级策略,全都要重新搭。
2.6 供应链与生命周期:技术之外的决定性因素
一颗芯片参数再合适,如果交期 40 周、或者已经进入停产流程,方案就不能定。我一般会看四件事:是否在厂商的长期供货承诺列表内、封装是否主流、是否有多家可替代型号、评估板和参考设计是否容易拿到。
参考设计的价值被严重低估。有完整参考设计的平台,硬件一次成功率能提高一大截,尤其是 DDR 布线、电源树、时钟树这些容易翻车的地方。选型手册上写的是芯片能做什么,参考设计告诉你这颗芯片实际被别人怎么用稳的。
3. 三条路线的成本账与风险账,别只算芯片单价
选型最忌讳"只比单价"。同一颗芯片在不同方案里,周围的配套器件、板层数、开发人力、认证周期完全不同。我把三条主流路线摊开来算一遍,你会看到单价只是冰山一角。
3.1 MCU 路线:便宜、快、但天花板明显
MCU 方案的成本结构很干净:一颗芯片加少量外围,两层板往往就能搞定,电源用一颗 LDO 或者小 DCDC,开发用裸机加状态机或者 RTOS,一个熟手几周就能出原型。
优势是确定性和启动速度。中断延迟可预测,没有操作系统调度带来的抖动;上电到工作几十毫秒;低功耗模式做得好的话,休眠电流能压到微安级。这类方案在电机控制、传感器采集、小家电、工业从站节点上依然是绝对主力。
天花板也很清楚:算力上限、内存上限、以及图形和网络协议栈的缺失。当你需要一颗屏、一个 TCP/IP 栈、一个文件系统同时跑,MCU 就开始捉襟见肘。有些团队会选择"MCU + 外挂协处理芯片"来硬撑,比如用一颗带网络的 MCU 加一颗显示驱动芯片,短期能过关,长期会变成一堆难以维护的胶水代码。
3.2 MPU 路线:硬件复杂、软件红利大
MPU 方案的成本结构完全不同。除了主芯片,还要加 DDR 颗粒、多路 PMIC、可能还要加 eMMC,PCB 从两层跳到四层甚至六层,电源完整性和信号完整性都要做仿真。硬件成本可能是 MCU 方案的两三倍。
但你买到的是一整套成熟的软件生态。Linux 上网络、文件系统、图形框架、USB 各类设备驱动、OTA 升级方案全都是现成的,第三方 SDK 覆盖率也高。功能一旦复杂起来,MPU 的边际开发成本反而比 MCU 低——同样的功能,在 MCU 上可能要写几千行裁剪代码,在 Linux 上可能就是配置一下。
这里有个反直觉的结论,我反复验证过:当软件复杂度超过某个阈值之后,贵的那颗芯片反而让项目总成本更低。这个阈值的经验判断是——如果你的固件需要三个以上独立的复杂子系统(网络、图形、存储、协议栈),并且它们之间有交互,那就别犹豫了。
3.3 SoC 与 FPGA SoC 路线:一次性投入换集成度
SoC 路线适合两类产品:一类是量大到可以摊薄一次性投入的消费类产品,另一类是必须高度集成才能达到体积和功耗指标的产品,比如小型相机、AI 边缘盒子。
SoC 的典型特征是片上集成了大量专用硬件:ISP、编解码器、NPU、显示控制器、高速接口 PHY。你不需要自己写这些模块的驱动,它们由厂商的 SDK 提供。代价是灵活性下降,硬件是固定的,改不了;一旦某个硬件模块的行为不符合需求,只能绕开或者换芯片。
FPGA SoC 是另一条路,处理器核加可编程逻辑,接口时序、专用算法、数据通路都可以自己定义。它的优势是接口灵活性和算法并行度,比如你需要的是一种很特殊的多路同步采集时序,通用 SoC 满足不了,FPGA 就能做。代价是开发周期长、工具链门槛高、功耗和成本都不便宜,而且逻辑设计需要专门的人。选这条路线之前,先问自己一句:这个功能用软件配合通用外设真的做不到吗?大部分时候答案是做得到。
3.4 一张对照表和一套决策顺序
把三条路线放在一起对照:
| 维度 | MCU 路线 | MPU 路线 | SoC / FPGA SoC 路线 |
|---|---|---|---|
| 启动时间 | 几十毫秒 | 数百毫秒到数秒 | 视方案,通常秒级 |
| 实时确定性 | 强 | 弱(需要实时补丁或协处理器) | 取决于架构设计 |
| 内存扩展 | 基本固定 | 可扩展到 GB 级 | 板载或片内高带宽 |
| 软件开发量 | 裸机/RTOS,自建轮子多 | Linux 生态,配置为主 | SDK 依赖,灵活度受限或需逻辑设计 |
| 硬件复杂度 | 低,两层板常见 | 高,多层板加 DDR 布线 | 很高,需专业团队 |
| 适合场景 | 控制、采集、低功耗节点 | 交互、联网、带屏设备 | 图像、AI、高集成度产品 |
我的决策顺序是固定下来的,不用每次都重新讨论:先过硬约束(启动时间、功耗、成本、寿命),再定软件形态(裸机/RTOS/Linux),最后才比算力和价格。这个顺序能过滤掉 80% 的错误选项。
4. 什么时候必须重构:七个信号和一个"别动"的判断
架构重构是伤筋动骨的事,硬件重开板、软件重搭框架、认证可能要重做。所以不能凭感觉。我总结了一套触发信号,硬信号出现就必须动,软信号可以作为规划和预算的依据。
4.1 五个硬信号:出现了就别硬撑
信号一:内存余量长期低于 20%。内存是最硬的墙,因为它不像 CPU 那样可以靠优化挤出来。堆栈溢出、内存碎片、动态分配到后期基本无解。我见过一个项目为了省 RAM,把动态内存改成静态池,改完又发现协议栈的缓冲区没法静态化,最后还是要换片。
信号二:CPU 稳态占用率长期超过 70%。这个水位下,任何新增功能都会触发调度抖动和响应延迟,而且你没法预测什么时候崩。跑到 70% 以上就该规划升级了,不是优化的问题,是余量的问题。
信号三:必须引入一个只有特定操作系统才支持的协议栈或中间件。比如某些安全通信库、某些图形框架、某些 AI 推理引擎,官方只出 Linux 或者 Android 版本。自己移植不是不行,但维护成本会一直跟着你。
信号四:启动时间要求和功能复杂度出现正面冲突。当你为了在 200ms 内启动,不得不砍掉一半功能的时候,说明这个平台承载不了这个产品定义了。
信号五:硬件上必须外挂三颗以上桥接芯片。这是个很准的信号。外挂芯片意味着额外的驱动、额外的功耗、额外的失效点、额外的布线空间。三颗以上时,整体成本和可靠性通常已经不如直接换一颗集成度更高的主芯片。
4.2 软信号:不算紧急,但要提前埋线
软信号包括:团队里有成员开始抱怨"这框架加不了新东西"、代码里出现大量针对硬件的条件编译、同一个功能在不同产品线上重复实现、CI 跑一次要半小时以上。这些不一定立刻要重构,但说明架构在腐化,值得在下一次产品规划时预留重构窗口。
还有一个常被忽略的软信号:采购那边开始反馈某颗芯片交期变长或者价格异动。这时候即使技术上讲还能用,也应该启动替代方案评估,因为供应链风险会直接传导到交付。
4.3 什么情况下不该重构
这条同样重要。如果问题只出在实现层,就不该动架构。比如下面这些情况,重构是浪费:
- 只是某个模块写得不够好,接口是清晰的,那就重写这个模块。
- 只是某个外设配置有问题导致性能不佳,那就调配置。
- 只是代码风格乱,那就加规范、加静态检查。
判断标准很简单:如果新需求能通过新增模块满足,不需要改接口,那就不需要重构。架构重构的正当理由只有一个——现有的抽象层次已经装不下新需求了。
5. 迁移清单:从 MCU 切到 MPU,具体要动哪些东西
确定要重构之后,最容易犯的错误是"把 MCU 的代码搬到 Linux 上"。这两套体系的思维方式完全不同,搬运只会带来一堆别扭的胶水层。我的做法是按四个层面分批推进,每一层单独验证。
5.1 硬件层:电源树、时钟树、启动配置
电源树要重新设计,因为 MPU 的电源域更多、上电时序更严格。必须先确认参考设计里的时序图,然后决定是用分立 DCDC 加时序控制芯片,还是用一颗可配置 PMIC。这一层的验证方法是:所有电压轨同时抓波形,确认上电顺序和爬升时间符合要求,尤其注意核心电压和 DDR 电压的相对先后。
时钟树要注意抖动指标。带高速接口的芯片对参考时钟的相噪敏感,晶振选型不能只看频偏。另外,启动模式引脚一定要留跳线或者测试点,量产板也要留,因为在调试阶段能一键切换启动介质,能省掉很多拆焊时间。
5.2 启动链路:每一级都要能独立验证
迁移到 MPU 之后,启动链路会变成多级结构。我的推进顺序是:
- 先把最底层的 DDR 初始化跑通,用现成的内存测试工具反复跑几小时,确认稳定。
- 引导加载程序能起来之后,第一件事是打通串口和网络下载通道,保证固件能快速迭代。
- 内核起来之后,先把根文件系统和存储介质调通,再谈应用。
- 最后才是应用层迁移。
每一级都要能单独验证,不要指望"全烧进去一起看"。出问题的时候,前面几级是干净的,排查范围能缩小很多。
5.3 软件层:把 HAL 抽出来,别把业务绑在硬件上
如果原项目是裸机,重构之前应该先做一次抽象整理,即使这次不重构也值得做。做法很简单:把业务逻辑和硬件访问彻底分开,所有引脚、寄存器、外设操作都通过一层薄薄的接口暴露出去,业务层只调用接口。
这样迁移的时候,你只需要重写这层接口(在 Linux 上,这层就是驱动和设备树的配置),业务逻辑原封不动搬过去。没有这层抽象,迁移会变成逐行改代码,风险和成本都会翻倍。
5.4 主控加协处理器的分工模式
还有一种中间路线特别值得提:用一颗 MPU 做主控跑 Linux,用一颗 MCU 做实时控制,两者通过 SPI、UART 或者共享内存通信。这样 Linux 负责联网、显示、存储、升级,MCU 负责电机控制、采样、安全逻辑,各取所长。
这个模式的坑主要在通信协议设计上。我的经验是:协议要有明确的帧头、序号、CRC,并且要有超时和重传机制;状态类数据用"最新值覆盖"的方式传,控制类命令用"确认加重传"的方式传,两类数据不要混在同一条通道里互相阻塞。另外要设计好各自的复位行为——主控重启之后,协处理器应该进入什么状态,这个必须在协议里定义清楚,否则会出现"主控重启后电机突然动一下"这种事。
5.5 回归验证:怎么确认重构没有退化
重构之后必须有一套可重复的回归测试。哪怕没有完整的自动化框架,也至少要做到:关键功能有固定的测试步骤和预期结果、性能指标有基线数据可以对比、异常场景(断电、断网、满负载、高温)逐条跑一遍。
我会专门记录一张"重构前后对比表",包括启动时间、稳态 CPU 占用、内存峰值、功耗、关键路径延迟。这张表不只是验收用的,将来再遇到"要不要升级"的讨论,它就是最有说服力的数据。
6. 外设细节上的经典坑位,选型手册不会告诉你
芯片选型和架构重构的很多痛苦,都来自外设细节。下面这几个是我在实际项目里反复遇到的,写出来省得你再踩。
6.1 MCU 内部的 Flash 是挂在什么接口上的,为什么这事影响性能
这个问题很多人答不上来,但它直接影响高主频 MCU 的实际性能。MCU 内部的 Flash 通常不是直接挂在 CPU 上的,而是挂在一个专用的 Flash 控制器上,控制器再接到总线矩阵。CPU 取指要走总线和控制器,经过地址解码、读缓存、预取缓冲几级。Flash 本身是模拟存储阵列,读取速度远低于内核主频,所以当主频往上调,就必须往访问周期里插入等待周期(wait state)。
这就解释了几个现象:为什么同一颗芯片在 48MHz 和 120MHz 下实际性能不是线性增长;为什么厂商要强调"零等待执行区"或者提供 ITCM/DTCM 这类紧耦合内存;为什么把中断服务程序或者热循环函数搬到 SRAM 里能显著提速。因为 SRAM 挂的是高速总线,没有等待周期,也不需要经过 Flash 控制器。
选型时的实操建议是:如果你的应用对实时性和确定性要求高,一定要关注这颗 MCU 有没有紧耦合内存、有多大、Flash 控制器有没有预取和指令缓存。这几个参数对实际性能的影响,往往比主频数字更大。
6.2 芯片上没有 USB 差分引脚怎么办
做产品时经常遇到一个尴尬:主芯片的接口列表里有 USB 控制器,但封装上没有引出差分信号引脚。这里的排查顺序是固定的:
- 先查引脚复用表。八成的情况不是"没有",而是这个功能没配成备用功能,或者被别的功能占用了。同一颗芯片不同封装,可用引脚差别很大,先看看换封装能不能解决。
- 看控制器是否需要外部收发器。有些控制器只做协议层,物理层要外挂。这时候需要确认接口类型,是并行的 ULPI 还是 UTMI,两种接口的引脚数和布线要求差很多。
- 考虑桥接方案。如果只是需要一根串口或者一个存储接口,用 USB 转串口、USB 转存储这类成熟芯片更省事,不用为了一个 USB 重新选主芯片。
- 最后才是换平台。如果产品本身就需要 USB 高速通信加文件传输,那这个需求已经超出了 MCU 的舒适区,换 MPU 或 SoC 反而是正解。
这里有个容易忽略的点:外挂物理层芯片之后,VBUS 检测、上拉电阻、ESD 保护都要重新设计,USB 的差分线还要按阻抗要求走线。这些细节如果参考设计里没有,翻车的概率很高。
6.3 段码屏、数码管这类显示的驱动方式
段码屏在仪表类产品里用得非常多,成本低、可视角度好、功耗小。驱动方式主要有两种:MCU 的 GPIO 直驱加动态扫描,或者用带段码驱动控制器的 MCU。
GPIO 直驱的做法是:每个段选和位选各占一个引脚,通过定时器中断轮流点亮,靠人眼视觉暂留形成稳定显示。要点在于刷新频率、限流电阻、扫描时序。刷新频率太低会闪,太高会吃掉太多 CPU 时间;限流电阻要根据 LED 的正向压降和期望电流算,别照抄别人的值。
带段码控制器的 MCU 更省心,硬件自动扫描,甚至可以做到休眠状态下继续显示。但要注意偏压和占空比的配置,段码液晶用的是交流驱动,偏压比配错了会出现对比度不均、鬼影、甚至损伤液晶。这种情况用示波器看波形最直接,波形对了一眼就知道问题在哪。
6.4 电源与保护器件:一个小元件毁掉一块板
选型重构往往涉及重新设计电源,这部分器件的选型逻辑值得单独说。
Buck 电路的电感,不能只看感值。要算纹波电流比(一般取输出电流的 30% 到 40%),再确认电感的饱和电流和温升电流都留足余量,直流电阻要小以降低损耗。感值选小了纹波大、输出不稳,选大了瞬态响应变慢、体积变大。
输出电容,容量和等效串联电阻要一起看。容量决定纹波,等效串联电阻决定瞬态跌落。多个小容量并联往往比一颗大容量效果更好,因为并联后等效串联电阻更低。
TVS 管,用在接口防护上。关键参数是钳位电压和峰值脉冲功率,钳位电压必须低于被保护器件的绝对最大额定值,还要注意结电容——放在高速差分线上,结电容太大会影响信号完整性。
NTC 热敏电阻,用来做过温检测或者温度补偿。选型要看 25 度时的阻值和 B 值,还要确认检测电路的分压电阻匹配,以及 ADC 的采样精度够不够。温度采样不准会直接影响充电策略和保护逻辑,这一环出问题往往在量产之后才暴露。
MOS 管,重点看耐压、导通电阻、栅极电荷和热阻。栅极电荷影响开关损耗和驱动能力,导通电阻影响通态损耗,两个都要算,不能只看一个。散热设计要按最坏工况算,不要按典型值算。
7. 一次偶发死机的完整排查链路
讲到这儿,插一段真实的排查经历,比讲道理更有用。有个项目从 MCU 换到带 DDR 的平台之后,样机偶尔会在上电后几分钟内死机,概率大概百分之几,重启就好,跑压力测试有时候几小时也不复现。这种问题最折磨人。
第一步,先缩小范围。我把系统拆成三部分分别跑:只跑引导加载程序死循环、只跑内核不跑应用、跑完整应用。结果是只跑引导也偶发,说明问题不在应用层。这一步很关键,能省掉大量在应用代码里瞎找的时间。
第二步,抓现场。死机时串口没有任何输出,说明可能是硬件级挂死。我用调试器接上,发现是卡在内存访问上。这时候怀疑对象缩小到 DDR 和它的供电。
第三步,看波形。用示波器同时抓 DDR 供电和参考电压,在反复上下电的过程中,发现供电的爬升时间和参考电压的建立顺序在某些情况下不满足要求——电源芯片的软启动电容参数偏大,导致爬升变慢,而参考电压建立得更早,中间有一小段不合规的窗口。
第四步,验证假设。调整软启动参数,让爬升变快、时序对齐,然后连续上下电几千次,问题不再复现。为了确认不是运气,又做了高温和低温的上下电循环,都正常。
第五步,反推设计。根因清楚了:这是上电时序设计的问题,不是芯片的问题。回过头去看,参考设计里其实标注了时序要求,但我们在改电源方案的时候只对了电压值,没对时序。这个教训后来变成了团队的一条检查规则:任何电源方案变更,都必须重新核对上电时序图,抓波形确认,不能只测电压。
这个案例的价值在于那套排查顺序:先切分范围,再抓现场,再从最底层看起。很多偶发问题最后都落在电源、时钟、复位这三样上,而不是代码。
8. 一些我自己的判断习惯和常用做法
最后分享几个我形成习惯的做法,不涉及具体厂商,你拿去就能用。
建一个内部选型台账。每评估一颗芯片,就记一条:型号、内核、内存、关键外设、封装、供货状态、评估板是否易得、当时为什么选它或者否它。这玩意儿一年后价值极高,因为很多需求会重复出现,你不用重新调研一遍。
给每个项目留一张"余量表"。明确写出内存余量、算力余量、接口余量、功耗余量四个数字,每个季度更新一次。低于 30% 就标黄,低于 20% 就标红,标红就要启动升级评估。这张表能让架构重构变成一个有节奏的规划动作,而不是被需求逼到墙角的救火。
把"能不能用软件补"当成选型时的一个固定提问。每次有人提一个新外设需求,先问一句:这个功能用现有外设加软件能不能做出来,代价多大。很多需求其实是软件层面能解决的,不一定要换芯片,但前提是你得在选型阶段就把接口抽象做好。
硬件和软件的人必须一起过选型。硬件关心的是引脚、封装、电源、成本,软件关心的是 SDK 成熟度、驱动覆盖、调试手段、生态。只让一方拍板,另一方后期一定会抱怨。我参与的每个项目,选型评审都要求软件侧出一份"这个平台我要额外写多少代码"的估算,这份文档比任何参数表都更能反映真实成本。
这些小习惯积累下来,最大的收益不是省了多少钱,而是少了几次推倒重来。架构重构这件事,做得越早成本越低,等到量产之后再动手,代价就是十倍以上。