☰
达芬奇Pro开发板硬件验证全流程:从电源到外设逐步排查
2026/10/7 14:01:56 网站建设 项目流程

做嵌入式开发这些年,摸过的开发板从51、STM32一路到i.MX、瑞芯微、全志T113、嘉楠K230、树莓派,几乎每块板子到手,第一件事都不是写业务代码,而是把硬件验证完整跑一遍。达芬奇Pro这块板子,主打的是主控性能和外设丰富度,拿来跑Linux系统、挂载Ubuntu根文件系统、接各种传感器模块都很顺手。但正因为接口多、电源域多,验证起来反而容易漏坑。这篇文章就把我验证达芬奇Pro开发板的完整流程记录下来,从刚拿到板子到外设全部点亮,按步骤拆开讲清楚,适合刚接触这块板子的人,也适合想梳理自己硬件验证思路的工程师参考。

1. 硬件验证的整体思路与验证项规划

1.1 硬件验证到底在验证什么

硬件验证,简单说就是把一块刚到手或者刚从贴片厂打样回来的开发板,按照从简到繁、从核心到外设的顺序,逐项确认它的电气特性、启动流程、接口功能、长期稳定性都符合预期。它跟软件开发里的“冒烟测试”是一个道理,是后续所有工作的前提,但很多人容易忽略它的重要性。

我接触过的开发板类型不少,达芬奇Pro算是比较典型的“高性能Linux开发板”定位。和T113、K230、树莓派5这类板子相比,它的优势在于外设接口齐全,主控自带GPU和多媒体能力,适合做边缘计算、人机交互、工业控制类的原型验证。但也正因为接口多、电源域多,验证过程就不能只靠“点个灯就完事”,必须有一套完整的流程。不同类型的开发板验证重点也不一样,比如ESP32开发板因为自带USB转串口、板载LED,验证流程天然简单不少;而到了T113、K230这种Linux级别的主控,外设更丰富,验证就要对着原理图一个一个测。

1.2 验证顺序为什么必须从电源开始

硬件验证的顺序,我建议严格按依赖链来:电源→时钟→复位→核心CPU→内存→存储→外设。任何一个环节出问题,后面的环节要么跑不起来,要么跑起来表现得很诡异。

我见过不少开发板的教程,上来就让人编译一个hello world,然后下载进去点灯。但对于硬件验证来讲,这个流程太靠后了。假如板子供电纹波很大,或者某个电源域的电压不对,点灯可能也能亮,但等到跑Linux系统时就会随机死机、USB设备枚举不稳定,到时候再回头查电源,排查成本就高了。所以,我在验证达芬奇Pro时,第一步永远是把原理图和硬件手册翻开,确认板子的电源拓扑、时钟树、启动引脚配置,然后才上电。

整理成一张验证项优先级表,就是我整个验证流程的“作战地图”,后面的操作全部围绕它展开:

优先级验证项验证目标工具/方法
P0电源域电压/纹波各路电压符合手册要求,纹波可控万用表、示波器
P0时钟输出系统时钟、RTC时钟正常示波器、频率计
P1复位信号复位时序正确,能正常释放示波器、逻辑分析仪
P1串口Boot日志BootROM、U-Boot启动成功串口终端
P1DDR读写内存稳定无报错memtester、stressapptest
P2Flash/eMMC/SD读写存储介质可识别、可读写dd、flashcp
P2外设接口GPIO/I2C/SPI/UART/USB/以太网功能正常回环测试、外设模块

P0、P1级别的问题必须全部解决才能进入下一阶段,否则到最后排查的时候会非常痛苦,这是我在多块板子上反复踩坑后总结出来的经验。

2. 上电前的静态检查与关键电源测量

2.1 先别上电:外观、焊接与短路排查

很多人拿到板子就直接插电,我建议先花5分钟做静态检查。这个环节虽然看起来不起眼,却能避免“一上电就冒烟”的事故。

首先目测整块板子的外观,重点看元器件有没有歪斜、电容电阻有没有脱落、引脚有没有桥连、PCB有没有划伤。然后用手电筒侧着照一下焊盘,尤其是BGA封装的主控芯片和DDR颗粒,看有没有虚焊的痕迹。接着用万用表的蜂鸣档测一下电源输入端的VCC和GND,确认没有短路。这个测试很重要,我不止一次见过返修的板子,就是因为某颗去耦电容焊反导致上电短路,把电源芯片直接烧了。

