1. Board Bring-Up 到底在做什么
我第一次接触 Board Bring-Up,是在一块全新的六层板面前。板子刚从贴片厂拿回来,带着松香和助焊剂残留的气味,焊盘整整齐齐,像一件没拆封的电子产品。说实话,面对一块没人跑过的新板子,心里又兴奋又发怵。兴奋是因为这一板的命运握在手里;发怵是因为如果原理图有坑、Layout 有误导甚至某个电阻贴错,排查起来可能以“天”为单位。
Board Bring-Up,中文常叫“板卡启动”或“板级调通”,指从拿到一块全新 PCB 样板开始,到板上最小系统能稳定运行、Bootloader 能引导操作系统之前的全部软硬件联调工作。它既不是单纯的硬件测试,也不是纯粹的嵌入式软件开发,而是横跨两者的“翻译层”。硬件工程师画完原理图、跑完仿真、送出去打样,到了这一步才真正验证设计假设;软件工程师要在这个阶段拿到可用的运行环境,才能在真实的板子上调试代码。可以这么说:Board Bring-Up 没做完,硬件团队和软件团队都只能大眼瞪小眼。
为什么这件事值得单独拿出来讲?因为它的难度和常规开发完全不同。常规软件开发有 IDE 提示、有断点、有日志,错了可以反复重跑;而板级调通往往面对的是一个“幽灵”问题——系统起不来,串口一个字符都没有,示波器触发不到任何异常,万用表量哪儿都是正常的,但板子就是不动。这种状态下,经验、方法和流程比聪明更重要。
这篇文章想写给三类人:一是刚入行的硬件工程师,马上要接手自己的第一块样板;二是嵌入式软件工程师,被老板安排去协助“点板”,却对硬件知识体系一头雾水;三是做方案选型的项目负责人,想知道 Board Bring-Up 在一个产品研发周期里到底占多少分量、需要投入多少资源。
这活儿到底该怎么做?说白了就一条主线:先电源,后时钟,再复位,然后存储和外设,最后才轮到操作系统。这条主线可以拆成下面几个阶段,我给你展开讲。
2. 准备工作与核心工具
很多人拿到板子就急着上电,这是一个大忌。我见过不少新手工程师在第一批样板到手几小时内就把电源芯片烧了,罪魁祸首往往是手滑把电源接反,或者忘记检查核心电压的跳线帽。上电前的准备工作做得越足,后面调通的概率就越高。
2.1 静态检查:用眼睛和万用表过一遍设计
第一步是目检。先看 PCB 表面有没有明显问题,比如焊盘桥连、电容方向贴反、IC 引脚间有没有残留的锡渣。这个环节建议用放大镜或者体视显微镜过一遍,重点看电源部分和 BGA 区域。BGA 焊盘断桥在 X-Ray 下才看得清楚,普通目检只能先排除掉贴片级的低级错误。
目检完之后是上电前的重头戏:电源对地阻抗测试。用万用表的二极管档或者电阻档,量每一路电源轨对 GND 的阻抗。这个操作可以帮你提前发现电源短路问题。别小看这个步骤,很多新手觉得“量了也没用,反正都是通的”,恰恰是这种心态导致后面排查时间翻倍。经验值可以参考:核心电压轨(比如 0.8V/0.9V 的 VCCINT)对地阻抗通常在几十欧姆到几百欧姆之间;外设电源轨(比如 3.3V)可能在几百欧姆到千欧姆级别。如果量出来是几欧姆甚至接近于零,那条电源轨一定有短路。
这里有一个细节值得单独说明:电阻档和二极管档测出来的数值不能混着用。二极管档会施加一个恒流源,某些板上保护二极管和芯片内部的 ESD 结构会导通,导致读数偏低;电阻档则更接近静态电阻。我的习惯是先用电阻档记录一个基准值,再用二极管档确认压降方向,两套数据结合着看。每块板子都有自己的“指纹”,调通过程中把每次测量的数据记录下来,后面出了问题可以对比着判断。
2.2 设备准备:示波器、直流电源和电流探头
做 Board Bring-Up,最少需要这几样设备:一台四通道以上的示波器(带宽至少 200MHz,建议 500MHz),一台可编程直流电源,一个可以测电流的万用表或者电流探头。如果是做高速板卡,还得准备差分探头和逻辑分析仪。
可编程直流电源是这里面最关键的工具,因为它能做限流。上电时先设置一个比较保守的限流值,比如预估工作电流的 1.2 到 1.5 倍。这样即使板上有短路,电源也不会瞬间放出大量电流烧毁芯片,而是进入恒流模式,帮你保护器件。电流读数的变化还能直观地反映板卡状态:如果上电后电流明显高于预估,说明有异常功耗通路;如果电流为零,可能电源链路根本没接通。
示波器的使用也有讲究。测量电源纹波时,要使用探头上的接地弹簧而不是长地线夹子,否则会引入噪声,让纹波数值虚高。测量时钟波形时,要在靠近接收端的测试点测量,并使用 1:1 无源探头,因为 10:1 探头对高频信号的电容负载效应可能改变信号波形。
我用的工具不算多,但每一件都有明确用途:
- 可编程直流电源:负责给板卡供/VCC 主电源,支持限流保护
- 数字万用表:测对地阻抗、电源轨的静态电压
- 四通道示波器:观察电源轨上电时序、时钟信号、复位信号
- 逻辑分析仪:抓取低速总线的时序问题,比如 I2C 通信
- 热成像仪:排查异常发热点,尤其在首次上电后用来定位短路位置
2.3 电源树梳理:先搞清楚板上有几路电源
上电前,还要把板上的电源拓扑完整梳理一遍。现在的复杂板卡往往有多路电源轨,比如 12V 输入,经过中间降压到 5V、3.3V、1.8V、1.2V、0.9V,还有一些特殊电压比如 DDR 的 VTT、VREF。每一路的来源、负载和上下电时序都需要明确列出来。
这里推荐画一张电源树表格,用 Markdown 或 Excel 整理都可以,至少包含这几列:电源轨名称、预期电压、容差范围、来源(直接供电还是 DC-DC 或 LDO)、负载芯片、对地阻抗参考值、上电时序要求。这张表就是调通工作的“地图”,你后续每一步操作都可以对照它来分析。没有这张表就开始上电,就像没有图纸就开挖地基,迟早要返工。
3. 上电时序与最小系统启动
准备工作做完,终于到了激动人心的首次上电时刻。这一步我是怎么操作的,给你还原一下。
3.1 第一次上电:限流与观察
先把直流电源的输出电压设置到板卡的标称主电源值,比如 12V;电流限制设到比较保守的数值,比如 1A——如果这板子预期要跑 3A 满载,那 1A 的限流值足够让系统完成启动但不会在异常时放出太大能量。然后缓缓打开输出,同时盯着电源面板上的电流读数。
正常的反应应该是:电流缓慢上升,然后稳定在一个基本不变的数值。如果电流瞬间冲到限流值,电源进入恒流模式,就说明板上有短路或者某个器件对地阻抗极低。这时候不要继续上电,应该立刻断开电源,拿热成像仪或者用手背(注意安全)感应发热元件。
第一次上电成功之后,也先别急着高兴。接下来要逐一测量各电源轨电压是否在规格范围内。用万用表量每一路电源对 GND 的电压,记下来,和原理图上的预期值对比。偏差在 2% 以内一般可以接受,超出 5% 就要排查问题了。比如 3.3V 量出来只有 3.1V,可能的原因是分压电阻贴错、LDO 选型余量不足、或者负载过重。
3.2 上电时序:为什么顺序错了系统就起不来
现代 SoC 对上电时序非常敏感。比如某些 FPGA 要求核心电压先稳定,然后 IO 电压才能上升;如果 IO 先上电,可能导致芯片内部 ESD 二极管正向导通,灌入核心电源,造成 Latch-Up 或者芯片损坏。DDR 的 VTT 和 VREF 必须在主电源稳定后产生,否则内存训练会失败。
验证上电时序的方法是使用示波器的多个通道,同时测量关键电源轨的上升沿。设置触发电平在第一路电源上升的中点,然后观察其他通道的相对延时是否满足数据手册要求。我测过一块板子,3.3V 比 1.8V 早升了 2ms,刚好超了规格,导致 FPGA 启动每次都失败。后来在电源树里加了 RC 延时电路解决了这个问题。
上电时序验证中还有一个小技巧:把示波器设置为“单次触发”模式,这样可以捕捉到完整的电源上升波形,而不是反复触发的杂乱曲线。同时要注意探头的衰减比设置,很多电源轨电压在 3.3V 以下,如果探头设成 10:1 而示波器却设成 1:1,读数就会相差十倍,容易误判。
3.3 时钟、复位和调试接口:最小系统三大件
电源跑通后,就要验证时钟和复位了。先确认晶振或者时钟芯片有输出,用示波器测量时钟引脚,应该看到干净的方波或者正弦波,频率和幅度要符合时钟芯片手册要求。频率不准的话,后面所有通信都会出问题,比如 UART 波特率偏差、网络不通等。一般 ±50ppm 是底线,精密系统要求 ±20ppm 以内。
复位信号同样值得认真对待。用示波器看复位引脚的上升沿是否干净,有没有毛刺或回沟。如果复位信号本身不稳,后面的外设就会随机“抽风”,时好时坏,极难排查。我遇到过一次复位信号上有毛刺,原因是复位芯片的滤波电容贴错位置,距离引脚太远,起不到滤波作用。把 0.1uF 电容挪到引脚旁边后,问题就消失了。
调试接口是系统启动后与外界沟通的窗口。ARM 核的板子用 SWD 或 JTAG,RISC-V 的板子用 JTAG。连接调试器之前,先确认调试接口的参考电压(通常是 VREF 引脚)已经上电,并且和目标板共地。很多朋友的调试器连不上,不是板子坏了,而是没共地或者 VREF 没接。
到这里,最小系统如果都能正常工作了,那么恭喜你,Board Bring-Up 最为艰难的环节已经过去了。剩下的工作是让 “最小系统” 变成一个可用的完整系统。
4. 存储器初始化与 Bootloader 调通
最小系统能跑起来,串口马上就有反应了。但离整个板卡可用还有距离,接下来就是存储器和引导程序的调通阶段。
4.1 DDR 内存初始化:最考验耐心的环节
DDR 调通是 Board Bring-Up 里的“硬骨头”。DDR 不像串口或者 I2C 那样几条线就能量出来,它的数据线有几十根,时序要求非常高。硬件上做好等长布线只是第一步,真正让内存稳定工作,还需要软件上的训练(Training)。
DDR 初始化的过程其实是 SoC 内部的一段固件在做读训练和写训练,它会调整时序参数,找到每一个字节通道的有效窗口。如果板子布线质量差,或者阻抗不连续,训练很可能失败,系统会反复重启。我见过最多的情况是 FPGA 侧 DDR4 训练失败,原因是 VREF 电压不准。DDR4 的 VREF 一般由主板产生,如果分压电阻精度不够,VREF 偏了,训练就会失败。
排查 DDR 问题时,首先要确认 DDR 供电电压是否标准,VTT 是否等于 VDDQ 的一半。然后用示波器测量时钟信号,确认 DDR 时钟频率正确,且占空比接近 50%。这些基本原则都没问题的话,再用逻辑分析仪抓取 DQ/DQS 信号,观察读写期间的信号完整性。
内存训练失败时,SoC 通常会通过串口打印错误码或者 LED 指示灯给出提示。不同厂商的错误码定义不同,但有一个共同规律:错误码阶段越靠后的,问题越可能出在布线本身。举个例子,如果写级训练失败,大概率是时钟到内存颗粒之间的飞行时间差异过大,也就是等长没做好;如果是读训练失败,可能是 DQS 到控制器之间的走线有问题。
4.2 Flash 识别与启动模式配置
DDR 搞定后,就要看 Bootloader 能不能正常加载。先确认板上 Flash 的供电和片选信号正常。很多板卡支持从多种介质启动,比如 SPI NOR、SD 卡、eMMC 和 NAND Flash,Boot 引脚的状态决定了从哪个介质启动。
我第一次调板时,最常犯的错就是忘记检查启动模式引脚。默认引脚被拉高,结果系统从 SPI Flash 启动,但 SPI Flash 里面是空的,自然毫无反应。后来换了启动方式,从 SD 卡启动就正常了。所以,如果 Bootloader 一直没反应,先查启动配置引脚的电平状态,这比怀疑 Flash 芯片坏了靠谱得多。
Boot 模式引脚确认后,还要检查 Flash 的读写。用 Bootloader 提供的命令可以直接擦除和读取 Flash 内容,如果擦除正常、读取的数据符合预期,那 Flash 硬件就是好的。如果擦除后读取仍然有数据残留,可能是 Flash 供电异常或者 /WP(写保护)引脚被拉低了。这里有一个容易被忽略的点:很多 Flash 的写保护引脚内部有上拉,但外部电路可能因为省事直接接地,导致 Flash 永远处于写保护状态。
4.3 Bootloader 引导的完整验证流程
系统能引导 Bootloader 之后,验证流程大致可以按以下步骤进行:
- 引导日志完整:串口输出正常,没有乱码和丢字符
- DDR 容量识别正确:Bootloader 打印的内存大小和实际大小一致
- Flash 读写验证通过:在 Bootloader 命令行里执行擦写和读取操作
- 网络接口能在 Bootloader 内使用:能 ping 通主机,能通过 TFTP 加载镜像
- 操作系统镜像能从存储介质加载:加载后能正常解压和跳转
如果 Bootloader 内部功能都正常,但启动 Linux 或者 RTOS 时出现 kernel panic 或者死机,大概率还是 DDR 时序不够稳,或者外设的中断配置有问题。这个阶段的排查难度不亚于硬件调试,好在串口日志会提供大量线索。
5. 常见问题与排查技巧实录
Board Bring-Up 搞了这么多年,我积累了一些排查经验,这里整理成几个典型场景,希望能帮你在遇到问题时少走弯路。
5.1 上电后电流异常
症状:上电瞬间电流冲到限流值,电源进入恒流模式。 常见原因:电源短路、电容方向贴反、芯片受损。
排查方法:
- 断电,用万用表电阻档量所有电源轨对地阻抗,找出低阻值的故障轨
- 如果故障轨确定,用热成像仪或手背逐点感受元件温度,发热点就是故障点
- 检查故障轨上的电容、二极管方向是否正确
- 若元件没问题,大概率是 PCB 布线本身有短路,这种只能飞线或者改版
上电瞬间电流异常是一个“奖励”环节——它用最快的速度告诉你板子有问题。真正让你头疼的多半是启动到一半挂掉的场景,因为那意味着故障可能是偶发的、和环境相关的。
5.2 串口无输出或输出乱码
串口没有任何输出,是最常见的“板子死了”的症状。排查逻辑很简单:先确保串口硬件没问题,再排查 Boot 过程。
确认串口电平是否匹配。有些板子是 3.3V 的 TTL 串口,有些是 RS-232 电平,如果接错,要么收不到数据,要么收到一堆乱码。用示波器测量 TX 引脚,如果 Bootloader 真的在发数据,示波器上应该能看到波形。如果看到的是正常波形但终端一片空白,检查串口转 USB 工具的驱动、COM 口号和波特率设置是否匹配。
乱码问题除了电平不匹配之外,还有可能是 Bootloader 实际波特率和终端设置不一致。可以试着把终端波特率从 115200 换成 57600、38400、9600 挨个试,如果某个波特率下乱码变得有规律,比如始终是同样的字符,说明主控发的数据其实正确,只是速率不一致。
5.3 外设寄存器读写异常
有时系统能启动,但某个外设就是工作不正常,比如 I2C 设备读不到数据。这时候需要排查几个方向:
- 确认外设供电正常、复位引脚没有被拉死
- 确认片选、地址线连接正确;对于 I2C 设备,确认设备地址正确
- 用示波器抓取通信波形,看 SCL/SDA 的时序是否符合协议要求
- 检查 SoC 侧 I2C 控制器的时钟速率和上拉电阻是否匹配,上拉太弱可能导致通信失败
我调试一块板子上的温度传感器,I2C 读取一直返回错误。查了供电、地址、寄存器配置,都没问题。后来用示波器一抓才发现,SDA 的上拉电阻被漏贴了,信号在传输中电平不完全拉高,导致通信不稳定。补上 4.7k 上拉后,问题解决。
5.4 偶发性问题的排查思路
偶发问题是最折磨人的:板子工作大部分时间正常,但偶尔一次启动失败或者通信错误。这时候盲目修改代码或硬件是最浪费时间的。我的建议是,先尽可能捕获复现条件。记录出现问题时系统的环境温度、电压变化、操作方式和时间点,再尝试缩小触发范围。
对于偶发问题,可以考虑增加电源滤波电容降低电源噪声,改善接地路径,或者在软件上增加重试机制。如果是在量产阶段出现偶发问题,优先怀疑器件批次差异和焊接质量,这两类问题在样品阶段往往不明显,但在批量生产中会频繁爆发。
5.5 值得分享的几个实操心得
最后再多说几个我经历过的坑和心得体会,这些不一定写在文档里,但确实影响调通效率。
第一,建立板卡台账。每块板子从拿到手开始,把所有测量数据、修改记录、异常现象都登记在案。我当时调一块图像采集板,前后改了三版,如果没有台账记录,很多数据就要重新测一遍。这个习惯不仅省时间,还能帮助你发现一些看似无关的数据之间的关联。
第二,上电前先拍照。这个习惯是从一个老硬件工程师那里学来的。板子第一次上电前的高清照片,往往在你怀疑“某个电容是不是贴错”的时候派上大用场。尤其是人多手杂的实验室,板子被人动过却不承认的剧情经常上演。
第三,关于示波器的使用,我建议多用“光标测量”而不是“自动测量”。自动测量功能很方便,但它是基于多次触发的统计结果,对于偶发信号容易误导你。手动移动光标量取时间差和幅值,虽然慢一点,但是每一个数据都是你亲眼确认过的,不会骗你。
第四,不要怕掀板子。有些信号问题在测试点上量不出来,需要把芯片拆下来,直接测量引脚和 PCB 焊盘之间的连接。这种做法虽然有损坏板子的风险,但在排障的紧要关头,往往能一锤定音。
6. Board Bring-Up 之后还需要做什么
很多人以为系统能启动操作系统,Board Bring-Up 就算大功告成了。其实不然。真正的“调通”还包括很多工程细节,这些细节如果不完成,后面的软硬件联调甚至会返工。
首先,要完成电源纹波的满载验证。系统空载时电源纹波通常很漂亮,但一旦外设全部工作、负载加大,纹波可能急剧恶化。我见过一块板子在满负载下纹波高达 180mV,远超芯片要求的 50mV 以内,导致 DDR 数据出现偶发错误。这个阶段的验证一定要用电子负载或者其他方式模拟满载工况,不然看着是好的,一上真实业务就翻车。
其次,要做温升测试。板卡在极限环境温度下的工作稳定性,往往只有在设计阶段验证过才能在量产阶段放心。拿热成像仪记录满载状态下关键器件温度,确认所有器件的结温都低于规格上限,并预留至少 15% 的降额余量。如果发现某个器件温度偏高,优先检查散热设计、过孔散热焊盘和风道方向。
再然后,是 EMI/EMC 预测试。虽然完整的认证测试会在后期做,但样板阶段至少要用近场探头扫一遍板上的高频辐射点。如果发现辐射超标,趁改版周期一起解决,会比送到实验室再回来改版节省大量时间。电源去耦、时钟走线、接口滤波,都是常见的辐射改善点。
这些收尾工作做完之后,板卡才能算作真正可以交付软件开发团队长期使用的平台。话说回来,这些工作同样排布在 Board Bring-Up 的流程范畴内,只是在很多项目中被放在了不同的时间切片里。
在我自己的经历里,Board Bring-Up 最迷人的部分反而不是技术本身,而是那种“从混沌到有序”的过程。一块全新的板子,什么都不会做,连串口都不知道要怎么开口说话。通过一环扣一环的验证和调试,电源树正常了,时钟震起来了,复位拉高了,Bootloader 吐出了一行字符。那一瞬间的成就感,比写完一整年代码都来得实在。
最后分享一个小技巧:每次调完一块新板子,我会把所有关键信号(电源轨、时钟、复位)的实测波形截图打包存档。这些数据不仅用于本项目的回归对比,也是下一块相似设计板卡的参考基线。慢慢积累下来,这就是你个人最宝贵的硬件调试知识库。希望你在自己的 Board Bring-Up 之旅上,也能享受到这种把一块沉默的裸板唤醒的快乐。