在前段时间调试过程中碰到了一个现象记录一下,方便日后查找。
问题现象
如下,程序没有跑起来,进入DEBUG界面后停止程序运行,程序停留在了"Disassembly"中。
起因及初步排查
起因是我在测试DAC的功能是突然DAC的输出低了30dBm,但DAC发的波形还是正常的。我以为是板子太烫了,后我关电重新烧程序,这时电流起不来了,而且串口也没有打印信息,然后我进DEBUG界面发现程序一直停留在Disassembly,即程序没有进入main函数;这时,我以为是我不小心改了某些东西导致程序出错,然后我拿来一块相同的板子烧写程序,这块板子能正常启动,所以排除了程序的问题;后来想可能某些地方损坏了,一般有有损坏部分会存在大量大热的情况,我摸了一下板子,没有发现有特别烫的地方;后来在网上搜索解决方法,但网上有关“程序一直停留在Disassembly”的解决方法大多数的设置都是SDK的都默认设置。
原因分析
这之后我开始分析原因,有以下几种可能:
- ZYNQ的PS端或时钟芯片晶振没起振;
- 供电有问题;
- ZYNQ损坏;
- DDR损坏。
原因排查
- 首先,示波器测了ZYNQ的晶振及时钟芯片的晶振,发现都是起振了的,输出频率也是对的;
- 然后,万用表测板子的各组DC/DC输出电压,也是正常范围内。
- 之后,我怀疑ZYNQ的Core 0可能是坏了(我的程序用的是Core 0,而且程序能正常烧进去所以不太可能是整个ZYNQ坏了)后来我把程序抑制到Core 1,发现现象一致,所以判断不太可能是ZYNQ有问题。
- 也就只剩下了最后一种情况DDR有问题,由于DDR走线都是从板子内部走的,也没办法用示波器查看信号线的信号及时钟是否正常,所以准备换一个DDR再看看。
第二天我看原理图发现给DDR的还有一组单独的供电,用万用表一测发现,应该是0.75V的电压,只有0.3V了,最后检查发现是一个电容短路了,更换后,程序能正常启动了。
最后再说一句,像ZYNQ和DDR这类器件相对来说是比较稳定的一般也是不容易坏的,最有可能的就是他们外围电路损坏。