如果板子带有可拆卸模块,比如M.2接口的WiFi模块、PCIe转接卡之类的,最好先拔掉再上电,逐步加负载。像树莓派5的PCIe开发板配M.2 HAT,这种扩展模块建议在核心板验证通过之后再接上去,否则多个模块同时上电,万一有电流冲击,很难定位是哪个模块的问题。

2.2 电源树解析:达芬奇Pro的电压域怎么测

达芬奇Pro这种Linux级别的开发板,电源域一般不止一路。常见的有5V输入、3.3V外设电源、1.8V内存/IO电源、1.1V或0.9V核心电源,有时还有DDR专用的VTT电源。每一路电压都是给特定电路供电的,有的给CPU核心,有的给DDR,有的给外设接口,不能混为一谈。

我习惯把电源树的每一个输出节点在原理图上标出来,再对照板上丝印找到对应的测试点或电容两端。上电时不要一次性全负载上电,先只接主电源,等电压稳定后再逐域测量。用万用表测电压只能确认有没有电压,不能确认电压质量。要达到验证级别,用示波器测纹波是必要的。一般来说,数字电源的纹波控制在输出电压的1%-2%以内比较健康,比如3.3V的纹波尽量不超过50mV,1.1V核心电压的纹波不要超过30mV。如果纹波偏大,重点检查输出端的电容容量和ESR,以及电源芯片的反馈电阻设置是不是和手册一致。

2.3 时钟、复位与启动模式

电源没问题之后,下一步就是时钟和复位。开发板的启动时序通常是:上电→电源稳定→复位释放→时钟启动→BootROM开始执行。如果复位信号一直拉低,CPU就会被锁死在复位状态,串口自然什么都不会输出。

我在验证时,会先用示波器抓一下复位引脚的波形,确认上电后复位信号能从低电平跳变到高电平,且没有反复抖动。然后再测系统主时钟,比如达芬奇Pro的主控常用24MHz晶振,示波器应该能看到稳定的正弦波输出,频率误差一般在几十ppm以内。启动模式的检查也不能漏。很多主控支持从eMMC、SD卡、SPI NOR Flash、USB烧录等多个启动源启动,通过板上的拨码开关或启动电阻来配置。如果启动模式拨错了,板子就会卡在BootROM阶段,看起来像死机,实际上只是启动源不对。

# 常见启动模式检查,进入U-Boot命令行后执行 printenv boot_device printenv bootcmd

实测下来,这个命令能快速确认板子当前是从哪里启动的,排查“拨码开关电平配置错误”这类问题非常好用。

3. 核心系统验证:串口、CPU、DDR与Flash

3.1 串口终端连接:验证的第一块敲门砖

电源、时钟、复位都没问题后,第一件要做的事就是接串口看日志。串口是开发板的“生命线”,所有启动信息、内核日志、应用输出几乎都从这里出来。

达芬奇Pro的调试串口一般是UART0,板子上会有标注。使用USB转串口模块连接时,注意TXD接RXD、RXD接TXD、GND接GND,这个接法只要折腾过51、STM32的人应该都不陌生。波特率方面,常见的有115200、1500000等,具体看主控手册或板子的出厂配置。在PC端,我常用的是Minicom和screen,不过现在VSCode也有串口终端插件,直接在编辑器里看日志更方便,配合Remote-SSH还可以实现远程看板子日志,不用每次都跑到工位插线。

# Linux下用screen打开串口 sudo screen /dev/ttyUSB0 115200 # 退出screen: Ctrl+A 然后 K

接好之后,按下板子的复位键或重新上电,串口终端里应该会滚动出BootROM、U-Boot、内核的启动日志。看到这个输出,说明CPU已经跑起来了,整个验证从“硬件状态确认”进入“软件系统确认”阶段。

3.2 从BootROM到U-Boot:启动日志里能读出什么

启动日志是最早暴露问题的信息源。我在拿到达芬奇Pro时,会先把完整日志保存到文件里,然后逐段浏览,重点看几个关键节点:BootROM有没有正确加载U-Boot、DDR初始化有没有成功、存储设备有没有被识别、内核有没有panic。

U-Boot阶段有一个非常有用的功能,就是可以进入命令行,手动执行一些外围器件的初始化和读写命令。比如用md命令读取DDR地址,用mmc命令扫描SD/eMMC设备,用sf命令去操作SPI Flash。我经常在这时做一个小实验,往DDR里写一串固定的数据,再读出来对比。

=> mmc list => mmc dev 0 => sf probe => mw.l 0x40000000 0xdeadbeef => md.l 0x40000000 4

