做嵌入式这几年,COM Express 几乎是绕不开的一个形态。前两年接了一个工业视觉检测的整机项目,测过来调过去,最后定下来的方案就是一块基于 Intel 第 8 代酷睿处理器的 COM Express 模块,再配一块自己画的载板。当时选这个组合,核心原因很直接:第 8 代平台能提供足够的 CPU 算力、PCIe 带宽和显示接口灵活性,而 COM Express 标准又把 CPU 核心部分与对外接口彻底解耦,让我在整机设计上不用纠结换 CPU 就重画一遍主板。
这篇文章就把这套方案从选型、载板设计、系统集成到测试排障的完整过程拆开讲一遍。无论你是准备做边缘计算盒子、工业视觉控制器,还是医疗仪器主控,只要涉及 COM Express 和 Intel 8 代处理器,这篇文章应该都能帮你少走不少弯路。我会把关键引脚、电源设计、散热、BIOS 适配这些容易翻车的点挨个说清楚,也会把调试中踩过的坑直接列出来。
1. 项目概述与设计思路拆解
1.1 COM Express 标准到底解决了什么问题
COM Express 是 PICMG 制定的计算机模块标准,简单理解就是把 CPU、内存、芯片组、BIOS 这些“核心计算”全部放在一块小板卡上,用户只负责做一块“载板”,通过标准的 440 针连接器把模块上引出的 PCIe、USB、SATA、DisplayPort、eDP、网口等信号按自己的需要引出到机箱外部。这样做的好处非常明显——我一批机器可能有三四种 CPU 性能档位,但我只需要维护一种载板,模块插上去就能用。
这和我们平时做开发板的思路完全不同。做 ARM 核心板的时候,引脚基本上绑定死了,换了核心板就得重新核对引脚定义。COM Express 不一样,它的引脚定义是统一的,Type 6 的 440 针每一针都是标准定义的,不管你是用第 7 代还是第 8 代 Intel 模块,甚至是 AMD 或者 NXP 的模块,只要符合 COM.0 R3.0 标准,插在载板上都能启动。这种互换性在大批量工业设备里价值极高。
1.2 为什么偏偏选第 8 代 Intel 处理器
第 8 代酷睿在 2023 年底的这个时间点看,确实不算最新了,但在工控行业里它的生命周期仍然很长,性价比和供货稳定性都很友好。更关键的一点是,第 8 代是 Intel 在移动平台首次把六核十二线程下放到 45W TDP 的主流 H 系列处理器上,比如 i7-8850H。对嵌入式场景来说,这种多核性能提升意味着在相同功耗下可以跑更多的视觉检测算法、更多的虚拟机,或者同时处理多路视频流。
第 8 代还带来了比较完整的 PCIe Gen3 支持,Type 6 载板能从这里拿到一组 PCIe x16 和最多 8 组 PCIe x1 通道,用来接 GPU、图像采集卡、多串口扩展卡、CAN 卡都没问题。相比第 7 代,内存也升级到了 DDR4-2400 双通道,带宽提升对内存密集型应用帮助很大。另外,第 8 代处理器内置的 UHD Graphics 630 支持多个 4K60 画面输出,对工业 HMI 和医疗影像这种要同时显示多路画面的场景非常友好。
1.3 整体架构与载板分工
这套系统最终的架构是这样的:COM Express Type 6 模块插在载板上,模块自带电源管理、内存和 CPU,载板负责把 9-36V 直流输入转成模块所需的 12V 与待机 5V,然后把模块引出的 PCIe x16 拆成两组,一组给独立显卡,一组给四口千兆网卡,PCIe x1 通道接出几个 USB 扩展和串口芯片。视频输出走 DP 和 HDMI,另外从 eDP 引脚接一块 12 寸工业液晶屏。
载板不是单纯把连接器的线引出来就行,它需要处理电源时序、电平转换、信号完整性、看门狗逻辑、风扇控制等一系列问题。模块出厂时只保证在标准载板上的信号质量,如果载板的引脚定义有错或者电源纹波超标,那系统跑起来会非常难受,可能上电不启动,也可能跑几分钟无故重启。
2. 载板硬件设计的核心细节
2.1 载板供电与电源管理设计
COM Express 模块的供电引脚中,最关键的是 12V 主电源输入和 5V 待机电源。以 Type 6 为例,模块从载板获取 VIN_12V、V5V_STBY、VCC_RTC 等电源,其中 V5V_STBY 用于在系统关机后维持管理引擎和唤醒逻辑工作。我们载板用了 24V 工业直流输入,所以第一步是把 24V buck 到 12V,再用一颗 LDO 转出 5V_STBY。
这里有个容易踩的坑:V5V_STBY 一定要先于主 12V 稳定建立,并且要能在主电源短路时依然稳定保护管理引擎。我一开始只是从 12V 分出一路 DC-DC 当 5V_STBY,结果模块的 AMT 功能老是丢失,后来才发现是待机电源噪声太大。后来单独加了一颗小功率低噪声 LDO 给 V5V_STBY,问题立刻消失。如果你不需要 Intel AMT 主动管理,这步可以简化,但强烈建议还是严格按规范来。
载板的电源时序方面,COM Express 规范里对 SYS_EN#、PWRBTN#、RESET#、SUS_S5# 这些信号的要求非常明确。模块上电后,会检测 SYS_EN# 和 PWRBTN# 的状态来判断是“AT 上电模式”还是“ATX 按钮模式”。工业设备一般我习惯做成“上电即启动”,也就是 SYS_EN# 拉高,PWRBTN# 直接连到按钮但允许短接,这样设备一上电就会开机,适合无人值守的产线设备。
需要特别注意的是,载板上的 +12V 和地引脚,每个引脚都有电流限制,不要因为觉得“接口多”就在一块载板上串很多大功率外设。比如直接给 20W 的射灯供电就不合适,最好单独用 VIN 分支去做,别走模块的电源引脚。
2.2 信号引脚分配与接口扩展
Type 6 的 440 针接口把信号分成了 PCIe、USB、SATA、Gigabit Ethernet、DisplayPort、HDMI、eDP、LVDS、GPIO、LPC、SPI、I2C、UART 等几大类。载板设计的第一步,就是把这些信号源分配到对应的外部接口上。我建议动手之前先把一份引脚分配表写清楚,每个引脚分配给谁,用 Excel 或者设计工具里的交叉引用表都行,避免后面布线时发现引脚冲突。
关于 PCIe 通道的分配,COM Express 模块通常提供一组 x16 和一组 x8 或几组 x1。大部分用户会直接把 x16 拿来接独立显卡或者 AI 加速卡。如果只插一个设备,那就用 x16 直连,信号完整性最好。如果考虑扩展多个设备,用 PEX 芯片把 x16 拆分成 x4+x4+x4+x4 是比较常见的做法,但注意拆完后的每个端口都需要进行 Gen3 的信号完整性验证,尤其是板长超过 20cm 的时候。
USB 方面,Type 6 最多能引 8 个 USB 2.0 和 4 个 USB 3.0。我这次引了 2 个 USB 3.0 到前面板,2 个 USB 2.0 接触摸屏和扫码枪,剩下几个留给了内部调试板。SATA 我引了 4 路,其中两路走标准 SATA 座,两路走 M.2 的 B-key 插槽。不过要注意,很多 COM Express 模块上已经直接集成有 SATA 控制的 PHY,引出的 SATA 信号不需要额外加驱动,只要走线阻抗匹配好,长度控制在合理范围就行。
2.3 显示输出与 PCIe 通道的接线策略
显示方案是载板设计里让人头疼但又很有成就感的一块。Type 6 把 eDP 和 DisplayPort 信号直接引出来了,HDMI 和 LVDS 则需要载板上用桥接芯片或者电平转换电路实现。我们屏幕是 12 寸 1920x1280 的 LVDS 屏,而模块原生输出是 eDP,所以载板上加了一颗 eDP 转 LVDS 的桥接芯片,用模块的 I2C 接口去配置分辨率参数。
如果你要做 4K 多屏,建议优先用模块的 DP 接口直出,而不是在载板上做复杂的转换。因为 DP 直出带宽足够,而且不需要额外芯片,出现兼容性问题的概率小很多。需要 HDMI 的话,也可以在载板上用一颗 DP 转 HDMI 2.0 的芯片,但每个转换节点都会引入信号延迟和偶发兼容问题,所以尽量少转。
PCIe 布局的优先级要排到显示之前,尤其是 x16 走线。COM Express 连接器到 PCIe 卡槽或者转接板的走线长度最好控制在 15cm 以内,差分对间要等长,等长误差控制在 5mil 以内。我第一次画的时候觉得手头布线空间太紧,就绕了一个大圈,结果 Gen3 直接测出丢包。后来重新约束了长度,才把链路稳定下来。这里我建议使用 6 层以上 PCB,PCIe 信号走内层,两侧有完整地平面,这样 8GT/s 的信号完整性才可控。
3. 模块选型与关键技术参数
3.1 第 8 代酷睿与芯片组组合
市面上搭载第 8 代 Intel 处理器的 COM Express 模块选择很多,但并不是每一块都适合你的项目,关键看 CPU 型号和芯片组的组合。像 i7-8850H 这类 45W 处理器,六核十二线程,需要载板的散热能力跟上,适合有主动散热空间或者用大散热片对流的机箱。而 i5-8365UE 这类 15W 低功耗处理器,虽然性能弱一些,但无风扇设计和宽温应用就非常合适。
在芯片组上,Coffee Lake 和 Whiskey Lake 平台一般搭配 CM246、HM370、QM370 这些移动芯片组,差异主要在支持的 USB/PCIe/SATA 数量和是否支持 Intel vPro。例如 QM370 支持 vPro 和 AMT,HM370 不支持,这在批量远程管理场景里差别很大。选模块时还要确认模块的 BIOS 里是否开放了自定义设置,我们这次选的模块 BIOS 里可以调 CPU 的 TDP、PL1/PL2 以及风扇 PWM 曲线,这对散热设计帮助特别大。
3.2 内存配置与存储接口
第 8 代平台的内存控制器支持 DDR4-2400 SO-DIMM,最大容量根据芯片组支持一般是 64GB。COM Express 模块常见的有两种内存形态,一种是板载内存,一种是 SoDIMM 插槽。板载的好处是抗振动性能好,适合恶劣环境,缺点是后续升级容量困难,采购时要一步到位。SoDIMM 插槽的优势是灵活,但要注意加固。
我在这个项目里选了 32GB 双通道 DDR4-2400,两条 16GB SoDIMM。一定要确认模块是否支持双通道内存以及 SoDIMM 插槽是否有缓冲设计,因为有些紧凑型模块只有一条 SoDIMM 槽,只能跑单通道。对内存带宽敏感的应用来说,双通道和单通道的差异能有 30% 以上,尤其在 4K 解码和视觉算法上,所以选型时别被 CPU 单核性能迷惑了。
存储方面,除了 SATA,第 8 代芯片组支持通过 PCIe 通道接 NVMe SSD。COM Express 模块一般会把一组 mPCIe 或 M.2 插座放到模块本体上,也有的模块把 NVMe 信号引到载板上。我建议优先把 M.2 NVMe 放在模块本体,因为 NVMe 对信号完整性要求很高,放在载板上的话一旦布局不好很容易掉盘。
3.3 BIOS/BSP 和操作系统适配
模块出厂时一般都预装 UEFI BIOS,默认配置可以启动 Windows 10/11 和主流 Linux 发行版。但工业项目不能拿默认配置直接交付,至少要做这几件事:关闭不必要的电源管理(比如 C8 节能)、设置看门狗超时时间、调整串口输出重定向、配置风扇控制曲线。
Linux 下还有一个常见的坑:第 8 代 Intel 的 i915 驱动在某些老内核上对 Coffee Lake 的支持不完整,导致 HDMI 输出花屏或者 DP 无信号。解决办法是升级到 5.15 以上的内核,或者在启动参数里加 i915.force_probe 强制加载。Windows 下则要注意安装完整的 Intel INF 驱动和显卡驱动,否则设备管理器里会出现一堆“未知设备”。
如果你要做国产化或者实时操作系统适配,还要确认模块的 BSP 是否支持你的目标系统。像我们这次还需要跑 Ubuntu 20.04 的实时内核,好在模块厂商提供了 BSP 包,里面包含修改后的 ACPI 表和看门狗驱动源码,省了不少时间。
4. 整机集成与散热设计
4.1 散热方案与 TDP 权衡
第 8 代 H 系列处理器 45W TDP 产生的热量,在工业金属机箱里如果不加风扇,只靠自然散热,是很难压住的。我们测了几种方案:纯被动散热(大散热片加机箱侧板导热垫)在室温 25 度下跑双烤 15 分钟直接 98 度降频;换成热管加 80mm 风扇主动散热之后,满载 35 分钟可以稳定在 75 度左右,频率基本能维持在标称值。
无风扇方案也不是不能做,那就得选 15W 的 U 系列处理器,并配合大面积散热片和良好的风道。工业现场如果灰尘大,我会优先考虑无风扇或串联式风扇,维护成本低。但如果你做的是视觉检测设备,空间足够大,风扇的噪音其实不是主要矛盾,性能和稳定性更重要。散热片和 CPU 盖板之间一定要用高导热系数的导热硅脂,厚度控制在 0.2mm 左右。
风扇控制可以用模块的 FAN_PWR 引脚,这个引脚输出的是 PWM 调速信号,载板上只需要加一个 RC 滤波和一个驱动器就能驱动 4 线风扇。注意一些模块的 FAN_PWR 是 24V 兼容输出,但 FAN_TACH 是集电极开路信号,需要加上拉电阻才能被模块识别。
4.2 布局走线经验与电磁兼容
载板尺寸不大,但该注意的地方不能省。COM Express 模块的 440 针连接器占了很大面积,周围最好留出 2-3mm 的禁布区,尤其是高压电源引脚附近。电源入口处要放 TVS、防反接二极管和大容量电解电容,这些看起来是“基本功”,但很多从 ARM 开发板转过来的工程师很容易忽略。
整机过 EMC 的时候,RS(辐射抗扰度)最容易出问题的地方往往是排线。比如我们一开始用普通 26 芯杜邦线把 USB 信号引到前面板,一加干扰就死机。后来全部改成了带地线的屏蔽排线,并且在载板 USB 信号出口加了共模电感,RS 测试直接通过。很多人觉得 USB 就两对差分,不用太讲究,但工业环境里共模干扰才是重启的元凶。
还要注意模块的地和载板地不能有单点瓶颈。有些工程师为了减小数字噪声,把载板的模拟地和数字地分割,但在 COM Express 方案里强行分割地平面反而容易导致回流路径断裂,信号完整性变差。我的做法是整板一个完整地平面,只有在对外接口部分做小范围隔离。
5. 性能实测与稳定性验证
5.1 跑分和实际工业负载测试
模块装好系统以后,不能只看 CPU-Z 的跑分就收工。我建议分三层来测试:第一层是跑通用的基准项目,验证 CPU 和内存是否正常;第二层是针对你的应用场景做专项压力测试;第三层是长时间老化,观察是否存在偶发故障。
我这边的实际数据可以作为参考:i7-8850H 模块在平衡模式下,CPU-Z 单核 500 左右,多核 3300 左右,和台式机桌面级 i5 相差不大。内存读写带宽在双通道 DDR4-2400 下约 35GB/s,延迟在 60ns 左右。最让我满意的是 PCIe Gen3 x16 接了一张中端显卡后,在视觉定位算法里推理时间比之前用的老平台快了 40%。
工业负载测试才是重点。我们把系统接上两台 USB3.0 相机,连续采集 12 小时图像,同时跑 4 路视频编码和上位机数据库写入,统计每隔 1 小时的掉帧数和 CPU 温度。最终掉帧数为零,CPU 温度稳定在 72 度,证明这套组合应对中等强度的视觉检测完全没问题。
5.2 可靠性老化测试方法
老化测试如果只是开机放着跑 72 小时,意义不大。关键是做“循环压力”和“环境温度变化”两个维度。循环压力就是用脚本循环执行高负载任务、全速读写 NVMe、频繁插拔 USB 设备,让系统在不同状态间快速切换,最容易暴露电源时序和驱动层面的问题。
我们实验室有一个恒温箱,我按工业标准设了 -10 度到 60 度循环,每个温度点跑 2 小时的重负载任务。测试时发现一个很隐蔽的问题:在低温 0 度附近,机械硬盘启动失败,因为载板给硬盘的 SATA 供电在低温下电流不足。后来在载板上加了一颗负温度系数的浪涌抑制器才解决。这就是老化测试的价值,平常室温下根本发现不了。
另外,强烈建议记录模块的 SMART 信息和日志,看看有没有 PCIe AER 错误记录,那种偶发的链路降速往往就是 PCIe 连接器的接触不良或载板走线问题导致的。
6. 常见问题与排障实录
6.1 上电无反应或反复重启
整套系统插上 24V 直流后,如果模块完全没有反应,第一件事不是怀疑模块坏了,而是用万用表量载板上的 12V 和 5V_STBY 是否正常。常见的故障是 24V 输入经过防反接 MOS 管之后压降太大,导致模块 VIN 只有 10.8V,低于模块最低工作阈值。解决方法是改用低导通阻抗的 MOS 管或者用理想二极管控制器。
如果 12V 正常但按电源键没反应,检查 SYS_EN# 和 PWRBTN# 的时序。有些模块要求 SYS_EN# 要先于 V5V_STBY 至少 20ms 稳定,否则会因为检测不到上电信号而不启动。电平可以用示波器抓,确保没有毛刺。
6.2 PCIe 链路不稳定或识别不到设备
载板上 PCIe x16 插了显卡却经常识别不到,首先是看 BIOS 里 PCIe 速度设置,如果默认是 Auto,建议手动固定成 Gen3,免去链路协商的兼容性问题。其次载板的 PCIe 通道独立供电要足够,显卡的 12V 供电一定要单独从载板输入端引,而不是走模块的电源引脚,否则瞬间电流会把模块供电拉崩。
如果插槽识别正常但一跑大负载就死机,那就要考虑 PCIe 差分对等长问题了。用示波器或者 TDR 去测眼图不太现实,最简单的方法是用系统日志里的 AER 计数辅助定位,如果错误集中在某一个 PCIe 端口,基本可以判定是那一路的走线问题。
6.3 显示黑屏或内存训练失败
开机黑屏、蜂鸣器也没响,这种情况十有八九是内存没插好或者兼容性问题。COM Express 模块的 SoDIMM 插槽在振动环境下容易松脱,装整机时一定要加固定卡扣。如果内存是板载的但黑屏,那要看模块的调试串口或者 POST 码指示灯。模块一般会有 GPIO 引脚输出错误码,载板设计时最好预留几个指示灯,不然排查时只能拿着万用表一个一个查。
LVDS 屏点亮后花屏,多半是 eDP 转 LVDS 的桥接芯片配置不对。检查主控 CPU 的 I2C 引脚有没有接上,以及桥接芯片的 PLL 供电是否干净。我遇到过一次桥接芯片上电复位时序不满足要求,导致偶尔花屏,后来在复位脚上增加了延迟电容才解决。
6.4 实用避坑清单速查
| 现象 | 可能原因 | 处理建议 |
|---|---|---|
| 按电源键无反应 | 5V_STBY 没有建立或时序不对 | 检查待机电源和 SYS_EN# 时序 |
| 偶尔重启 | 电源纹波过大或地线回流问题 | 增加滤波电容,检查地平面完整性 |
| PCIe 掉卡 | 差分对不等长或供电不足 | 限制走线长度,独立供电 |
| USB 设备识别失败 | 排线共模噪声过大 | 用屏蔽排线加共模电感 |
| 触摸屏漂移 | 触摸信号和地线回路杂音 | 触摸线加滤波,单独接地 |
| 无风扇转速显示 | FAN_TACH 上拉缺失 | 加上拉电阻,确认 PWM 信号极性 |
6.5 我的调试顺序经验
如果你第一次玩 COM Express,我建议按这样的顺序来调:先上电验证电源和待机电源,看模块上的状态灯亮度;然后接调试串口,看 BIOS 开机日志是否输出;再插内存、试显示输出;最后才接扩展卡和外部设备。每加一个模块都要重启确认一次,出现问题就知道是最近加的哪个环节造成的,避免一次接太多设备导致无法定位。
还要提一个很实际的建议:载板最好预留一个 JTAG/SWD 接口的排针,还有模块的 LPC 总线接口引出来。很多模块支持通过 LPC 接 BIOS 调试器或者 POST 卡,关键时刻能省一整天的排查时间。
7. 后续扩展方向建议
这个项目验证完以后,我又基于同一块载板做了一版宽温加强型,把原来的风扇拆掉,换成了 15W 的 i5-8365UE 模块,散热片加大到全铝鳍片,外壳无风扇设计。同样的载板,只需要改模块和散热方案,就能覆盖两个完全不同等级的客户需求,这种“一板两用”的玩法是 COM Express 最大的价值。
如果你的项目未来要上 AI 推理,可以把 PCIe x16 分出一条给加速卡,或者直接用模块上自带的雷电/USB4 接口。Intel 8 代平台虽然不支持 PCIe Gen4,但 Gen3 x4 的带宽跑一些轻量级 AI 模型完全够用。更重型的应用,可以考虑第十一、十二代平台的 COM Express 模块,载板引脚定义不变,只是电源和信号完整性要求更高,设计思路是通用的。
最后分享一个小技巧。如果条件允许,尽量向模块厂商申请一套参考载板的原理图,哪怕只是一个低保真的 PDF。它不一定完全适合你的应用,但引脚去耦、电源顺序、复位电路这些细节非常值得参考。我做的第一版载板就是因为自己加了太多“想当然”的滤波电容,导致晶振起振异常,后来对着参考设计删掉一堆电容才好。参考设计能让你避免把简单问题复杂化。