【ZYNQ杂记】Debug模式下可以运行的程序但固化后运行卡死
在开发ZYNQ 7020的时候遇到了一个非常诡异的现象:
同样的一段程序
当使用Debug下载到ZYQN板子上运行时,就可以顺利执行外设初始化并启动Free RTOS调度,执行不同的任务;
一旦程序固化到QSPI Flash中,上电运行会在一个外设初始化处卡死。
我遇到的现象是,CAN外设的初始化处卡死

经过反复断点+插入串口标志调试,最终发现程序卡在了LookUpConfig处

期间怀疑过是CAN外设的时钟不稳定,在调试模式和固化状态下,两者的运行速度不同,PLL时钟不稳定导致该情况
该问题一直折腾了一周多,反复尝试都没找到解决办法
今天偶然修改BD中ps uart0的波特率,将波特率从之前的115200修改成了128000
注意到使用Debug运行的程序,uart0的波特率为128000;但是固化到板子上之后,上电串口波特率又成了115200
联想到FSBL这类加载程序,负责初始化串口的波特率,波特率没变,应该是我的FSBL程序没有更新
导出Hareware时,又想到我的工程里有两个硬件平台
![]()
其中Platform0是很久以前的硬件版本,那会儿在BD中没有使能CAN 0,也没有对应的引脚约束
Platform1是最近新修改的,使能了PS端的CAN 0,同时添加了引脚约束
我的项目程序用的是Platform1,但是FSBL和fsbl_zynq这两处引导程序的bsp链接的硬件平台还是Platform0
而Platform0中又没有配置过CAN,所以在初始化的时候,根据CAN的ID号查找配置信息,出现了死机的情况
有了这个想法,赶紧验证一下
由于我不会将FSBL_bsp链接的Platform0重新修改到Platform1,多番尝试,最后发现可以直接修改Platform0本身指向的system_wrapper.hdf文件
修改过后,虽然FSBL_bsp还是链接的Platform0,但是此时的Platform0已经被更新了,里面是包含了CAN和CAN引脚约束的文件
再次生成固件,下载,果然固化程序跑CAN初始化时,不再死机了
问题解决
形成一个简单笔记,供遇到类似问题的人参考