如果把数据写入DDR地址后再读出来,内容一致,说明DDR控制器和颗粒的基础读写是通的。这一步虽然简单,却非常管用,能帮助快速区分“DDR硬件问题”和“后续系统启动问题”。如果读写不一致,说明内存的时序配置不对,或者DDR颗粒本身有问题,需要停下来仔细排查。

3.3 DDR与存储介质读写压力测试

在U-Boot阶段用简单读写命令只是快速验证,真正要确认DDR稳定性,得进入Linux系统后跑压力测试。我常用的一套组合是memtester和stressapptest。memtester适合做小内存的读写校验,stressapptest更接近真实应用负载,会同时用多线程高带宽访问内存,更容易暴露DDR布线引起的偶发错误。

# 安装工具 sudo apt install memtester stressapptest # 指定内存大小做压力测试,比如512MB,跑100轮 sudo memtester 512M 100 # stressapptest 用多个线程跑10分钟 sudo stressapptest -M 512 -s 600 -i 4

如果测试过程中出现“FAIL”或者系统直接重启,说明DDR部分存在信号完整性或电源稳定性问题。我在另一块开发板上踩过坑,DDR电源的VTT电压偏低,导致长时间高温运行后随机死机,表面看像软件问题,实际是硬件供电余量不足。存储部分,eMMC、SD卡、SPI NOR Flash都要分别验证。用dd写读,用flashcp整片操作,再对比校验值。

# eMMC/SD 卡读写测试 sudo dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=128 conv=fsync sudo dd if=/dev/mmcblk0 of=/tmp/test.img bs=1M count=128 sha256sum /tmp/test.img

先说这套命令的逻辑:先写128MB数据到存储设备,再读出来,最后算哈希值。如果写入和读出的内容一致,哈希值就会相同,说明存储通路基本没问题。实测下来,128MB的读写循环跑3遍,哈希一致的情况下,存储问题基本可以放心了。

4. 外设接口验证与驱动确认

4.1 GPIO与点灯实验:硬件验证的“Hello World”

点灯实验是整个开发板验证里最基础的一环,但它的意义不只是“亮一下”。它验证的是GPIO控制器、引脚的电气特性和设备树配置是否匹配。很多开发板的GPIO不是默认功能,需要在设备树里把某个引脚复用为GPIO模式才行。如果配置错了,电平拉不起来,或者反过来把别的外设干扰了。

我先在Linux系统里找到达芬奇Pro的GPIO编号,然后通过sysfs接口或gpiod工具去操作。

# 查看GPIO设备信息 ls /sys/class/gpio/ # 使用gpiod工具(推荐) gpiodetect gpioinfo gpiochip0 # 让GPIOA_17输出高电平 gpioset gpiochip0 17=1

操作之前必须确认管脚复用关系,也就是pinmux。我在验证GPIO时,设备树的修改、原理图、芯片手册三者要对照看,不能只看一个。用万用表或示波器在板端测量,确认输出电压和电平符合预期。GPIO点亮的瞬间,整个验证流程基本上就走通了大半。

4.2 I2C、SPI、UART回环测试

外设接口的验证,我比较喜欢用回环测试和真实模块测试结合的方式。I2C总线上通常会挂eeprom、rtc、传感器这类设备。先用i2cdetect -y 0扫描总线,看能不能枚举出设备地址,然后再读写eeprom,把一串已知数据写入再读出来对比。如果总线没问题,读写结果应该一致。

SPI接口验证,可以把SPI Flash挂上去,用flashrom或者mtd工具读写,也可以直接用逻辑分析仪抓SPI波形,确认CLK、MOSI、MISO、CS的时序是否符合预期。SPI的速度级别比较多,我建议从低速开始,一点一点往上调,别一开始就上高速,否则波形畸形了还以为硬件有问题,实际上只是速率配置太激进。

UART回环测试最简单,把UART的TX和RX短接,然后发送数据,如果能接收到相同数据,说明串口通路是好的。但要注意,直接短接需要确认电平一致,像RS232电平和TTL电平就不能直接短接,否则会烧口。

# 在Linux下做UART回环测试 sudo socat -v /dev/ttyS1,raw,echo=0 /dev/ttyS1,raw,echo=0

像达芬奇Pro这种板子,除了基础串口,还可能引出带流控的调试串口和蓝牙模块的HCI UART,这些接口的回环测试思路一样,但接线和电平要额外注意。另外,有些鸿蒙开发板会提到HID over I2C,其实就是通过I2C接口跑HID协议来控制键鼠,验证时用逻辑分析仪抓总线数据就能确认协议通信是否正常。

4.3 USB、以太网与显示接口

USB验证分主机和设备两部分。达芬奇Pro一般都有USB Host口和USB Device口,通常Type-C接口。验证Host时插一个U盘或者USB网卡,看能不能正确枚举;验证Device时,用USB线连电脑,看能不能识别到设备节点,配合烧录工具做通信测试。这一步类似FPGA开发里用ISE生成的bit文件通过下载器烧进开发板——核心思路都是确认主控与外部接口的数据通路是通的。

以太网验证,主要看link状态、速率协商、吞吐量和丢包率。先用ethtool eth0看协商速率,再用iperf3打流测试。

# 板端作为iperf3服务端 iperf3 -s # PC端作为客户端 iperf3 -c <板子IP> -t 60 -i 5

千兆网口的吞吐量如果达不到预期,优先检查网口变压器、RJ45的差分走线和PHY芯片的供电。如果协商成百兆,想一想是不是四对线中某对没接好,或者网线本身就是百兆线。显示接口这块,HDMI的验证比较直观,插上显示器看能否正常出画面。LVDS和MIPI-DSI就要看屏参配置,不同屏幕的时序参数差异很大,配置不对屏幕要么不亮,要么花屏。如果没有配套屏幕,直接用HDMI验证最简单。

4.4 开发板挂载Ubuntu与远程开发

硬件验证走到这里,板子的核心和外设基本确认可用了。接下来很多人喜欢直接把开发板挂载Ubuntu系统来用。这里说的“挂载Ubuntu”有几种含义:一是把Ubuntu的rootfs通过NFS挂载启动;二是直接用SD卡或eMMC烧写Ubuntu桌面系统;三是用Docker挂载Ubuntu根文件系统。我实测下来,验证阶段更适合用NFS方式,原因很简单:不用反复烧写SD卡,改完内核和设备树直接重启就能生效,调试效率高很多。

# 在PC端配置NFS共享目录 # /etc/exports 里加一行 # /path/to/rootfs 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check) # U-Boot环境变量设置NFS启动(以达芬奇Pro为例) setenv bootargs 'root=/dev/nfs nfsroot=192.168.1.100:/path/to/rootfs ip=dhcp console=ttyS0,115200' setenv bootcmd 'dhcp; tftp 0x41000000 zImage; tftp 0x41800000 dtb; bootz 0x41000000 - 0x41800000' saveenv boot

这套启动流程配合VSCode的Remote-SSH插件,就能实现“代码在PC上写,编译在PC上做,放在板子上跑”的远程开发流程。我平时调试驱动就是这么干的,非常顺手。开发板挂载Ubuntu之后,板子就变成了一台小电脑,后面的应用开发和驱动调试就方便多了。

5. 常见故障定位与排查技巧

5.1 故障排查顺序:从现象倒推可能环节

硬件验证过程中遇到问题很正常,关键是有一套清晰的排查顺序。我习惯的做法是:先确认现象,再沿着信号链路从源头往后查。比如摄像头采集不到图像,我不会第一时间怀疑摄像头模组,而是先查I2C总线能不能枚举到摄像头,再查MIPI时钟是否正常,然后查设备树配置,最后才考虑摄像头本身是不是坏了。

这种“从底层往上排”的思路,看起来慢,实际上是最快的。因为底层问题不解决,上层排查全是白费功夫。尤其在Linux开发板上,设备树配置错误导致的故障,症状可能千奇百怪,这时候不按链路一层层剥,很容易被现象带偏。

5.2 串口无输出:最经典的新手拦路虎

串口无输出,几乎每个玩开发板的人都遇到过。排查顺序一般是:供电是否正常→启动模式是否正确→串口线是否接对→波特率是否匹配→BootROM是否启动。

我见过很多“串口无输出”其实是线没接对。开发板的调试串口引脚间距很小,杜邦线稍微一松就接触不良。最保险的办法是用电烙铁把三根线焊在排针上,虽然麻烦,但稳定。另外,USB转串口模块的驱动没装好也会导致电脑压根看不到/dev/ttyUSB0,这一点在Windows上尤其常见。还有一个容易忽略的点:某些板子出厂固件把串口引脚复用成别的功能,导致默认串口号不对,这时候可以看看原理图,找找有没有串口选择跳线,或者尝试另一个UART口。

5.3 DDR初始化失败与随机死机的排查

DDR初始化失败,日志通常会直接卡在U-Boot阶段,提示类似DDR init failed或者Unsupported DDR type。这种问题大多是配置问题,比如dram参数、频率、时序参数设错了。达芬奇Pro这类板子,DDR颗粒的型号决定了参数配置,不能照抄别人板子上的参数,要和实际贴的颗粒型号匹配。

随机死机问题更隐蔽。如果板子在负载高或者温度升高后死机,优先怀疑电源余量、散热、DDR信号完整性。我用过的最有效的定位方法是长时间压测加温度监控结合。

# 查看CPU温度和频率,判断是否触发过热降频 cat /sys/class/thermal/thermal_zone0/temp # 监控实时频率 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

如果温度一高就死机,散热设计大概率有问题,换个带风扇的散热器再测一遍,就能确认是不是热导致的。很多时候随机死机的根因不在软件,而在这些硬件细节上,压测加温度监控就是用来区分这两者的。

5.4 外设枚举不到与总线冲突

外设枚举不到,先用工具看总线有没有正常工作。

  • I2C:i2cdetect -y 0扫描地址,没有设备就检查上拉电阻有没有贴、电源有没有供上、地址引脚有没有接对。
  • SPI:用逻辑分析仪抓CS有没有拉低。如果CS都没拉,说明主控根本没发起访问,查设备树。
  • USB:先lsusb看有没有总线枚举,如果没有,检查USB PHY的电源和时钟,再把差分线上的静电保护器件查一遍。

很多“外设找不到”的问题,最后都定位到设备树某个节点配错了,或者某个电源域没使能。这个坑,配置过T113、K230、泰山派这些板子的兄弟应该都有体会。特别是并行的总线和I2C挂多个设备时,地址冲突也不少见,测I2C时先扫地址,能省掉很多无效排查。

现象常见根因排查方法
串口完全无输出串口线接反/波特率错误/启动模式不对检查接线、波特率、启动拨码
上电后电流异常大电源短路/电容焊反万用表蜂鸣档测VCC与GND
启动卡在DDR initDDR参数与颗粒不匹配核对DDR型号与U-Boot配置
内核启动后乱码电压不稳/晶振虚焊示波器测纹波与时钟波形
外设枚举不到设备树配置错误/电源域未使能i2cdetect/lsusb逐层排查

6. 硬件验证报告与经验沉淀

6.1 一份可用的验证报告该怎么写

验证做完不算完,一份结构清晰的验证报告能让后续开发少走无数弯路。我的报告骨架一般是:板卡信息(硬件版本、主控型号、DDR/Flash型号、固件版本)→验证环境(工具、设备、软件版本)→验证项目列表→每项结果与日志截图→发现的问题及根因分析→下一步建议。

报告里最重要的不是“通过了”三个字,而是环境描述。比如“DDR压测通过”,必须说明是在什么温度、什么频率、跑了几轮、用的什么工具,否则这个结论无法复现,对后面的开发没有参考价值。我在写报告时会附上完整的串口日志文件路径和关键命令输出,这样即使几个月后有人翻出这份报告,也能清楚地知道当时测了什么、怎么测的、结果怎么样。

6.2 一些踩过的坑和个人心得

最后分享几个我在验证达芬奇Pro这类开发板时总结出来的经验。

第一,验证过程中一定要做好记录。哪怕只是改了设备树里的一个GPIO复用,也要记下来,不然很容易出现“明明昨天还好好的,今天突然点不亮了”的情况,最后发现是改崩了。我用最简单的Markdown表格记录每次修改,时间、文件、改动内容、验证结果,几行字就能避免很多返工。

第二,示波器是硬件验证的“眼睛”,有条件一定要配备。很多偶发问题,万用表测不出来,示波器一抓波形,真相立刻清楚。比如I2C通信偶尔失败,用逻辑分析仪看波形,可能发现是上拉电阻太大导致上升沿太慢,这种问题靠“猜”是猜不出来的。

第三,不要迷信参考设计的默认配置。每一块板子都有可能因为布局、走线、物料批次不同而存在细微差异,验证的目的就是把这些差异找出来,确认它们不会影响功能。比如同一款主控,不同批次的DDR颗粒参数可能不同,U-Boot里的配置就不能完全照搬。

提示:无论你用的是51、STM32、ESP32、T113、K230还是树莓派,硬件验证的核心思路是共通的——从电源开始,按依赖链逐层验证,遇到问题从底层往上层排查,验证结果要可复现。

我个人在实际操作中最深的一点体会是:硬件验证最考验的不是设备和技术,而是耐心和记录习惯。再高级的示波器也代替不了细致的观察,再详细的参考文档也代替不了自己对板子的亲手测量。把每一个节点都搞清楚,后续做系统调试时,才能真正少一些“那种玄学问题”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询